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

Godot 2D:播放动画后如何从场景中移除CharacterBody2D?

解决角色死亡动画无限循环并移除的问题

核心问题排查与修复

1. 检查死亡动画的循环设置

打开Godot编辑器中你的AnimatedSprite2D节点的动画库,找到名为death的动画:

  • 确保循环(Loop)选项处于关闭状态。如果动画本身设置为循环,即使调用anim.play("death")也会无限重复,导致await anim.animation_finished永远不会触发,角色无法被销毁。

2. 避免死亡逻辑重复触发

玩家在DeathDetector区域内停留时,body_entered事件可能会被多次触发,导致death()函数重复执行,打乱动画等待逻辑。修改代码如下:

修改_on_death_detector_body_entered函数:

func _on_death_detector_body_entered(body):
    if body.name == "Player" and alive:  # 仅当角色存活时触发死亡逻辑
        body.velocity.y -= 50
        death()

优化death函数:

func death():
    alive = false
    # 禁用死亡检测器,彻底避免重复触发
    $DeathDetector.monitoring = false
    # 停止角色移动,避免动画播放时角色继续移动
    velocity.x = 0
    velocity.y = 0
    anim.play("death")
    await anim.animation_finished
    queue_free()

3. 完善物理进程中的死亡状态处理

在_physics_process中,当角色死亡后,确保不再处理移动和动画切换逻辑,同时可以停止重力影响(根据需求选择):

func _physics_process(delta):
    if not is_on_floor() and alive:  # 仅存活时应用重力
        velocity.y += gravity * delta
    var player = $"../../Player"
    var direction = (player.position - self.position).normalized()
    if alive == true:
        if chase == true:
            velocity.x = direction.x * speed
            anim.play("run")
        else:
            velocity.x = 0
            anim.play("idle")
        if direction.x < 0:
            anim.flip_h = true
        else:
            anim.flip_h = false
    else:
        velocity.x = 0
        velocity.y = 0  # 可选:如果不需要死亡后角色下落,保留此行
        
    move_and_slide()

验证效果

完成以上修改后,测试玩家进入DeathDetector区域:

  • 角色会播放一次死亡动画,动画结束后自动从场景中移除
  • 不会出现动画无限循环或重复触发死亡逻辑的问题

内容的提问来源于stack exchange,提问作者Sin nombre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:43:22