111 lines
3.0 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
local ActorPool = {};
---@type int32 当前使用的 Actor
ActorPool.ActorCount = 0;
---@type AActor
ActorPool.Owner = nil;
---@type UClass 子项函数
ActorPool.ItemClass = nil;
---@type table<int32, AActor>
ActorPool.ActorMap = {};
---@type table<string, bool> 是否使用列表
ActorPool.ActorUseMap = {};
--- 初始化,创建 InNum 个放到
--- S
---@param InNum int32 需要创建的数据
---@param InClass string | UClass
---@param InOwner AActor 当前 Actor 池拥有者
---@param InLoc FVector 创建的位置
---@param InFunc fun(InActor: AActor, InIndex: int32)
function ActorPool:Init(InNum, InClass, InOwner, InLoc, InRot, InFunc)
self.ActorCount = InNum;
self.ItemClass = type(InClass) == 'string' and UE.LoadClass(InClass) or InClass;
self.Owner = InOwner == nil and UGCGameSystem.GameState or InOwner;
if InLoc == nil then InLoc = VectorHelper.VectorZero(); end
if InRot == nil then InRot = VectorHelper.RotZero(); end
--InOwner.ActorPool = self;
for i = 1, InNum do
local Item = UGCGameSystem.SpawnActor(self.Owner, self.ItemClass, InLoc, InRot, VectorHelper.ScaleOne(), self.Owner);
if Item == nil then
UGCLogSystem.Log("[ActorPool:Init] 无法创建出来对应 Actor%s", tostring(InClass));
return;
end
local Index = #self.ActorMap + 1;
self.ActorMap[Index] = Item;
self.ActorUseMap[UE.GetName(Item)] = false;
if InFunc ~= nil and type(InFunc) == 'function' then
InFunc(Item, Index);
end
end
UGCLogSystem.LogTree(string.format("[ActorPool:Init] self.ActorMap ="), self.ActorMap)
return self.ActorMap;
end
--- 客户端初始化
function ActorPool:ClientInit(InTable)
end
--- 拿出一个使用
---@param InFunc fun(InActor: AActor)
---@return AActor | nil
function ActorPool:Pop(InFunc)
-- 直接拿出一个即可
for i, v in pairs(self.ActorMap) do
if not self:IsActorInUse(v) then
self.ActorUseMap[UE.GetName(v)] = true;
table.func(InFunc, v);
return v;
end
end
return nil;
end
--- 返还一个
---@param InActor AActor
---@param InFunc fun(InActor: AActor)
function ActorPool:Push(InActor, InFunc)
local Name = UE.GetName(InActor)
if not self.ActorUseMap[Name] then return false; end
table.func(InFunc, InActor);
self.ActorUseMap[Name] = false;
return true;
end
---@param InActor AActor
---@return boolean
function ActorPool:IsActorInUse(InActor)
return self.ActorUseMap[UE.GetName(InActor)];
end
---@return int32 获取当前已经使用的数量
function ActorPool:GetUsedCount()
local Count = 0;
for i, v in pairs(self.ActorUseMap) do
if v then Count = Count + 1; end
end
return Count;
end
---@return int 获取当前还未使用的数量
function ActorPool:GetNoUseCount()
return self.ActorCount - self:GetUsedCount();
end
--- 清空池子
function ActorPool:Clear()
for i, v in pairs(self.ActorMap) do
v:K2_DestroyActor();
end
self.ActorMap = {};
self.ActorUseMap = {};
self.ActorCount = 0;
end
--function ActorPool:SendRPC(FuncName, ...)
-- self.Owner:SendActorPoolRPC(FuncName, ...);
--end
return ActorPool;