UE4的中文讨论是真的少啊。
想找个办法做到类似Unity中DontDestroyOnLoad()的效果。让音乐物体等不会因场景切换而摧毁。找了半天。
GameInstance只能用来保留切换场景时的数据,无法对actor等产生作用。具体地说,确实可以再GameInstance蓝图里新建如actor对象引用等变量,但至少,默认的“对象引用”只是保存了到场景中那个Actor的对象指针,并不会额外复制一份对象出来。所以场景切换后,再使用这个对象引用,会报错。软对象引用还有待研究,在这个知乎里看见说软引用可以用来跨关卡(https://www.zhihu.com/question/265487139)。
幸好虚幻社区里是有这问题的讨论的,文档不够,社区来凑。中文不够,英文来凑。
总之结论是,在窗口-关卡 / Windows-Level中,可以设置固定关卡。再配合上Level Streaming/关卡流加载,就可以做到类似DontDestroyOnLoad()的效果。
就是说,固定关卡中的Actor,在使用流加载方式加载出新关卡物体时,不会被销毁。
默认情况下,当前关卡即为固定关卡。然后,把需要加载的关卡通通拖入窗口的固定关卡中。
之后,再配合蓝图或者C++里的流加载方式加载它们,就可以了。
图中,流加载了ThirdPersonExampleMap1这个关卡。并设置为了立即显示。
顺带一提,蓝图里的Open Level加载方式,即使是固定关卡的资源也会被卸载掉,所以必须配合流加载方式使用才有效。
官方文档:
蓝图流加载:https://docs.unrealengine.com/zh-CN/BuildingWorlds/LevelStreaming/HowTo/StreamWithBlueprints/index.html
关卡设置:https://docs.unrealengine.com/zh-CN/Basics/Levels/LevelsWindow/index.html
事件分发:https://docs.unrealengine.com/zh-CN/ProgrammingAndScripting/Blueprints/BP_HowTo/EventDispatcher/index.html
后续:
我是在使用wwise的情况下想要跨关卡保留音乐。后来,又用wwise的sdk写了自己的gameInstance类并用蓝图继承,来做到了通过OpenLevel蓝图节点打开关卡的同时,声音不会停止。
wwise的postEvent函数其中一个重载需要“EventID”和“Actor物体引用”来post一个事件到wwise引擎,默认情况下,如果给予的Actor物体为空,wwise的这个postEvent函数会使用一个默认GO:Unreal Global,对应的游戏物体ID为0x02。那这个物体引用是怎么逃脱关卡加载的呢?因为0x02就是对象引用的值么?因为虚幻引擎的游戏物体都是像这样用一个自定义的数字串代表的么?
总之,还有可以研究的空间。