输入系统与控制逻辑
🎯 学完你将掌握:
- 如何使用 Input Map 定义自定义动作
- 如何用 C# 处理玩家输入
- 如何实现角色:
- ✅ 左右移动
- ✅ 跳跃
- ✅ 冲刺(拓展)
- ✅ 攻击(拓展)
- 如何通过代码控制动画状态(基础)
1️⃣ 设置输入映射(Input Map)
打开:项目→项目设置→ 输入映射名称→绑定事件 依次添加这些自定义动作名:
动作名 | 推荐绑定键 |
---|---|
move_left | A / ← |
move_right | D / → |
jump | Space / ↑ / W |
attack | J / Ctrl |
sprint | Shift |
该页面按动键盘即可绑定
2️⃣ 角色节点结构(最小结构)
我们仅用 3 个节点 完成控制逻辑:
Main (Node2D) # 游戏主节点
├── Player (CharacterBody2D) # 玩家角色
│ ├── Sprite2D # 玩家外观图像
│ └── CollisionShape2D # 玩家碰撞体(矩形)
└── Ground (StaticBody2D) # 地面
└── CollisionShape2D # 地面碰撞体(WorldBoundaryShape2D)
🧱 节点说明
🟦 Player 角色
- 使用
CharacterBody2D
可实现自定义移动和重力控制 - 搭配
MoveAndSlide()
使用,支持:IsOnFloor()
落地检测Velocity
控制方向和速度
- 子节点:
Sprite2D
用于显示角色图像CollisionShape2D
使用RectangleShape2D
作为基础碰撞体
🟫 Ground 地面
- 使用
StaticBody2D
表示不可移动的地面 - 碰撞体选择
WorldBoundaryShape2D
,形成一条无限的水平边界线
✅ 使用
WorldBoundaryShape2D
可快速构建一个“无限延伸”的地面,非常适合角色在 X 轴上测试移动行为。只需将其挂载在StaticBody2D
的CollisionShape2D
上,并确保法线朝上(蓝色箭头朝上),角色即可稳定站立并自由行走,无需拼接平台。
💡 小提示:
WorldBoundaryShape2D
是无厚度的一维碰撞线,节省性能、适合测试- 法线方向朝上才能阻挡角色向下坠落
- 后期游戏中如需地形可见或有视觉表现,可替换为
TileMapLayer
+RectangleShape2D
3⃣ 创建 Player 脚本(使用模板推荐)
- 选中 Player 节点
- 点击“添加脚本”
- 选择:
- 语言:C#
- 继承:CharacterBody2D
- 模板:
CharacterBody2D: Basic Movement
📷 模板选择示意图:
4⃣ 脚本内容解析(自动生成版)
以下是使用模板 CharacterBody2D: Basic Movement
自动生成的 C# 控制脚本。它为平台类游戏角色提供了基础控制功能:重力、跳跃、左右移动。
using Godot;
using System;
public partial class Player : CharacterBody2D
{
public const float Speed = 300.0f;
public const float JumpVelocity = -400.0f;
public override void _PhysicsProcess(double delta)
{
Vector2 velocity = Velocity;
// 添加重力
if (!IsOnFloor())
{
velocity += ProjectSettings.GetSetting("physics/2d/default_gravity").AsSingle() * Vector2.Down * (float)delta;
}
// 处理跳跃
if (Input.IsActionJustPressed("ui_accept") && IsOnFloor())
{
velocity.Y = JumpVelocity;
}
// 处理左右移动
Vector2 direction = Input.GetVector("ui_left", "ui_right", "ui_up", "ui_down");
velocity.X = direction.X * Speed;
Velocity = velocity;
MoveAndSlide();
}
}
🔍 逐段解释
✅ public partial class Player : CharacterBody2D
- 类
Player
继承CharacterBody2D
,这是 Godot 为带物理控制的角色设计的节点。 partial
是 Godot 4 的必要修饰符,用于配合自动生成的 C# glue 绑定代码。
✅ Speed
与 JumpVelocity
Speed
控制水平移动速度(越大移动越快)JumpVelocity
是跳跃速度,为负值,表示向上跳(Y轴向下为正)
✅ _PhysicsProcess(double delta)
- Godot 中每帧的物理处理函数,用于更新角色速度与位置
delta
表示两帧之间的时间间隔,确保不同帧率下行为一致
⚖️ 重力逻辑
if (!IsOnFloor()) {
velocity += gravity * delta;
}
- 使用
ProjectSettings.GetSetting(...)
动态读取引擎设定的重力值 - 仅当角色未接触地面时才施加重力,防止不断下沉
🪂 跳跃处理
if (Input.IsActionJustPressed("ui_accept") && IsOnFloor()) {
velocity.Y = JumpVelocity;
}
- 使用
IsOnFloor()
保证只有在地面上才能起跳 ui_accept
默认绑定为空格键
,可在 Input Map 中修改
🕹️ 移动方向处理
Vector2 direction = Input.GetVector("ui_left", "ui_right", "ui_up", "ui_down");
velocity.X = direction.X * Speed;
Input.GetVector(...)
是 Godot 推荐的方式:- 左键按下返回 -1,右键按下返回 1
- 可用于 2D 移动、8 向移动、手柄摇杆统一控制