You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot 4中敌人死亡动画未播放直接执行queue_free问题求助

解决死亡动画未播放直接销毁的问题

问题根源

你的代码存在两个关键问题:

  1. 停用物理进程的方式错误——_physics_process(false)只是手动执行了一次物理帧逻辑并传入参数,并没有真正关闭物理更新,正确写法是set_physics_process(false)。
  2. 动画未播放就触发销毁,大概率是动画名称配置错误、动画未正确添加,或是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方式仍未生效,可以用定时器控制销毁时机,步骤如下:

  1. 在玩家节点下添加一个Timer节点(命名为DeathTimer),将Wait Time设置为死亡动画的时长(比如动画时长1秒就填1),并勾选One Shot选项。
  2. 替换为以下代码:
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()
  1. 在编辑器中,将Timer节点的timeout信号连接到玩家节点的_on_death_timer_timeout函数。

额外提醒

  • 确认AnimatedSprite2D节点中确实存在名为dead的动画,且帧序列配置完整。
  • 若玩家节点带有碰撞体,建议触发死亡时同步关闭碰撞($CollisionShape2D.set_deferred("disabled", true)),避免动画播放过程中触发其他碰撞事件。

内容的提问来源于stack exchange,提问作者Maximo Nova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:42:34