2
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Game
{
public delegate void PoolItemInitHandler<in TItem>(TItem item);
public class ObjectPoolItemBase : MetaDataHandler
{
public bool IsAlive;
public void Create()
{
if (IsAlive) return;
IsAlive = true;
OnCreate();
CreateBind();
}
public void Destroy()
{
if (!IsAlive) return;
IsAlive = false;
OnDestroy();
ClearBind();
}
protected virtual void OnCreate()
{
}
protected virtual void OnDestroy()
{
}
}
public class ObjectPoolBase<TManager> : ManagerBase<TManager> where TManager : new()
{
public GameObject Root;
protected Dictionary<object, List<ObjectPoolItemBase>> ObjectPool;
public override void OnInit()
{
ObjectPool = new Dictionary<object, List<ObjectPoolItemBase>>();
CreateRoot(typeof(TManager).Name);
}
private void CreateRoot(string rootName)
{
Root = new GameObject(rootName);
Object.DontDestroyOnLoad(Root);
}
protected T Create<T>(object objType, PoolItemInitHandler<T> callback)
where T : ObjectPoolItemBase, new()
{
var pool = EnSureGetPool(objType);
foreach (var obj in from obj in pool where !obj.IsAlive select obj as T)
{
obj.Create();
return obj;
}
var newObj = new T();
pool.Add(newObj);
callback?.Invoke(newObj);
newObj.Create();
return newObj;
}
protected void PreCreate<T>(object objType, PoolItemInitHandler<T> callback, int num)
where T : ObjectPoolItemBase, new()
{
var pool = EnSureGetPool(objType);
for (var _ = 0; _ < num; _++)
{
var newObj = Create(objType, callback);
newObj.Destroy();
}
}
protected List<ObjectPoolItemBase> EnSureGetPool(object objType)
{
if (!ObjectPool.ContainsKey(objType)) ObjectPool[objType] = new List<ObjectPoolItemBase>();
return ObjectPool[objType];
}
}
}