从零开始的 Godot 之旅 — EP5:控制角色移动

从零开始的 Godot 之旅 --- EP5:控制角色移动

上一节我们认识了 Godot 的工作区,并尝试手动修改节点的 position 属性来改变角色位置。本节目标:让角色真正"动"起来,并建立一个可复用的输入与移动基础框架。

目标概览

  1. 配置键盘输入(输入映射)
  2. 给角色节点挂载脚本
  3. 在脚本中读取输入并计算方向
  4. 基于方向更新角色 position,实现上下左右移动
  5. 简单优化:避免帧率依赖、改进可读性

1. 输入映射(Input Map)

我们首先要接收键盘输入。好消息是:不需要自己写底层代码去监听操作系统事件,Godot 已经封装好了。我们只需要"声明"有哪些动作(Action),并把它们与键盘按键对应起来。

步骤:

  1. 菜单:项目 → 项目设置(Project → Project Settings)
  2. 切换到"输入映射"(Input Map)选项卡
  3. 在上方"动作"输入框中依次输入:up、down、left、right,每打一项点击"添加"
  4. 动作出现在列表后,点击后面的"+"给它绑定按键
  5. 在弹出的对话框里直接按目标键(例如 W),或从下方类别中选择
  6. 确认后即可看到绑定成功
  7. 依次为: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!

相关推荐
Behavior1 小时前
16天,他用Opus 5.5把《小王子》做成3D游戏,书里的星球能逛了
aigc·unity3d·游戏开发
SmalBox8 小时前
06-03-源码-下载系统(DownloadSystem)
unity3d·游戏开发
SmalBox1 天前
06-02-源码-内置文件系统实现
unity3d·游戏开发
SmalBox2 天前
06-01-源码-文件系统体系(IFileSystem)
unity3d·游戏开发
狗凯之家源码网2 天前
H5 棋牌对战系统源码深度评测与实战分析
php·游戏开发
Oiiouui2 天前
Godot-GridGame架构逻辑层与实体/物品层篇
架构·游戏引擎·godot
坐吃山猪3 天前
Godot01-初体验
godot·1024程序员节
SmalBox3 天前
05-08-源码-缓存系统与内存管理
unity3d·游戏开发
Oiiouui3 天前
针对Godot-GridGame(网格游戏)的DI注入+RefCounted数据驱动信号流架构设计的研究(全程开源)
游戏·游戏引擎·godot·1024程序员节
Oiiouui3 天前
Godot-GridGame架构数据层篇
架构·godot·1024程序员节