跳转到主要内容
InsideUE4 Jan 4, 2026 4 tags

GamePlay架构(9):GameInstance

UE4 GamePlay 架构学习笔记

cover

GamePlay架构9:GameInstance

引言

一路向上,依照设计里一个最朴素的原理:自己是无法创建管理自身的,所以Player也需要一个创建管理和存储的地方。另一方面,上文提到Player固然可以负责一些跟玩家相关的业务逻辑,但是对于World之上协调管理的逻辑却也仍然无处安放。

GameInstance

GameInstance 架构图

UGameInstance里的接口大概有4类:

  1. 引擎的初始化加载,Init和ShutDown等(在引擎流程章节会详细叙述)
  2. Player的创建,如CreateLocalPlayer,GetLocalPlayers之类的。
  3. GameMode的重载修改,这是从4.14新增加进来改进,本来你只能为特定的某个Map配置好GameModeClass,但是现在GameInstance允许你重载它的PreloadContentForURL、CreateGameModeForURL和OverrideGameModeClass方法来hook改变这一流程。
  4. OnlineSession的管理,这部分逻辑跟网络的机制有关(到时候再详细介绍),目前可以简单理解为有一个网络会话的管理辅助控制类。

思考:GameInstance只有一个吗?

一般而言,是的。对于我们自己开发的游戏而言,我们始终只需要关注自己的一亩三分地,那么你可以认为你子类化的那个GameInstance就像个单件一样,全局唯一只有一个,从游戏的开始到结束。再扩充一下,在Engine之下允许同时运行多个GameInstance,还会有许多其他好处,就像操作系统允许一份资源运行多个进程实例一样,Engine就可以站在更高的层次上管理协调多个Game,同时也能更加的深入到Game内部去得到更多的优化。

思考:哪些逻辑应该放在GameInstance?

  1. Worlds,Level的切换实际发生地是Engine,而GameInstance可以说是UE之神其下的唯一代言人,所以GameInstance也可以代之管理World的切换等。我们可以在GameInstance里实现各种逻辑最后调用Engine的OpenLevel等接口。
  2. Players,虽然一般来说我们直接控制Players的机会不多,都是配置好了就行。但要是到了需要的时候,GameInstance也实现了许多的接口可以让你动态的添加删除Players。
  3. UI,UE的UI是另一套World之外的系统,虽然同属于Viewport的显示之下,但是控制结构跟Actor们并不一样。所以我们常常会需要控制UI各种切换的业务逻辑,虽然在Widget的Graph里也可以写些简单的切换,但是要想复用某些切换逻辑的时候,在特定的Wdiget里就不合适了,而GameMode一方面局限于Level,另一方面又只存在于Server;PlayerController也是会切换掉的,同时又只存在于World中,所以最后比较合适的就剩下GameInstance了,以后当然有可能了可能会扩展出个UI的业务逻辑Manger类,不过那是后话了。
  4. 全局的配置,也常常需要根据平台改变一些游戏的配置,Execute一些ConsoleCommand,GameInstance也是这些命令的存放地。
  5. 游戏的额外第三方逻辑,如果你的游戏需要其他一些控制,比如自己写的网络通信、自定义的配置文件或者自己的一些程序算法,如果简单的话,GameInstance也可以一放,等复杂起来了,也可以把GameInstance当作一个模块容器,你可以在里面再扩展出来其他的子逻辑模块。当然如果是插件的话,还是在自己的插件Module里面自行管理逻辑,然后把协调工作交给GameInstance来做。

SaveGame

UE为我们在蓝图里提供了SaveGame的统一接口,让你只用关心想序列化的数据。USaveGame其实就是为了提供给UE一个UObject对象,本身并不需要其他额外的控制。

总结

UE用GameInstance实现了全局的控制,并支持多GameInstance来实现编辑器,最后在存档的时候还可以用到SaveGame的方便接口。

Related Articles

继续阅读