local ActorPool = {}; ---@type int32 当前使用的 Actor ActorPool.ActorCount = 0; ---@type AActor ActorPool.Owner = nil; ---@type UClass 子项函数 ActorPool.ItemClass = nil; ---@type table ActorPool.ActorMap = {}; ---@type table 是否使用列表 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;