GameplayAbilitiesSystem(九)

目录

前言

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 将之前添加的组件包装到了一起,接下来将进行游戏玩法能力系统实现。当然,这部分既有趣也很复杂。

相关推荐
麦克马8 天前
GameplayAbilitiesSystem(八)
gas
麦克马3 个月前
GameplayAbilitiesSystem(六)
gas
晴夏。3 个月前
GAS下的网络同步的全面分析【超级全面】
游戏引擎·ue·gas·网络同步
麦克马4 个月前
GameplayAbilitiesSystem(四)
gas
麦克马4 个月前
GameplayAbilitiesSystem(五)
gas
麦克马4 个月前
GameplayAbilitiesSystem(三)
gas
妙为4 个月前
UE5中武器未跟随角色
ue5·gas·gameplay
Joy T5 个月前
【Web3】深入解析Coin-Token、ERC20-ERC721、自定义错误机制与合约继承
web3·代币·自定义错误·gas·erc-20·原生币·合约继承
qq_428639618 个月前
aura:学习大纲
gas·aura