2025-01-04 23:00:19 +08:00

111 lines
3.0 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;