135 lines
5.4 KiB
Lua
135 lines
5.4 KiB
Lua
--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 |