--require("Script.Common.UGCLog"); --require("Script.Common.TableHelper"); LevelStreamTool = LevelStreamTool or { LevelLoadCounter = 0; LoadDelegate = nil; LoadCompletedCallback = nil; IsAsyncLoad = false; LevelUnloadCounter = 0; UnLoadDelegate = nil; UnloadCompletedCallback = nil; IsAsyncUnload = false; LoadedLevels = {}; }; ---@param LevelNameList string[]字符串关卡名列表 ---@param CompletedCallback CallbackStruct 加载完成时的回调函静态函数 ---@param bShouldBlockOnLoad bool 是否等待处理完成 --- LoadStreamLevel fun(WorldContextObject:UObject,LevelName:FName,bMakeVisibleAfterLoad:bool,bShouldBlockOnLoad:bool,LatentInfo:FLatentActionInfo) function LevelStreamTool.LoadStreamLevels(LevelNameList, CompletedCallback, bShouldBlockOnLoad) --UGCLogSystem.Log("[Level] 加载关卡数量:%d CompletedCallback:%s", LevelNameList:Num(), UE.ToTable(CompletedCallback)); LevelStreamTool.LevelLoadCounter = LevelStreamTool.LevelLoadCounter + #LevelNameList; LevelStreamTool.LoadCompletedCallback = CompletedCallback; LevelStreamTool.IsAsyncLoad = not bShouldBlockOnLoad; UGCLogSystem.Log("[Level] 加载关卡 LoadCompletedCallback:%s", UE.ToTable(LevelStreamTool.LoadCompletedCallback)); for k, v in pairs(LevelNameList) do UGCLogSystem.Log("[Level] 加载关卡:%s", v); table.insert(LevelStreamTool.LoadedLevels, v); LevelStreamTool.LoadDelegate = ObjectExtend.CreateDelegate(UGCGameSystem.GameState, LevelStreamTool.OnLoadCompleted, LevelStreamTool); GameplayStatics.LoadStreamLevel(UGCGameSystem.GameState, v, true, bShouldBlockOnLoad, ObjectExtend.CreateLatentAction(LevelStreamTool.LoadDelegate)); -- 强制加载完成 if bShouldBlockOnLoad then GameplayStatics.FlushLevelStreaming(UGCGameSystem.GameState); end end if bShouldBlockOnLoad then UGCLogSystem.Log("[Level] 完成同步加载关卡"); -- LevelStreamTool.LoadCompletedCallback(); LevelStreamTool.LoadCompletedCallback.Func(LevelStreamTool.LoadCompletedCallback.Object); end end --- 加载结束异步回调 function LevelStreamTool:OnLoadCompleted() if not LevelStreamTool.IsAsyncLoad then return; end LevelStreamTool.LevelLoadCounter = LevelStreamTool.LevelLoadCounter - 1; UGCLogSystem.Log("[Level] 加载关卡完成 剩余等待计数:[%d]", LevelStreamTool.LevelLoadCounter); if LevelStreamTool.LevelLoadCounter == 0 then ObjectExtend.DestroyDelegate(LevelStreamTool.LoadDelegate); LevelStreamTool.LoadDelegate = nil; UGCLogSystem.Log("[Level] 加载关卡完成 LoadCompletedCallback:%s", UE.ToTable(LevelStreamTool.LoadCompletedCallback)); if LevelStreamTool.LoadCompletedCallback ~= nil then UGCLogSystem.Log("[Level] 完成异步加载关卡"); -- LevelStreamTool.CompletedCallback(); -- 必须缓存用,不然会被加载子关卡的调用冲掉 local Callback = LevelStreamTool.LoadCompletedCallback; LevelStreamTool.LoadCompletedCallback = nil; Callback.Func(Callback.Object); end end end --- 根据传入的列表销毁相应的关卡 ---@param LevelNameList string[]字符串关卡名列表 ---@param UnloadCompletedCallback CallbackStruct 销毁完成时的回调函静态函数 ---@param bShouldBlockOnLoad bool 是否等待处理完成 ---UnloadStreamLevel fun(WorldContextObject:UObject,LevelName:FName,LatentInfo:FLatentActionInfo) function LevelStreamTool.UnLoadStreamLevels(LevelNameList, UnloadCompletedCallback, bShouldBlockOnLoad) LevelStreamTool.UnloadCompletedCallback = UnloadCompletedCallback; LevelStreamTool.LevelUnloadCounter = LevelStreamTool.LevelUnloadCounter + #LevelNameList; LevelStreamTool.IsAsyncUnload = not bShouldBlockOnLoad; for k, v in pairs(LevelNameList) do UGCLogSystem.Log("[Level] 销毁关卡:%s", v); -- TableHelper.RemoveByValue(LevelStreamTool.LoadedLevels, v); table.removeValue(LevelStreamTool.LoadedLevels, v, true) LevelStreamTool.UnLoadDelegate = ObjectExtend.CreateDelegate(UGCGameSystem.GameState, LevelStreamTool.UnLoadCompleted, LevelStreamTool); GameplayStatics.UnloadStreamLevel(UGCGameSystem.GameState, v, ObjectExtend.CreateLatentAction(LevelStreamTool.UnLoadDelegate)); -- 强制销毁完成 if bShouldBlockOnLoad then GameplayStatics.FlushLevelStreaming(UGCGameSystem.GameState); end end if bShouldBlockOnLoad then UGCLogSystem.Log("[Level] 完成同步销毁关卡"); LevelStreamTool.UnloadCompletedCallback.Func(LevelStreamTool.UnloadCompletedCallback.Object); end end --- 销毁结束异步回调 function LevelStreamTool:UnLoadCompleted() if not LevelStreamTool.IsAsyncUnload then return; end UGCLogSystem.Log("[Level] 销毁关卡完成[%d]", LevelStreamTool.LevelUnloadCounter); LevelStreamTool.LevelUnloadCounter = LevelStreamTool.LevelUnloadCounter - 1; if LevelStreamTool.LevelUnloadCounter == 0 then ObjectExtend.DestroyDelegate(LevelStreamTool.UnLoadDelegate); LevelStreamTool.UnLoadDelegate = nil; if LevelStreamTool.UnloadCompletedCallback ~= nil then UGCLogSystem.Log("[Level] 完成异步销毁关卡"); -- LevelStreamTool.UnloadCompletedCallback(); LevelStreamTool.UnloadCompletedCallback.Func(LevelStreamTool.UnloadCompletedCallback.Object); LevelStreamTool.UnloadCompletedCallback = nil; end end end