UE4GamePlay关键元素游戏世界的规则与状态保持概要

利用GameMode制定和检测胜利规则,并支配世界内的“元素”

通过GameState记录游戏世界的关键状态

使用PlayerState保存玩家的状态。

通过GameState和PlayerState来持久化游戏世界的数据,为对局恢复(断线重连,观战)进行,为世界的重建提供支持。”

游戏模式

"游戏"的概念分为两类。Game Mode和Game State是游戏的定义,包括游戏规则和获胜条件等内容。它仅存在于服务器上。它通常不应有太多在游戏过程中会发生变化的数据,也绝对不应有客户端需要了解的临时数据。

游戏状态

GameState包含游戏的状态,其中可以包括联网玩家列表、得分、棋类游戏中棋子的位置,或者在开放世界场景中完成的任务列表。游戏状态存在于服务器和所有客户端上,可以自由复制以保持所有机器处于最新状态。。

玩家状态

玩家状态是游戏玩家的状态,例受人类玩家或模拟玩家的机器人。作为游戏的一部分而存在的非玩家AI将不会拥有玩家状态。在玩家状态中适当的示例数据包括玩家姓名或得分、比赛中MOBA等的等级,或玩家当前是否在CTF游戏中携带旗帜。所有玩家的玩家状态存在于所有机器上(与玩家控制器不同),并且可以自由复制以保持同步。

GameModeGameMode 制定的规则

玩家和观众数量,以及允许的玩家和观众最大数量。

“玩家进入游戏的方式”,可包含选择生成地点和其他生成/重生成行为的规则。

基于规则的事件在游戏中发生,需要进行追踪并和所有玩家共享时,信息将通过GameState进行存储和同步。这些信息包括且不限于︰

游戏已运行的时间(包括本地玩家加入前的运行时间)。

每个个体玩家加入游戏的时间和玩家的当前状态。

游戏是否已开始。

GameMode中的关键方法

lnitGame

在所有Actor激活之前调用(执行PrelnitializeComponents之前)Beginplay。

PreLogin

接受或拒绝尝试加入服务器的玩家。如它将ErrorMessage 设为一个非空字符串,会导致Login 函数失败。

PostLogin

成功登录后调用。这是首个在PlayerController上安全调用复制函数之处。OnPostLogin 暴露给了蓝图中,用于方便添加额外的逻辑。

HandleStartingNewPlayer

在PostLogin后或无缝游历后调用,可在蓝图中覆盖,修改新玩家身上发生的事件。它将默认创建一个玩家pawn

RestartPlayer

调用开始生成一个玩家pawn。如需要指定Pawn 生成的地点,还可使用RestartPlayerAtPlayerStart和 RestartPlayerAtTransform 函数。OnRestartPlayer 可在蓝图中实现,在此函数完成后添加逻辑。

SpawnDefaultPawnAtTransform

这实际生成玩家Pawn,可在蓝图中覆盖。

Logout

玩家离开游戏或被摧毁时调用。可实现OnLogout执行蓝图逻辑。(断线重连)

预置的基础GameMode特定的基础(如进行游戏所需要的玩家数量,或玩家加入游戏的方法)在多种类型的游戏中具有共通性。可根据开发的特定游戏进行无穷无尽的规则变化。无论规则如何,GarModes 的任务都是定义和实现规则。Game Modes当前常用的基类有两个。

AGameModeBase,这是所有Game Mode 的基类,是经典的AGameMode简化版本。简洁高效,是默认的游戏模式。

AGameMode是AGameModeBase的子类。AGameMode更适用于标准游戏类型(如多人射击游戏),以比赛状态概念作为实现。AGameMode解析AGameMode 包含一个跟踪比赛状态或整体游戏流程的状态机。可使用GetMatchState 或 HasMatchStarted、IsMatchInProgress和HasMatchEnded之类的封装器查询当前的状态。

设置Game ModeURL 作为启动参数,指定GameMode

UE4Editor.exe /Game/Maps/MyMap?game=MyGameMode -game配置默认的GameMode

可在DefaultEngine.ini文件的/Script/Engine.WorldSettings/部分中设置地图前缀(和URL法的别名)。

这些前缀设置所有拥有特定前缀的地图的默认游戏模式。

[/Script/EngineSettings.GameMapsSettings]+GameModeMapPrefixes=>>(Name=”DM”,GameMode=”/Script/MyGameMode.MyGameMode”)+GameModeClassAliases=(Name=”DM”,GameMode=”/Script/MyGameMode.MyGameMode”)

GameState

包含要复制到游戏中的每个客户端的信息,简而言之,它表示每个联网玩家的”游戏状态。

它通常包含有关游戏分数、比赛是否已开始和基于世界场景玩家人数要生成的AI数量的信息,以及其他特定于游戏的信息。

对于多人游戏,每个玩家的机器上都有一个游戏状态实例,而服务器的实例为权威实例。

GetServerWorldTimeSeconds

GetTimeSeconds 的服务器版本,保持客户端和服务器上时间的同步。

PlayerArray

存储了所有玩家的APlayerState,方便遍历和获取玩家数据信息。

HasBegunPlay

游戏世界中的Actor已执行Beginplay,则返回true。

PlayerState

游戏玩家的状态,例如人类玩家或模拟玩家的机器人。作为游戏世界场景的一部分而存在的非玩家Al将不会拥有玩家状态。

在玩家状态中适当的示例数据包括玩家姓名或得分、当前等级或生命值。

对于多人游戏,所有玩家的玩家状态存在于所有机器上(与玩家控制器不同),并且可以将数据从服务器复制到客户端以保持同步。

游戏世界中的“生命体”Actor存在于游戏世界中最基础最简化的“生命体”。

Pawn可被Controller Possess,且可将其设置接受输入,用于执行各种各样类似于玩家的任务。请注意,Pawn不被认定为具有人的特性。

Character角色是类人式的Pawn。默认情况下,它带有一个用于碰撞的胶囊组件和一个角色移动组件。它可以执行类似人类的基本动作,可以流畅地复制网络上的动作,还具有一些与动画相关的功能。

其他必不可少的元素MovementCamera玩家摄像机管理器是玩家的”眼球””,负责管理它的行为。通常情况下,每个玩家控制器也有一个此类型的摄像机。请参见摄像机工作流程页面,了解更多信息

HUDHUD是指”抬头显视”或二维屏幕显示,在许多游戏中较为常用。例如显示血条、弹药指示器、枪准星等。每个玩家控制器通常都配有其中一种显示

网络同步网络角色NetRole

authority

autonomous

simulate值复制(server)

相关性的概念(相关时同步actor+最新状态)

Actor状态的保持(ActorChannel)

Server—>Client(可靠的,及时的)RPCRPC(server client) valid(damage10000 : 100, return false)

两种设置

Reliable (pitfall)

Unreliable(server→client,udp)。

类型

Multicast

Run on Server client—>server

Run on OwningClient:角色+背包(发光) server -> client specific show