Lua实现的对象池,Unity

local PrefabObjectPool = {}
PrefabObjectPool.__index = PrefabObjectPool

function PrefabObjectPool.New(prefab,capcity)
	if prefab == nil then
		error("[PrefabObjectPool]prefab should not be nil")
	end
	local self = {}
	setmetatable(self,PrefabObjectPool)
	self.prefab = prefab
	self.queue = LuaQueue.New()
	self.usedItems = LuaList.New()
	self.capcity = capcity
	return self
end

-- 预先生成指定个数的对象
-- count 需要生成的个数,最大不能超过池大小,若为空则表示直接将池填充满
function PrefabObjectPool:Prewarm(count)
	if count == nil then
		if self.capcity == nil then
			error("[PrefabObjectPool]invalid state")
		else
			count = self.capcity
		end
	elseif count > self.capcity then
		count = self.capcity
	end

	for i=1,count do
		local obj =  GameObject.Instantiate(self.prefab)
		self:Put(obj)
	end
end

-- 回收一个对象到对象池
function PrefabObjectPool:Put(obj)
	if self.usedItems:Contains(obj) then
		self.usedItems:Remove(obj)
		obj:SetActive(false)
		self.queue:Enqueue(obj)
	else
		error("[PrefabObjectPool]invalid state")
	end
end

-- 从对象池中获取一个对象,若池为空的,则从Prefab创建一个新的
-- 当对象到达池上限时,会把最早使用的对象回收并作为新对象返回
function PrefabObjectPool:Get()
	local obj = nil
	if self.queue.Count == 0 then
		if self.usedItems.Count == self.capcity then
			obj = self.usedItems[0]
			obj:SetActive(false)
			self.usedItems:RemoveAt(0)
		else
			obj = GameObject.Instantiate(self.prefab)
		end
	else
		obj = self.queue:Dequeue()
	end

	self.usedItems:Add(obj)
	obj:SetActive(true)
	return obj
end

-- 将所有被使用的对象全部回收
function PrefabObjectPool:RecycleAll()
	local count = self.usedItems.Count
	for i=count-1,0, -1 do
		local item = self.usedItems[i]
		self:Put(item)
	end
	self.usedItems:Clear()
end

--清空对象池Destroy
function PrefabObjectPool:Clear()

	self:RecycleAll();

	for i = 0, self.queue.Count - 1 do
		GameObject.Destroy(self.queue:Dequeue());
	end

	self.queue:Clear();
end

return PrefabObjectPool

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值