using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Common
{
/// <summary>
/// 使用方式 创建对象GameObjectPool.Instance.CreateObject(类别,预制件,位置,旋转)
/// 回收对象GameObjectPool.Instance.CollectObject(游戏对象,延迟回收时间默认为0)
/// 销毁某类别对象GameObjectPool.Instance.Clear(类别)
/// 销毁全部对象GameObjectPool.Instance.ClearAll()
/// </summary>
public class GameObjectPool : MonoSingleton<GameObjectPool>
{
//可重置 需要创建完重置的数据来实现此接口
public interface IResetable
{
void OnRest();
}
//字典集合来存储物体
private Dictionary<string, List<GameObject>> cache;
//单例初始化方法
public override void Init()
{
base.Init();
cache = new Dictionary<string, List<GameObject>>();
}
/// <summary>
/// 通过对象池 创建对象 对外提供的方法
/// </summary>
/// <param name="key">类别</param>
/// <param name="prefab">需要创建的预制件</param>
/// <param name="pos">需要创建的位置</param>
/// <param name="rotate">需要创建的旋转</param>
/// <returns></returns>
public GameObject CreateObject(string key,GameObject prefab,Vector3 pos,Quaternion rotate)
{
//根据类别查找对象
GameObject go = go = FindUsableObject(key);
//如果对象不是空的,向池中添加
if (go == null)
{
go = AddObject(key, prefab);
}
//使用对象
UseObjuct(pos, rotate, go);
return go;
}
//使用对象
private static void UseObjuct(Vector3 pos, Quaternion rotate, GameObject go)
{
go.transform.position = pos;
go.transform.rotation = rotate;
go.SetActive(true);
go.GetComponents<IResetable>();
foreach (var item in go.GetComponents<IResetable>())
{
item.OnRest();
}
}
//向池中添加对象
private GameObject AddObject(string key, GameObject prefab)
{
//创建对象
GameObject go = Instantiate(prefab);
//如果池中没有 key 则添加记录
if (cache.ContainsKey(key))
cache[key].Add(go);
else
{
cache.Add(key, new List<GameObject>());
cache[key].Add(go);
}
return go;
}
//查找制定类别中可以使用的对象
private GameObject FindUsableObject(string key)
{
if (cache.ContainsKey(key))
return cache[key].Find(g => !g.activeInHierarchy);
return null;
}
/// <summary>
/// 回收对象
/// </summary>
/// <param name="go">需要被回收的对象</param>
/// <param name="delay">延迟时间,不填默认为0</param>
public void CollectObject(GameObject go,float delay=0)
{
StartCoroutine(CollectObjectDelay(go, delay));
}
private IEnumerator CollectObjectDelay(GameObject go,float delay)
{
yield return new WaitForSeconds(delay);
go.SetActive(false);
}
//清空某个类别的游戏对象
public void Clear(string key)
{
//清空时候不是清空键值,而是清空值所对应的对象
for (int i = cache[key].Count-1; i >= 0; i--)
{
Destroy(cache[key][i]);
}
//foreach (var item in cache[key])
//{
// Destroy(item);
//}
cache.Remove(key);
}
//清空全部
public void ClearAll()
{
//将池中所有的键给到清空类别进行清空
//会异常,无效的操作 cache.Remove(key)删除一个键,这时候cache[key].Count=0
//foreach (var key in cache.Keys)
//{
// Clear(key);
//}
//将字典的键用集合存起来 遍历集合
foreach (var key in new List<string>(cache.Keys))
{
Clear(key);
}
}
}
}
Unity实用工具类(对象池)
最新推荐文章于 2023-08-04 13:06:23 发布