UGCProjects/BoltGods/Script/Global/Tool/LevelStreamTool.lua

140 lines
6.3 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
--require("Script.Common.UGCLog");
--require("Script.Common.TableHelper");
if UE_SERVER then
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
end