02 游戏模式
UE4GamePlay关键元素
游戏世界的规则与状态保持
概要
利用GameMode制定和检测胜利规则,并支配世界内的“元素”
通过GameState记录游戏世界的关键状态
使用PlayerState保存玩家的状态。
通过GameState和PlayerState来持久化游戏世界的数据,为对局恢复(断线重连,观战)进行,为世界的重建提供支持。”
游戏模式 | "游戏"的概念分为两类。Game Mode和Game State是游戏的定义,包括游戏规则和获胜条件等内容。它仅存在于服务器上。它通常不应有太多在游戏过程中会发生变化的数据,也绝对不应有客户端需要了解的临时数据。 |
---|---|
游戏状态 | GameState包含游戏的状态,其中可以包括联网玩家列表、得分、棋类游戏中棋子的位置,或者在开放世界场景中完成的任务列表。游戏状态存在于服务器和所有客户端上,可以自由复制以保持所有机器处于最新状态。。 |
玩家状态 | 玩家状态是游戏玩家的状态,例受人类玩家或模拟玩家的机器人。作为游戏的一部分而存在的非玩家AI将不会拥有玩家状态。在玩家状态中适当的示例数据包括玩家姓名或得分、比赛中MOBA等的等级,或玩家当前是否在CTF游戏中携带旗帜。所有玩家的玩家状态存在于所有机器上(与玩家控制器不同),并且可以自由复制以保持同步。 |
GameMode
GameMode 制定的规则
- 玩家和观众数量,以及允许的玩家和观众最大数量。
- “玩家进入游戏的方式”,可包含选择生成地点和其他生成/重生成行为的规则。
- 基于规则的事件在游戏中发生,需要进行追踪并和所有玩家共享时,信息将通过GameState进行存储和同步。这些信息包括且不限于︰
- 游戏已运行的时间(包括本地玩家加入前的运行时间)。
- 每个个体玩家加入游戏的时间和玩家的当前状态。
- 游戏是否已开始。
GameMode中的关键方法
- lnitGame
- 在所有Actor激活之前调用(执行PrelnitializeComponents之前)Beginplay。
- PreLogin
- 接受或拒绝尝试加入服务器的玩家。如它将ErrorMessage 设为一个非空字符串,会导致Login 函数失败。
- PostLogin
- 成功登录后调用。这是首个在PlayerController上安全调用复制函数之处。OnPostLogin 暴露给了蓝图中,用于方便添加额外的逻辑。
- HandleStartingNewPlayer
- 在PostLogin后或无缝游历后调用,可在蓝图中覆盖,修改新玩家身上发生的事件。它将默认创建一个玩家pawn
- RestartPlayer
- 调用开始生成一个玩家pawn。如需要指定Pawn 生成的地点,还可使用
RestartPlayerAtPlayerStart和 RestartPlayerAtTransform 函数。OnRestartPlayer 可在蓝图中实现,在此函数完成后添加逻辑。
- 调用开始生成一个玩家pawn。如需要指定Pawn 生成的地点,还可使用
- SpawnDefaultPawnAtTransform
- 这实际生成玩家Pawn,可在蓝图中覆盖。
- Logout
- 玩家离开游戏或被摧毁时调用。可实现OnLogout执行蓝图逻辑。(断线重连)
预置的基础GameMode
特定的基础(如进行游戏所需要的玩家数量,或玩家加入游戏的方法)在多种类型的游戏中具有共通性。可根据开发的特定游戏进行无穷无尽的规则变化。无论规则如何,GarModes 的任务都是定义和实现规则。Game Modes当前常用的基类有两个。
- AGameModeBase,这是所有Game Mode 的基类,是经典的AGameMode简化版本。简洁高效,是默认的游戏模式。
- AGameMode是AGameModeBase的子类。AGameMode更适用于标准游戏类型
(如多人射击游戏),以比赛状态概念作为实现。AGameMode解析
AGameMode 包含一个跟踪比赛状态或整体游戏流程的状态机。可使用GetMatchState 或 HasMatchStarted、IsMatchInProgress和HasMatchEnded之类的封装器查询当前的状态。
设置Game Mode
URL 作为启动参数,指定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。默认情况下,它带有一个用于碰撞的胶囊组件和一个角色移动组件。它可以执行类似人类的基本动作,可以流畅地复制网络上的动作,还具有一些与动画相关的功能。
其他必不可少的元素
Movement
Camera
玩家摄像机管理器是玩家的”眼球””,负责管理它的行为。通常情况下,每个玩家控制器也有一个此类型的摄像机。请参见摄像机工作流程页面,了解更多信息
HUD
HUD是指”抬头显视”或二维屏幕显示,在许多游戏中较为常用。例如显示血条、弹药指示器、枪准星等。每个玩家控制器通常都配有其中一种显示
网络同步
网络角色NetRole
- authority
- autonomous
- simulate
值复制(server)
- 相关性的概念(相关时同步actor+最新状态)
- Actor状态的保持(ActorChannel)
- Server—>Client(可靠的,及时的)
RPC
RPC(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