diff --git a/script/character/buff.gd b/script/character/buff.gd index 4ea9a10..fba277c 100644 --- a/script/character/buff.gd +++ b/script/character/buff.gd @@ -155,7 +155,7 @@ func on_update_shield_recover(_rate) -> void: character.set_shield(status.shield + shield_add) -func on_end_mp_recover_cd(_rate) -> void: add_buff("mp_recover", -1) +func on_end_mp_recover_cd(_rate) -> void: add_buff("mp_recover", 0.1) func on_update_mp_recover(_rate) -> void: diff --git a/script/character/effect.gd b/script/character/effect.gd index 0349b6b..5487530 100644 --- a/script/character/effect.gd +++ b/script/character/effect.gd @@ -39,10 +39,10 @@ func init(type: Enum.ECharacterType): func set_body_scale(body_scale: Vector3): if rediness: - rediness.scale = body_scale *2.2 + rediness.scale = body_scale * 2.2 rediness.scale.y = 10 rediness.position = Vector3.DOWN * 4 - lock.scale = body_scale *2.2 + lock.scale = body_scale * 2.2 lock.scale.y = 10 lock.position = Vector3.DOWN * 4 @@ -62,7 +62,7 @@ func _process(delta) -> void: 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) + 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 @@ -127,7 +127,10 @@ func _cast_attack_particle(index: int, is_attach: bool) -> void: _cast_particle(attack_particle, is_attach, Vector3.ZERO, Vector3.ZERO) -func _cast_particle(resource: Resource, is_attach: bool, offset: Vector3, scale: Vector3) -> void: +func _cast_particle(resource: Resource, is_attach: bool, offset: Vector3, effect_scale: Vector3) -> void: + if not is_attach: + Global.effect_mgr.cast_particle(resource, character.pos() + offset + status.basic_offset, Vector3.ZERO, effect_scale) + return if !resource: print("未配置技能特效") return @@ -136,8 +139,8 @@ func _cast_particle(resource: Resource, is_attach: bool, offset: Vector3, scale: if not new_particle.is_billboard: 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 + if effect_scale: + new_particle.scale = effect_scale new_particle.scale.x = abs(new_particle.scale.x) * (1 if is_right else -1) if offset: new_particle.position = offset @@ -145,8 +148,6 @@ func _cast_particle(resource: Resource, is_attach: bool, offset: Vector3, scale: if not new_particle.is_ground: new_particle.position = status.basic_offset add_child(new_particle) - if !is_attach: - _release_effect(new_particle) func release_effect(): diff --git a/script/character/skill.gd b/script/character/skill.gd index 984df8d..95fb6aa 100644 --- a/script/character/skill.gd +++ b/script/character/skill.gd @@ -174,7 +174,7 @@ func cast_skill(cfg: SkillCfg, cast_dir: Vector2, action_key: String = "") -> vo var animation_name: String = "animation_library/%s" % cfg.get_res_name() play(animation_name, -1, Setting.animation_speed_scale) - seek(0.05, true, true) + seek(0, true, true) battle.on_skill_cast(cfg.get_res_name()) diff --git a/script/effect/effect_base.gd b/script/effect/effect_base.gd index 0771141..7cb6dcf 100644 --- a/script/effect/effect_base.gd +++ b/script/effect/effect_base.gd @@ -2,11 +2,15 @@ extends Node3D class_name EffectBase @export var lifetime: float = 1 +@export var is_billboard: bool +@export var is_ground: bool +var resource_name: String var lifetime_now: float var is_pause: bool = false var rate: float +signal effect_destroy(resource_name: String) func _ready(): on_ready() @@ -24,6 +28,7 @@ func _process(delta) -> void: return lifetime_now -= delta if lifetime_now <= 0: + effect_destroy.emit(resource_name) queue_free() return rate = lifetime_now / lifetime diff --git a/script/effect/particle.gd b/script/effect/particle.gd index 9657767..448b980 100644 --- a/script/effect/particle.gd +++ b/script/effect/particle.gd @@ -1,8 +1,6 @@ extends EffectBase class_name Particle -@export var is_billboard: bool -@export var is_ground: bool var particle_list: Array[GPUParticles3D] = [] var particle_speed_scale_list: Array[float] = [] diff --git a/script/item/pt.gd b/script/item/pt.gd index 3611fda..deb12f6 100644 --- a/script/item/pt.gd +++ b/script/item/pt.gd @@ -106,5 +106,5 @@ func collect() -> void: Enum.EPtType.HP: target.add_hp(value) Enum.EPtType.MP: target.add_mp_sub(value, true) _: pass - target.cast_particle(ResourceManager.particle_pt_collect, true) + target.cast_particle(ResourceManager.particle_pt_collect, false) Global.item_mgr.destroy_pt(self) diff --git a/script/manager/effect_manager.gd b/script/manager/effect_manager.gd index 29054b0..c97054e 100644 --- a/script/manager/effect_manager.gd +++ b/script/manager/effect_manager.gd @@ -1,22 +1,38 @@ extends Node3D class_name EffectManager +var effect_count_max: int = 10 +var effect_count_dict: Dictionary = {} + func _ready(): Global.effect_mgr = self SignalManager.effect_create.connect(on_effect_create) - func on_effect_create(effect: Node3D): add_child(effect) -func cast_particle(resource: Resource, pos: Vector3, direction = Vector3.UP) -> void: - var new_particle: Particle = resource.instantiate() as Particle - add_child(new_particle) - new_particle.position = pos - if direction.abs().angle_to(Vector3.RIGHT) < 0.01: - direction.z = 0.1 - if direction.angle_to(Vector3.UP) > 0.01 and (-direction).angle_to(Vector3.UP) > 0.01: - new_particle.look_at(pos - direction) - else: - new_particle.rotation.x = deg_to_rad(-90) +func cast_particle(resource: Resource, pos: Vector3, direction = Vector3.ZERO, effect_scale: Vector3 = Vector3.ZERO) -> void: + var resource_name = resource.resource_path + if not resource_name in effect_count_dict: + effect_count_dict[resource_name] = 0 + if effect_count_dict[resource_name] >= effect_count_max: + return + var new_effect: EffectBase = resource.instantiate() as EffectBase + new_effect.resource_name = resource_name + new_effect.effect_destroy.connect(_on_effect_destroy) + effect_count_dict[resource_name] += 1 + add_child(new_effect) + new_effect.position = pos + if direction: + if direction.abs().angle_to(Vector3.RIGHT) < 0.01: + direction.z = 0.1 + if direction.angle_to(Vector3.UP) > 0.01 and (-direction).angle_to(Vector3.UP) > 0.01: + new_effect.look_at(pos - direction) + else: + new_effect.rotation.x = deg_to_rad(-90) + if effect_scale: + new_effect.scale = effect_scale + +func _on_effect_destroy(resource_name) -> void: + effect_count_dict[resource_name] -= 1 diff --git a/script/ui/hud/headbar.gd b/script/ui/hud/headbar.gd index 324b7bf..7d515f5 100644 --- a/script/ui/hud/headbar.gd +++ b/script/ui/hud/headbar.gd @@ -14,10 +14,12 @@ class_name Headbar @onready var pos_lable: Label = (%PosLabel as Label) @onready var role_lable: Label = (%RoleLabel as Label) +var is_show_debug_info: bool func set_debug_info_show(is_show: bool) -> void: + is_show_debug_info = is_show var debug_info: Control = (%DebugInfo as Control) - debug_info.visible = is_show + debug_info.visible = is_show_debug_info func set_length(hp: float) -> void: @@ -70,28 +72,44 @@ func on_ai_alert_changed(value): alert_bar.visible = value > 0 -func on_stun_changed(value): stun_bar.value = value +func on_stun_changed(value): + if is_show_debug_info: + stun_bar.value = value -func on_stun_max_changed(value): stun_bar.max_value = value +func on_stun_max_changed(value): + if is_show_debug_info: + stun_bar.max_value = value -func on_mp_changed(value): mp_bar.value = value +func on_mp_changed(value): + if is_show_debug_info: + mp_bar.value = value -func on_mp_max_changed(value): mp_bar.max_value = value +func on_mp_max_changed(value): + if is_show_debug_info: + mp_bar.max_value = value -func on_mp_sub_changed(value): mp_sub_bar.value = value +func on_mp_sub_changed(value): + if is_show_debug_info: + mp_sub_bar.value = value -func on_mp_sub_max_changed(value): mp_sub_bar.max_value = value +func on_mp_sub_max_changed(value): + if is_show_debug_info: + mp_sub_bar.max_value = value -func on_pos2d_changed(value): pos_lable.text = "(%.2f,%.2f)"%[value.x, value.y] +func on_pos2d_changed(value): + if is_show_debug_info: + pos_lable.text = "(%.2f,%.2f)"%[value.x, value.y] -func on_ai_role_changed(value): role_lable.text = str(value) +func on_ai_role_changed(value): + if is_show_debug_info: + role_lable.text = str(value) func on_hit_text(value: String):