在Dedicated Server模式下,load玩Map后我想在我的C++代码中想获取GameInstance,通过
GEngine->GetWorld()->GetGameInstance()
语句获取,但是程序运行到这,出现段错误。
然后尝试获取World,
GEngine->GetWorld()
发现程序运行出现段错误,也就是说GEngine->GetWorld() == NULL。
经过一段搜索,在这篇文章(https://zhuanlan.zhihu.com/p/23167068)上得到启发:
一般就来说,对于独立运行的游戏(两种:game和server),WorldContext只有唯一个;而对于编辑器模式,则是一个WorldContext给编辑器,一个WorldContext给PIE(Play In Editor【一种模式,点击Play后运行的world】)的World。一般来说我们不需要直接操作到这个WorldContext类,引擎内部已经处理好各种World的协作。
Standlone Game:会使用UGameEngine来创建出唯一的一个GameWorld,因为也只有一个,所以为了方便起见,就直接保存了GameInstance指针。
而对于编辑器来说:Editor World其实只是用来预览,所以并不拥有OwningGameInstance,而PlayWorld里的OwningGameInstance才是间接保存了GameInstance。
所以,在我们Dedicated Server模式下,可以通过
GEngine->GetWorldContexts()[0] 获取World
GEngine->GetWorldContexts()[0].OwningGameInstance 获取GameInstance
然后在别人讨论中,又发现,有一种更简单的方式获取World,直接通过
World.h文件中的GWorld全局变量直接获取,通过上面的启发我们知道,这个World应该就是当前的World,引擎自动切换好。
通过GWorld->GetGameInstance() 获取GameInstance。