从零开始的 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. 在上方"动作"输入框中依次输入:updownleftright,每打一项点击"添加"
  4. 动作出现在列表后,点击后面的"+"给它绑定按键
  5. 在弹出的对话框里直接按目标键(例如 W),或从下方类别中选择
  6. 确认后即可看到绑定成功
  7. 依次为:up -> Wdown -> Sleft -> Aright -> D 完成绑定

小提示:

一个 Action 可以绑定多个按键(比如同时支持 方向键 和 WASD),Godot 会把它们视为同一"动作"。

2. 给角色添加脚本

选中角色对应的 Sprite2D(或其它精灵节点),右键 → "附加脚本"(或点击右上角脚本图标)。

在弹出的窗口中设置脚本名称与路径,例如命名为 player.gd,放在项目根目录:

创建后即可在脚本编辑器中看到:

3. 读取输入:认识 _processInput.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 与速度常量让移动与帧率解耦
  • 简单了解向量归一化的意义(避免斜向更快)

下一节:我们将用更"专业"的方式来实现角色移动:引入 CharacterBody2Dvelocitymove_and_slide() 等,更优雅地处理碰撞与物理行为。

敬请期待 EP6!

相关推荐
陈尕六4 天前
从零开始的 Godot 之旅 — EP4:工作区基础操作与检查器初识
godot·游戏开发
倔强的石头_4 天前
一段奇遇的开始:当一名游戏开发者决定“氪金”升级装备
游戏开发
UWA4 天前
游戏在高负载场景下,整机功耗控制在多少
游戏·unity·性能优化·游戏开发
新石器程序员5 天前
借鉴bevy实现适用于Godot-rust的状态管理
rust·游戏引擎·godot·bevy
gopyer5 天前
180课时吃透Go语言游戏后端开发5:Go语言中的条件语句
golang·go·游戏开发·条件语句
陈尕六6 天前
从零开始的 Godot 之旅 — EP3:Hello World
godot
~央千澈~9 天前
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
游戏开发
相与还9 天前
【2D横版游戏开发】godot实现tileMap地图
android·游戏引擎·godot