UE GameMode
定义和功能
-
定义:
GameMode
是Unreal Engine中定义游戏规则、控制游戏进程的类,是每个游戏世界(World)的逻辑核心。 -
功能
- 类注册:管理游戏中所需的类信息,如玩家和AI控制器、默认Pawn等。
- 实体Spawn:控制游戏中角色和对象的生成,玩家Pawn和PlayerController,AIController也都是由GameMode负责。最主要的SpawnDefaultPawnFor、SpawnPlayerController、ShouldSpawnAtStartSpot这一系列函数都是在接管玩家实体的生成和释放。
- 游戏状态管理:控制游戏的暂停、开始、结束等状态。
- Level切换:管理游戏的关卡(Level)切换,包括无缝旅行(Seamless Travel)的实现。
- 多人游戏同步:在多人游戏中同步玩家的状态和游戏进度,比如一起开始。
设计理念
- 游戏逻辑的中心:
GameMode
设计为控制游戏核心逻辑的中心点,从游戏规则到玩家行为的管理。 - 灵活的控制:通过提供多种控制接口和函数,使开发者可以自定义游戏的行为和规则,以适应不同的游戏类型。
- 支持网络游戏:设计了多种机制来支持网络游戏的需要,如匹配状态、玩家登录等。
相关类关系
- 与
PlayerController
和Pawn
的关系:负责生成和管理玩家的控制器和Pawn,确保游戏逻辑与玩家互动的实现。 - 与
GameState
的关系:GameMode
控制游戏逻辑,而GameState
用来保存游戏的状态信息,两者配合确保游戏状态的正确同步。
游戏场景例子
- 在线多人射击游戏:
GameMode
管理玩家的生成、队伍分配、比赛开始和结束。 - 战略游戏:根据不同的游戏模式(如死亡竞赛、占领旗帜等),
GameMode
定义不同的胜利条件和规则。
当配置多个Level具有不同的GameMode时,应用的原则如下:
- 在Unreal Engine(UE)中,每个World仅会有一个GameMode实例。如果一个World包括一个PersistentLevel和多个StreamingLevel,UE仅在创建World并加载PersistentLevel时创建GameMode实例。此后,在加载StreamingLevel过程中,不会创建新的GameMode实例。因此,无论StreamingLevel配置了何种GameModeClass,整个World的GameMode始终只有一个,即PersistentLevel所配置的GameMode。
关于Level迁移时GameMode的保持情况:
- 如果使用
bUseSeamlessTravel
进行travelling,即使travelling到一个配置有不同GameModeClass的新Level,当前的GameMode、GameState和GameSession可以暂时迁移到一个中间的TransitionWorld中。在迁移过程中,这些元素首先被移到TransitionWorld,然后在完成迁移至新World时,这些状态会被释放,根据新World配置的GameModeClass创建新的GameMode实例。 - 如果未开启
bUseSeamlessTravel
,在travelling时,当前的World及其GameMode会被完全释放,新的World将根据其配置的GameModeClass重新创建GameMode。
哪些逻辑应该写在GameMode里?哪些应该写在Level Blueprint里?
GameMode的职责:
- 游戏玩法逻辑:GameMode主要负责游戏的核心玩法规则,例如胜利条件、玩家得分、游戏状态(如开始、结束)的管理,以及怪物的生成和管理。这些逻辑是全局性的,应适用于整个World中的所有Level。
- 玩家管理:处理玩家的加入、退出、重生等逻辑。GameMode在服务器上运行,确保所有游戏状态的同步和游戏规则的强制执行。
- 服务器逻辑:因为GameMode只存在于服务器端,所以它是处理所有需要中央控制的游戏逻辑的地方,例如同步时间、游戏进度等。
Level Blueprint的职责:
- 特定级别的表现逻辑:Level Blueprint适合编写仅与当前Level相关的逻辑,如特定事件的触发、环境效果的控制(如天气变化、特效播放),以及对Level内特定Actor的行为控制。
- 环境交互:处理玩家或游戏内对象与当前Level环境的互动,比如开关门、激活机关等。
- 表现层面的反馈:虽然UI通常由PlayerController或GameInstance处理,Level Blueprint仍可以用于处理那些与玩家直接交互且效果立即可见的元素,如局部特效和动画。
总结:
- 将全局性或影响整个游戏流程的逻辑放在GameMode中,确保游戏的整体规则和逻辑一致性。
- 将与特定Level直接相关或只在某个Level中发生的视觉和环境交互逻辑放在Level Blueprint中,这有助于保持各个Level的独立性和特色。
- 游戏的UI和玩家特定的交互逻辑应主要在PlayerController中处理,而GameMode应避免涉及任何客户端特定的UI逻辑,保持服务器端的职责清晰。