extends Node3D class_name Effect @onready var afterimage: PackedScene = preload("res://scene/effect/afterimage/normal.tscn") @onready var corpse: PackedScene = preload("res://scene/effect/afterimage/normal.tscn") @onready var readiness_hero: PackedScene = preload("res://scene/effect/readiness/readiness_hero.tscn") @onready var readiness_monster: PackedScene = preload("res://scene/effect/readiness/readiness_monster.tscn") @onready var readiness_bullet: PackedScene = preload("res://scene/effect/readiness/readiness_bullet.tscn") @onready var character: Character = (get_owner() as Character) @onready var view: View = (%View as View) @onready var status: Status = (%Status as Status) var rediness: Decal var is_pause: bool var is_right: bool var temp_release_particle_list: Array[Variant] = [] func particle_list() -> Array[Variant]: var ret: Array[Variant] = [] for child in get_children(): if child is Particle: ret.append(child) return ret func init(type: Enum.ECharacterType): match type: Enum.ECharacterType.Player: rediness = readiness_hero.instantiate() Enum.ECharacterType.Monster: rediness = readiness_monster.instantiate() Enum.ECharacterType.Bullet: rediness = readiness_bullet.instantiate() if rediness: add_child(rediness) func set_body_scale(body_scale: Vector3): if rediness: rediness.scale = body_scale *2.2 rediness.scale.y = 10 rediness.position = Vector3.DOWN * 4 func _process(delta): #指针方向 if status.move_dir: var angle: float = status.move_dir.angle_to(Vector2.RIGHT) rediness.rotation.y = angle #flip if is_right != status.is_right: is_right = status.is_right for particle: Particle in particle_list(): particle.scale.x = abs(particle.scale.x) * (1 if is_right else -1) #pause if is_pause != status.is_pause: is_pause = status.is_pause var ret: Array[Variant] = particle_list() for particle: Particle in ret: particle.set_pause(is_pause) if !is_pause: for particle: Particle in temp_release_particle_list: _release_effect(particle) temp_release_particle_list.clear() func cast_image(res: Resource): var new_afterimage: Afterimage = afterimage.instantiate() as Afterimage new_afterimage.position = character.view_pos() new_afterimage.name = "afterimage" new_afterimage.velocity = character.velocity / 4 new_afterimage.target = view SignalManager.effect_create.emit(new_afterimage) func cast_after_image(): cast_image(afterimage) func cast_corpse(): cast_image(corpse) func cast_particle(resource: Resource, is_attach: bool, offset: Vector3, scale: Vector3): _cast_particle(resource, is_attach, offset, scale) func cast_attack_particle1(): _cast_attack_particle(1, true) func cast_attack_particle1_release(): _cast_attack_particle(1, false) func cast_attack_particle2(): _cast_attack_particle(2, true) func cast_attack_particle2_release(): _cast_attack_particle(2, false) func cast_self_particle() -> void: if !status.cfg: return var particle: Resource = status.cfg.get_particle() if !particle: return _cast_particle(particle, true, Vector3.ZERO, Vector3.ZERO) func _cast_attack_particle(index: int, is_attach: bool) -> void: if !status.skill_cfg: return var attack_particle: Resource = status.skill_cfg.get_attack_particle(index) if !attack_particle: print("未配置技能攻击特效:", status.skill_cfg.resource_path) return _cast_particle(attack_particle, is_attach, Vector3.ZERO, Vector3.ZERO) func _cast_particle(resource: Resource, is_attach: bool, offset: Vector3, scale: Vector3) -> void: if !resource: print("未配置技能特效") return var new_particle: Particle = resource.instantiate() as Particle new_particle.name = "particle" var angle: float = Util.dir_angle(status.skill_dir) new_particle.rotation.y = angle if is_right else -angle if scale: new_particle.scale = scale new_particle.scale.x = abs(new_particle.scale.x) * (1 if is_right else -1) if offset: new_particle.position = offset else: new_particle.position = status.basic_offset add_child(new_particle) if !is_attach: temp_release_particle_list.append(new_particle) func release_effect(): for particle: Particle in particle_list(): _release_effect(particle) temp_release_particle_list.clear() func _release_effect(particle: Particle): var pos: Vector3 = particle.get_global_position() particle.set_pause(false) particle.position = pos remove_child(particle) SignalManager.effect_create.emit(particle)