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