目录
UE4仿真引擎学习
一、架构基础
1. GameMode
即使最开放的游戏也拥有基础规则,而这些规则构成了 Game Mode。在最基础的层面上,这些规则包括:
-
出现的玩家和观众数量,以及允许的玩家和观众最大数量。
-
玩家进入游戏的方式,可包含选择生成地点和其他生成/重生成行为的规则。
-
游戏是否可以暂停,以及如何处理游戏暂停。
-
关卡之间的过渡,包括游戏是否以动画模式开场。
笼统的讲,一个World就是一个Game,把玩法叫做Mode。在功能实现上有许多的接口,但主要可以分为以下几大块:
(1)Class登记,GameMode里登记了游戏里基本需要的类型信息,在需要的时候通过UClass的反射可以自动Spawn出相应的对象来添加进关卡中.
(2)游戏内实体的Spawn,不光登记,GameMode既然作为一场游戏的主要负责人,那么游戏的加载释放过程中涉及到的实体的产生,包括玩家Pawn和PlayerController,AIController也都是由GameMode负责。最主要的SpawnDefaultPawnFor、SpawnPlayerController、ShouldSpawnAtStartSpot这一系列函数都是在接管玩家实体的生成和释放,玩家进入该游戏的过程叫做Login(和服务器统一),也控制进来后在什么位置,等等这些实体管理的工作。GameMode也控制着本场游戏支持的玩家、旁观者和AI实体的数目。
(3)游戏的进度,一个游戏支不支持暂停,怎么重启等这些涉及到游戏内状态的操作也都是GameMode的工作之一,SetPause、ResartPlayer等函数可以控制相应逻辑。
(4)Level的切换,或者说World的切换更加合适,GameMode也决定了刚进入一场游戏的时候是否应该开始播放开场动画(cinematic),也决定了当要切换到下一个关卡时是否要bUseSeamlessTravel,一旦开启后,你可以重载GameMode和PlayerController的GetSeamlessTravelActorList方法和GetSeamlessTravelActorList来指定哪些Actors不被释放而进入下一个World的Level。
(5)多人游戏的步调同步,在多人游戏的时候,我们常常需要等所有加入的玩家连上之后,载入地图完毕后才能一起开始逻辑。因此UE提供了一个MatchState来指定一场游戏运行的状态,意义看名称也是不言自明的,就是用了一个状态机来标记开始和结束的状态,并触发各种回调。
2. GameState
基于规则的事件在游戏中发生,需要进行追踪并和所有玩家共享时,信息将通过 Game State 进行存储和同步。这些信息包括:
-
游戏已运行的时间(包括本地玩家加入前的运行时间)。
-
每个个体玩家加入游戏的时间和玩家的当前状态。
-
当前 Game Mode 的基类。
-
游戏是否已开始。
Game State 负责启用客户端监控游戏状态。从概念上而言,Game State 应该管理所有已连接客户端已知的信息(特定于 Game Mode 但不特定于任何个体玩家)。它能够追踪游戏层面的属性,如已连接玩家的列表、夺旗游戏中的团队得分、开放世界游戏中已完成的任务,等等。
Game State 并非追踪玩家特有内容(如夺旗比赛中特定玩家为团队获得的分数)的最佳之处,因为它们由 Player State 更清晰地处理。整体而言,GameState 应该追踪游戏进程中变化的属性。这些属性与所有人皆相关,且所有人可见。Game mode 只存在于服务器上,而 Game State 存在于服务器上且会被复制到所有客户端,保持所有已连接机器的游戏进程更新。
3. GameSession
是在网络联机游戏中针对Session使用的一个方便的管理类,并不存储数据。在单机游戏中,也存在该类对象用来LoginPlayer,不过因为只是作为辅助类,那也可看作GameMode本身的功能,所以不做过多讨论。
4. 总结
AGameMode和AGameState支持了玩法和表现的解耦分离和自由组合,并很好的支持了网络间状态的同步。同时也提供了一个逻辑的实体来负责创建关系内那些关键的Pawn和Controller们,在关卡切换(World)的时候,也有了一个负责对象来处理一些本游戏的特定情况处理。
参考链接:《InsideUE4》GamePlay架构(七)GameMode和GameState - 知乎 (zhihu.com)