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
相关产品推荐
相关产品推荐

