Godot 2D平台玩家控制器:方向动画实现与Input.get_axis参数问题
问题解决:Godot 2D玩家方向动画与Input.get_axis报错修复
核心问题分析
- Input.get_axis参数错误:代码中
Input.get_axis("ui_left")仅传入1个参数,而该方法必须接收负方向动作名和正方向动作名两个参数,这是直接报错的原因。 - 方向动画逻辑失效:没有正确利用
direction变量判断移动方向,也未关联AnimatedSprite2D的动画切换/精灵翻转逻辑。
修复后的完整代码
extends CharacterBody2D const SPEED = 300.0 const JUMP_VELOCITY = -400.0 func _physics_process(delta: float) -> void: var animated_sprite = $AnimatedSprite2D var direction := Input.get_axis("ui_left", "ui_right") # 重力处理 if not is_on_floor(): velocity += get_gravity() * delta # 跳跃时播放跳跃动画 animated_sprite.play("jump") else: # 地面状态下根据移动状态切换动画 if direction != 0: animated_sprite.play("walk") else: animated_sprite.play("default") # 跳跃处理 if Input.is_action_just_pressed("ui_accept") and is_on_floor(): velocity.y = JUMP_VELOCITY # 移动与方向控制 if direction: velocity.x = direction * SPEED # 根据方向翻转精灵(或切换对应方向动画) animated_sprite.flip_h = direction < 0 else: velocity.x = move_toward(velocity.x, 0, SPEED) move_and_slide()
关键修改说明
- 修复Input.get_axis调用错误:删除了jump判断中错误的
Input.get_axis("ui_left"),直接使用已定义的direction变量判断方向。 - 关联方向与精灵状态:通过
animated_sprite.flip_h = direction < 0实现向左移动时精灵水平翻转(如果你的动画是单方向绘制的,这是最简便的方式;如果有左右独立动画,可替换为animated_sprite.play("walk_left")或walk_right)。 - 完善动画状态切换:区分地面 idle、走路、空中跳跃三种状态的动画播放逻辑,确保动画状态与玩家行为一致。
- 优化变量引用:将
$AnimatedSprite2D赋值给变量animated_sprite,减少重复节点查找,提升性能。
额外注意事项
- 确保你的AnimatedSprite2D节点已添加对应的动画("default"、"walk"、"jump"),动画名称需与代码中一致。
- 如果使用左右独立动画,可将方向判断逻辑修改为:
if direction < 0: animated_sprite.play("walk_left") elif direction > 0: animated_sprite.play("walk_right")
内容的提问来源于stack exchange,提问作者Liam Briley
相关产品推荐
相关产品推荐

