Player 场景与输入事件

在接下来的两节课程中,我们将会设计玩家场景、注册自定义输入动作、编写玩家移动代码。在最后,你将会得到一个可以八方向移动的可游玩角色。

在左上角的场景菜单中单击新建场景,创建一个新场景。

../../_images/new_scene.webp

点击其他节点按钮,选择 CharacterBody3D 节点类型,创建一个 CharacterBody3D 作为根节点。

../../_images/add_character_body3D.webp

CharacterBody3D 命名为 Player。角色体是对 2D 游戏教程中使用的区域和刚体的补充。与刚体一样,它们可以移动并与环境发生碰撞,但不受物理引擎控制,而是由决定它们的运动。当我们编写跳跃和踩踏机制时,你就会看到我们是如何使用这一该节点独有的特性的。

参见

要学习更多关于不同物理节点类型的内容,请参阅 物理介绍

现在,我们将为角色的 3D 模型创建一个基本的装备。稍后我们将在播放动画时通过代码旋转模型。

Player 节点添加一个 Node3D 子节点。在场景树中选中 Player 节点,点击“+”按钮添加子节点,并将其重命名为 Pivot

../../_images/adding_node3D.webp

然后在文件系统面板中,双击展开 art/ 文件夹,将 player.glb 拖放到 Pivot 节点上。

../../_images/instantiating_the_model.webp

这样应该就会把这个模型实例化为 Pivot 的子项。你可以将其重命名为 Character

../../_images/scene_structure.webp

备注

.glb 文件包含基于开源的 GLTF 2.0 规范的 3D 场景数据。它是一种现代的、强大的并替代 FBX 等专有格式的文件,Godot 也支持这种格式。为了制作这些文件,我们在 Blender 3D 中设计了模型,并将其导出为 glTF。

与所有物理节点一样,我们需要为角色添加一个碰撞形状,让其能与环境发生碰撞。再次选中 Player 节点,为其添加一个子节点 CollisionShape3D。在检查器中,点击形状(Shape)属性,新建一个 SphereShape3D

../../_images/add_capsuleshape3d.webp

球体的线框出现在角色的下面。

../../_images/sphere_shape.png

它将是物理引擎用来与环境碰撞的形状,因此我们希望它更适合 3D 模型。拖动视口中的橙色点,将其缩小一点。我的球体半径约为 0.8 米。

然后,向上移动碰撞体,使其底部与网格平面大致对齐。

../../_images/moving_the_sphere_up.png

为了使形状移动更容易,你可以通过点击 CharacterPivot 节点旁边的 眼睛图标 来切换模型的可见性。

../../_images/toggling_visibility.webp

将场景保存为 player.tscn

节点准备就绪后,我们开始编写程序。但首先,我们需要定义一些输入动作。

创建输入动作

要移动角色,我们就要监听玩家的输入,比如按下方向键。在 Godot 中,我们能够使用代码来绑定按键,但还有一个非常强大的系统,可以让你为一系列按键和按钮设置标签。这样可以简化我们的脚本,让它们更易读。

这个系统是“输入映射”。可以在项目菜单中选择项目设置...来打开编辑器。

../../_images/project_settings.webp

窗口顶部设有多个选项卡。点击输入映射 。你可以在这个窗口上部添加新的动作——即动作标签。在下半部分,你可以为这些动作绑定按键。

../../_images/input_map_tab.webp

Godot 项目针对用户界面设计提供了一些预定义的动作(见上面的截图)。这些动作在打开显示内置动作 开关后可见。我们可以使用这些动作,但我们要定义自己的动作来支持游戏手柄。请将显示内置动作保持禁用。

我们要把这些动作命名为 move_leftmove_rightmove_forwardmove_backjump(向左移动、向右移动、向前移动、向后移动、跳跃)。

要添加动作,可以在顶部的框中输入名称然后按回车键或点击添加按钮。

../../_images/adding_action.webp

创建以下五个动作:

../../_images/actions_list_empty.webp

要为动作绑定按键或按钮,请点击右侧的"+"按钮。对 move_left 执行此操作,按下左方向键,然后单击确定

../../_images/left_inputmap.webp

A 键也绑定在动作 move_left 上面。

../../_images/keyboard_keys.webp

现在,让我们为游戏手柄的左摇杆添加支持。再次点击“+”按钮,但这次请在输入树中手动选择输入项。在 Joypad Axes(手柄轴) 下选择左摇杆的负 X 轴。

../../_images/joystick_axis_input.webp

其他值保持默认,点击确定

备注

如果你想让多个手柄有不同的输入动作,你需要在额外选项中使用设备选项。设备 0 对应的是第一个插入的手柄,设备 1 对应的是第二个插入的手柄,以此类推。

为其他输入动作也执行同样的操作。比如将右方向键、D、左摇杆的正轴绑定给 move_right。全部绑定完后,你的界面应该类似这样。

../../_images/move_inputs_mapped.webp

最后要设置的动作是 jump。请将空格键和位于 Joypad Buttons(手柄按钮) 下的游戏手柄 A 按钮绑定到该动作。

../../_images/joy_button_option.webp

你的跳跃输入动作应该看上去类似这样。

../../_images/jump_input_action.webp

这些就是这个游戏所需的所有动作了。你可以使用这个菜单来对项目中的任意按键和按钮组进行标记。

在下一部分,我们将为玩家的移动进行编程和测试。