81 lines
1.5 KiB
GDScript3
81 lines
1.5 KiB
GDScript3
|
|
class_name CPUVFXTemplate extends CPUParticles2D
|
||
|
|
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## 播放模式
|
||
|
|
## =========================
|
||
|
|
enum PlayMode {
|
||
|
|
##播放一次
|
||
|
|
ONLY_ONCE,
|
||
|
|
##永久播放
|
||
|
|
INFINITE,
|
||
|
|
##播放固定次数
|
||
|
|
FIXED_TIMES
|
||
|
|
}
|
||
|
|
|
||
|
|
##可选择的播放模式
|
||
|
|
@export var play_mode: PlayMode = PlayMode.ONLY_ONCE
|
||
|
|
|
||
|
|
## 仅在 FIXED_TIMES 模式下生效
|
||
|
|
@export var fixed_times: int = 1
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## 内部状态
|
||
|
|
## =========================
|
||
|
|
var _played_times: int = 0
|
||
|
|
var _life_timer: float = 0.0
|
||
|
|
var _playing: bool = false
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## 生命周期
|
||
|
|
## =========================
|
||
|
|
func _ready() -> void:
|
||
|
|
_play()
|
||
|
|
|
||
|
|
func _process(delta: float) -> void:
|
||
|
|
if not _playing:
|
||
|
|
return
|
||
|
|
|
||
|
|
match play_mode:
|
||
|
|
PlayMode.ONLY_ONCE:
|
||
|
|
_update_only_once(delta)
|
||
|
|
|
||
|
|
PlayMode.FIXED_TIMES:
|
||
|
|
_update_fixed_times(delta)
|
||
|
|
|
||
|
|
PlayMode.INFINITE:
|
||
|
|
pass # 什么都不用做
|
||
|
|
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## 播放控制
|
||
|
|
## =========================
|
||
|
|
func _play() -> void:
|
||
|
|
emitting = true
|
||
|
|
_playing = true
|
||
|
|
_life_timer = 0.0
|
||
|
|
_played_times = 0
|
||
|
|
|
||
|
|
|
||
|
|
func stop_and_free() -> void:
|
||
|
|
emitting = false
|
||
|
|
queue_free()
|
||
|
|
|
||
|
|
|
||
|
|
## =========================
|
||
|
|
## 模式逻辑
|
||
|
|
## =========================
|
||
|
|
func _update_only_once(delta: float) -> void:
|
||
|
|
_life_timer += delta
|
||
|
|
if _life_timer >= lifetime:
|
||
|
|
stop_and_free()
|
||
|
|
|
||
|
|
func _update_fixed_times(delta: float) -> void:
|
||
|
|
_life_timer += delta
|
||
|
|
if _life_timer >= lifetime:
|
||
|
|
_played_times += 1
|
||
|
|
_life_timer = 0.0
|
||
|
|
|
||
|
|
if _played_times >= fixed_times:
|
||
|
|
stop_and_free()
|