对象池个人所用脚本----个人项目所用

/****************************************************
    文件:BaseManager.cs
	功能:管理类基类
*****************************************************/



public class BaseManager<T> where T : new()
{
    private static T _instance;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new T();
            }
            return _instance;
        }
    }
}

 

/****************************************************
    文件:PoolManager.cs
	功能:缓存池管理器
*****************************************************/

using UnityEngine;
using System.Collections.Generic;

public class PoolManager : BaseManager<PoolManager>
{
    private Transform PoolTrans;

    public Dictionary<string, PoolData> poolDict = new Dictionary<string, PoolData>();

    /// <summary>
    /// 从对象池中取
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public GameObject GetObj(string name)
    {
        GameObject obj = null;

        if (poolDict.ContainsKey(name) && poolDict[name].poolList.Count > 0)
        {
            obj = poolDict[name].GetObj();
        }
        else
        {
            obj = GameObject.Instantiate(Resources.Load<GameObject>(name));
        }

        if (obj != null)
        {
            //改名(去除 Clone)
            obj.name = name;
            obj.transform.SetParent(null);
            obj.SetActive(true);
        }
        return obj;
    }

    /// <summary>
    /// 回收对象池
    /// </summary>
    public void RecycleObj(string name, GameObject obj)
    {
        if (PoolTrans == null)
        {
            PoolTrans = new GameObject("#PoolTrans#").transform;
        }

        if (poolDict.ContainsKey(name))
        {
            poolDict[name].RecycleObj(obj);
        }
        else
        {
            poolDict.Add(name, new PoolData(obj, PoolTrans));
        }

    }

    /// <summary>
    /// 用于切换场景清理遗留
    /// </summary>
    public void Clear()
    {
        poolDict.Clear();
        PoolTrans = null;
    }
}

public class PoolData
{
    public GameObject parent;

    public List<GameObject> poolList;

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="obj">所要回收的对象</param>
    /// <param name="poolObj">对象池的最高节点</param>
    public PoolData(GameObject recycleObj, Transform poolNode)
    {
        parent = new GameObject("#" + recycleObj.name);
        parent.transform.SetParent(poolNode);
        poolList = new List<GameObject>();
        RecycleObj(recycleObj);
    }

    public GameObject GetObj()
    {
        GameObject obj = poolList[0];
        poolList.RemoveAt(0);
        return obj;
    }

    public void RecycleObj(GameObject recycleObj)
    {
        recycleObj.SetActive(false);
        poolList.Add(recycleObj);
        recycleObj.transform.SetParent(parent.transform);
    }
}
/****************************************************
    文件:TestFrame.cs
	功能:框架测试脚本
*****************************************************/

using UnityEngine;

public class TestFrame : MonoBehaviour 
{
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            PoolManager.Instance.GetObj("PoolTest/Cube");
        }

        if (Input.GetMouseButtonDown(1))
        {
            PoolManager.Instance.GetObj("PoolTest/Sphere");
        }

        if (Input.GetMouseButtonDown(2))
        {
            PoolManager.Instance.GetObj("PoolTest/Capsule");
        }
    }
}
/****************************************************
    文件:DelayPoolObj.cs
	功能:延迟池对象
*****************************************************/

using UnityEngine;

public class DelayPoolObj : MonoBehaviour 
{
    private void OnEnable()
    {
        Invoke("Delay", 1);
    }

    void Delay()
    {
        PoolManager.Instance.RecycleObj(this.gameObject.name, this.gameObject);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值