从零开始的 Godot 之旅 --- EP5:控制角色移动
上一节我们认识了 Godot 的工作区,并尝试手动修改节点的 position 属性来改变角色位置。本节目标:让角色真正"动"起来,并建立一个可复用的输入与移动基础框架。
目标概览
- 配置键盘输入(输入映射)
- 给角色节点挂载脚本
- 在脚本中读取输入并计算方向
- 基于方向更新角色 position,实现上下左右移动
- 简单优化:避免帧率依赖、改进可读性

1. 输入映射(Input Map)
我们首先要接收键盘输入。好消息是:不需要自己写底层代码去监听操作系统事件,Godot 已经封装好了。我们只需要"声明"有哪些动作(Action),并把它们与键盘按键对应起来。
步骤:
- 菜单:项目 → 项目设置(Project → Project Settings)
- 切换到"输入映射"(Input Map)选项卡
- 在上方"动作"输入框中依次输入:
up
、down
、left
、right
,每打一项点击"添加"
- 动作出现在列表后,点击后面的"+"给它绑定按键
- 在弹出的对话框里直接按目标键(例如 W),或从下方类别中选择
- 确认后即可看到绑定成功
- 依次为:
up -> W
、down -> S
、left -> A
、right -> D
完成绑定
小提示:
一个 Action 可以绑定多个按键(比如同时支持 方向键 和 WASD),Godot 会把它们视为同一"动作"。
2. 给角色添加脚本
选中角色对应的 Sprite2D
(或其它精灵节点),右键 → "附加脚本"(或点击右上角脚本图标)。
在弹出的窗口中设置脚本名称与路径,例如命名为 player.gd
,放在项目根目录:
创建后即可在脚本编辑器中看到:
3. 读取输入:认识 _process
与 Input.get_action_strength()
如果还不熟悉 GDScript,可以先浏览官方交互教程:GDScript 教程
我们使用 _process(delta)
来每帧执行逻辑:
php
func _process(delta: float) -> void:
var position_y: float = Input.get_action_strength("down")
print("y轴的值:", position_y)
解释:
_process
每帧调用一次(和屏幕刷新率相关)Input.get_action_strength(action_name)
会返回一个 0.0~1.0 的浮点数。对于普通按键:未按=0,按下=1;对于支持压感/模拟轴的输入设备可得到中间值。
运行后,按下 S
(绑定到 down
)即可在输出面板看到从 0 变为 1:
4. 组合上下输入并移动
上下两个方向是互斥的,我们可以用:向下力度 - 向上力度 得到一个范围在 [-1, 1] 的数值:
php
func _process(delta: float) -> void:
var move_y: float = Input.get_action_strength("down") - Input.get_action_strength("up")
print("y轴的值:", move_y)
position.y += move_y
现在:
- 按
W
->move_y
= -1 → 向上移动 - 按
S
->move_y
= 1 → 向下移动 - 同时按
W
+S
-> 1 - 1 = 0 → 抵消,不动

5. 加入左右方向,形成二维移动
扩展同样的逻辑:
java
func _process(delta: float) -> void:
var move_y: float = Input.get_action_strength("down") - Input.get_action_strength("up")
position.y += move_y
var move_x: float = Input.get_action_strength("right") - Input.get_action_strength("left")
position.x += move_x
运行即可看到角色四向移动:
总结
本节你已经掌握:
- 使用输入映射(Input Map)配置键盘动作
- 给节点挂载脚本并编写
_process(delta)
- 利用
Input.get_action_strength
获得方向输入(0 或 1) - 通过上下/左右差值组合成 [-1,1] 方向数值
- 基于方向更新
position
实现基础四方向移动 - 使用
delta
与速度常量让移动与帧率解耦 - 简单了解向量归一化的意义(避免斜向更快)
下一节:我们将用更"专业"的方式来实现角色移动:引入
CharacterBody2D
、velocity
、move_and_slide()
等,更优雅地处理碰撞与物理行为。
敬请期待 EP6!