目录
前言
UE 中的 GameMode 是游戏规则的服务器端权威定义者与流程控制器,仅存在于服务器,负责制定玩法逻辑、管理玩家生成/重生及判定胜负,不同步至客户端。
之前已经有玩家控制器和角色,GameMode 可以将这些串连(包)起来,因此需要设置关卡的 GameMode 属性。
GameMode
Game Mode 不仅有 Pawn 和 PlayerController 属性,而且还有 HUD、GameState、PlayerState、Spector。
设置 Game Mode 之前需要添加 Game Mode C++ 类,这样我们就可以在 C++ 层控制 Game Mode 的属性及行为,并以该类作为游戏的骨架。并在该类基础上建立 Game Mode 蓝图,从蓝图层也可控制 Game Mode。
Game Mode 类
Game Mode 蓝图要基于 C++ 类建立,所以 C++ 类即为基类,引擎提供了 Game Mode Base 类型,Visual Studio 2022 中运行后启动项目,启动引擎,在 Content Drawer 中 【C++ Classes】->【Aura】->【Public】目录下右键选择【New C++ Class...】选项,选择 Game Mode Base 并点击【Next】:

重新命名为 AuraGameModeBase(AuraGameModeBase 会报错),Path 后面追加 /Game:

Game Mode 蓝图
C++ 类创建好之后需要创建 Game Mode 蓝图,在 Blueprints 下添加 Game 文件夹,并创建 BP_GameModeBase 蓝图,创建时选择其父类为 AuraGameModeBase。创建好之后双击打开设置其属性 Player Controller Class 为 BP_AuraPlayerController,Default Pawn Class 为 BP_AuraCharactor。

编译并保存之后,打开 StartupMap 关卡,设置其属性 GameMode Override 属性为 BP_AuraGameModeBase,其他属性会自动填充,如下图所示:

点击盾牌图标下拉选择 Basic -> Player Start 拖拽至场景中,添加一个玩家起点,运行游戏即可在 Player Start 处出现我们的角色。


此时,按键 W,A,S,D 后角色会前后左右移动,表示我们可以控制角色。
但是,我们要实现是俯视角,而不是第一人称游戏,所以另需要添加摄像机和弹簧臂,以达到俯视角效果。
摄像机和弹簧臂
摄像机和弹簧臂可以使用 C++代码实现,也可使用蓝图实现,但是使用蓝图比 C++ 要方便快捷,所以这里我们以蓝图为例添加二者。
打开 BP_AuraCharactor 蓝图,选中左侧 Capsule Component,即角色的胶囊组件,也是弹簧臂所依附的地方。然后点击【Add】按钮,搜索 Spring Arm,选择并添加,再选中刚刚添加的 Spring Arm 组件,点击 【Add】按钮,搜索 camera,选中并添加:

选中 Spring Arm,按 E 键切换至旋转模式,顺时针旋转至合适角度(-45°),并设置弹簧臂的长度(750)。如果旋转无法精细控制可在右侧编辑区设置:

同时确保弹簧臂的 Use Pawn Control Rotation 取消选中,即不支持玩家控制视角旋转。这样就实现了俯视角的效果:

但是现在如果运行游戏,控制角色移动会发现,角色前后左右移动很怪异,就是角色不会朝向其移动方向,而是始终朝向前方(从摄像机到角色的方向)。为了使用角色时刻朝向其移动方向,还需要做一些设置,这部分我们在 AuraCharacter 类中实现。
关闭引擎,回到 Visual Studio 2022,打开 AuraCharacter.h,在 Public 区域添加其无参构造方法,并在 AuraCharacter.cpp 添加该构造方法实现。调用 GetCharacterMovement() 方法设置 bOrientRotationToMovement、 RotationRate、bConstrainToPlane、bSnapToPlaneAtStart,并设置 、bUseControllerRotationPitch、bUseControllerRotationYaw、bUseControllerRotationRoll 为 false:
c
#include "Character/AuraCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
AAuraCharacter::AAuraCharacter()
{
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->RotationRate = FRotator(0.0f, 400.0f, 0.0f);
GetCharacterMovement()->bConstrainToPlane = true;
GetCharacterMovement()->bSnapToPlaneAtStart = true;
bUseControllerRotationPitch = false;
bUseControllerRotationYaw = false;
bUseControllerRotationRoll = false;
}
即便这样设置后运行游戏你会发现,移动角色进行前后左右移动时,角色并没有转向,而是地面在旋转,或者说是摄像机跟着角色一起在旋转。这是因为摄像机并没有被固定的缘故,打开角色蓝图,将弹簧臂 Camera Settings 的 Pitch、Yaw、Roll 取消勾选两次运行游戏即可正常。
角色头部动作修正
现在角色可以正常移动,朝向也正确,但是角色在移动停止后头部会有一个来回抽动的小动作,很不和谐。究其原因是因为在角色的动画蓝图中,状态机仅有一个状态,所以这个动作在从运动到静止之后会重复两次摆头动画。
解决这个问题并不难,打开 ABP_Aura 蓝图,为其添加一个状态命名为 Idle 表示空闲(静止),将原状态 IdleWalkRun 命名为 Running(运动),并规定当角色移动速度大于等于 3 时为运行,其他情况为空闲,将两个状态之间连线,设置一个变量为 ShouldMove(布尔类型),当速度大于等于 3 时,ShouldMove 为 true,反之为 false,打开 Loop Animation 选项:





再次运行游戏,移动角色,当角色停下来时,头部动作会变得自然。
总结
现在我们能控制角色移动,并使用 Game Mode 将之前添加的组件包装到了一起,接下来将进行游戏玩法能力系统实现。当然,这部分既有趣也很复杂。