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

Godot 2D平台角色滑行动画结束后停止动画并恢复速度的实现方法

Godot 2D平台角色滑行动画结束后恢复速度与状态的解决方案

要实现滑行动画结束后自动恢复速度并切换回正常动画,核心是监听AnimationPlayer的动画结束信号,在信号回调里处理状态重置,同时调整原有输入逻辑避免冲突。

步骤1:监听AnimationPlayer的动画结束信号

你可以通过两种方式连接信号:

  • 在Godot编辑器中,选中AnimationPlayer节点,在信号面板找到animation_finished,连接到角色脚本的自定义函数(比如_on_animation_finished)。
  • 或者在脚本的_ready()函数里手动连接:
func _ready():
    $AnimationPlayer.connect("animation_finished", self, "_on_animation_finished")

步骤2:编写动画结束处理函数

在角色脚本中添加处理函数,判断结束的动画是否为滑行动画,若是则重置速度并切换回正常动画:

func _on_animation_finished(animation_name):
    # 当滑行动画播放结束时
    if animation_name == "slide":
        SPEED = 120.0  # 恢复默认移动速度
        # 根据当前是否有方向输入切换动画
        var direction = Input.get_axis("left", "right")
        if direction != 0:
            $AnimatedSprite.play("run")
            $AnimationPlayer.play("RESET")
        else:
            $AnimatedSprite.play("default")

步骤3:调整原有输入逻辑,避免冲突

添加is_sliding状态变量标记当前是否处于滑行动画播放中,防止输入逻辑干扰状态:

# 脚本顶部定义状态变量
var is_sliding = false

func _process(delta):
    var direction = Input.get_axis("left", "right")

    if direction > 0:
        $AnimatedSprite.flip_h = false
    elif direction < 0:
        $AnimatedSprite.flip_h = true

    if direction == 0:
        if not is_sliding:
            $AnimatedSprite.play('default')
    else:
        if Input.is_action_pressed("slide") and not is_sliding:
            $AnimatedSprite.play("slide")
            $AnimationPlayer.play("slide")
            SPEED = 150.0
            is_sliding = true  # 标记进入滑行状态
        elif not is_sliding:
            $AnimatedSprite.play("run")
            $AnimationPlayer.play("RESET")
            SPEED = 120.0

    # 移动逻辑保持不变
    if direction:
        velocity.x = direction * SPEED
    else:
        velocity.x = move_toward(velocity.x, 0, SPEED)

    velocity = move_and_slide(velocity, Vector2.UP)

最后在动画结束函数里更新is_sliding状态:

func _on_animation_finished(animation_name):
    if animation_name == "slide":
        SPEED = 120.0
        is_sliding = false  # 退出滑行状态
        var direction = Input.get_axis("left", "right")
        if direction != 0:
            $AnimatedSprite.play("run")
            $AnimationPlayer.play("RESET")
        else:
            $AnimatedSprite.play("default")

修改后,滑行动画播放完毕会自动触发状态重置,恢复默认速度并切换到合适的动画,同时避免输入逻辑在滑行过程中打断状态。

内容的提问来源于stack exchange,提问作者Owen Uhl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:50:04