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就是對象引用的值么?因為虛幻引擎的游戲物體都是像這樣用一個自定義的數字串代表的么?
總之,還有可以研究的空間。
