Godot 4中跳跃动画无法正常运行的问题排查求助
跳跃动画无法触发的问题解决
你的跳跃动画无法运行,核心是动画触发的逻辑顺序和状态判断存在问题:
- 当前代码中,跳跃动画的判断在左右移动逻辑之后,按下跳跃键的同时若按住方向键,会优先执行移动动画播放,直接跳过跳跃动画的触发。
Input.is_action_just_pressed仅在按键按下的第一帧返回true,若这一帧被移动逻辑抢占,跳跃动画就不会被触发。- 角色离开地面后,若非循环的跳跃动画播放完毕,会进入else分支播放Idle,不符合空中状态的动画逻辑。
修改后的代码
func _input(event): if Input.is_action_pressed("light plus"): LIGHTLVL.light_energy += 0.1 if Input.is_action_pressed("light minus"): LIGHTLVL.light_energy -= 0.1 if LIGHTLVL.light_energy > 1: LIGHTLVL.light_energy = 1 if LIGHTLVL.light_energy < 0: LIGHTLVL.light_energy = 0 func _physics_process(delta): # 添加重力 if not is_on_floor(): velocity.y -= gravity * delta # 处理跳跃并记录触发状态 var jumped = Input.is_action_just_pressed("ui_accept") and is_on_floor() if jumped: velocity.y = JUMP_VELOCITY # 获取输入方向并处理移动/减速 var input_dir = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if direction: velocity.x = direction.x * SPEED else: velocity.x = move_toward(velocity.x, 0, SPEED) # 优先处理跳跃动画 if jumped: $AnimatedSprite2D.play("Jump") # 其次处理移动动画 elif Input.is_action_pressed("ui_right"): $AnimatedSprite2D.play("Walk") $AnimatedSprite2D.flip_h = 0 elif Input.is_action_pressed("ui_left"): $AnimatedSprite2D.play("Walk") $AnimatedSprite2D.flip_h = 1 # 仅在地面且无动画播放时切换Idle else: if is_on_floor() and !$AnimatedSprite2D.is_playing(): $AnimatedSprite2D.play("Idle") move_and_slide()
修改说明
- 调整动画判断顺序:将跳跃动画触发逻辑放在最前面,确保按下跳跃键时优先执行,不会被移动逻辑覆盖。
- 复用跳跃状态变量:用
jumped存储跳跃触发状态,避免重复判断相同条件,提升代码可读性。 - 优化Idle触发条件:只有角色在地面且当前无动画播放时,才切换到Idle,避免在空中时跳跃动画播放完毕后错误切回Idle。
额外检查点
- 确认
AnimatedSprite2D的动画列表中存在准确名为"Jump"的动画,且帧序列设置正确。 - 再次确认跳跃动画的播放模式为非循环,且动画时长足够覆盖跳跃过程。
内容的提问来源于stack exchange,提问作者MKMysteryKey
相关产品推荐
相关产品推荐

