Godot 4中敌人死亡动画未播放直接执行queue_free问题求助
解决死亡动画未播放直接销毁的问题
问题根源
你的代码存在两个关键问题:
- 停用物理进程的方式错误——
_physics_process(false)只是手动执行了一次物理帧逻辑并传入参数,并没有真正关闭物理更新,正确写法是set_physics_process(false)。 - 动画未播放就触发销毁,大概率是动画名称配置错误、动画未正确添加,或是
await的信号监听逻辑有疏漏。
方案一:修复原逻辑(推荐)
直接修正代码错误,确保动画完整播放后再销毁节点:
func _on_area_2d_area_entered(area): # 正确关闭物理进程 set_physics_process(false) if area.is_in_group("enemies"): var anim_sprite = $AnimatedSprite2D # 先检查动画是否存在,避免运行报错 if anim_sprite.has_animation("dead"): anim_sprite.play("dead") # 等待动画播放完成的信号 await anim_sprite.animation_finished queue_free()
方案二:用Timer节点兜底
如果await方式仍未生效,可以用定时器控制销毁时机,步骤如下:
- 在玩家节点下添加一个Timer节点(命名为
DeathTimer),将Wait Time设置为死亡动画的时长(比如动画时长1秒就填1),并勾选One Shot选项。 - 替换为以下代码:
func _on_area_2d_area_entered(area): set_physics_process(false) if area.is_in_group("enemies"): $AnimatedSprite2D.play("dead") # 启动定时器 $DeathTimer.start() # 定时器超时后执行销毁 func _on_death_timer_timeout(): queue_free()
- 在编辑器中,将Timer节点的
timeout信号连接到玩家节点的_on_death_timer_timeout函数。
额外提醒
- 确认
AnimatedSprite2D节点中确实存在名为dead的动画,且帧序列配置完整。 - 若玩家节点带有碰撞体,建议触发死亡时同步关闭碰撞(
$CollisionShape2D.set_deferred("disabled", true)),避免动画播放过程中触发其他碰撞事件。
内容的提问来源于stack exchange,提问作者Maximo Nova
相关产品推荐
相关产品推荐

