unity 对象池

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
///  泛型对象池 
/// </summary>
/// <typeparam name="T"></typeparam>
public class MyObjectPool<T>where T:class 
{
    public List<T> mObjectPool;      //对象池 
    public delegate T  NewDel();
    public NewDel mNewDel;          //新增对象委托
    public delegate void  ResetDel(T t);
    public ResetDel mResetDel;       //重置对象委托
    public MyObjectPool(NewDel newDel, ResetDel resetDel)  //初始化对象池
    {
        mObjectPool = new List<T>() ;
        mNewDel = newDel;
        mResetDel = resetDel;
    }
    public T GetObject()    //获取对象池中对象
    {
        if (mObjectPool.Count == 0) //当对象池中没有对象时,新建一个对象
        {
            T t = mNewDel();
            return t;
        }
        else {                                       //返回对象池中的对象
            T t = mObjectPool[mObjectPool.Count - 1];
            if (mResetDel != null)          //重置对象
            {
                mResetDel(t);
            }
            return t;
        }
    }
    public void Recycle(T t)             //回收对象
    {
        if (!mObjectPool.Contains(t))
            mObjectPool.Add(t);
    }
    public void Clear()                   //清空对象池
    {
        mObjectPool.Clear();
    }
}
///<summary>
///使用池子的测试类
///</summary>
public class Test : MonoBehaviour
{
    public GameObject ballet;										//子弹的预设体,在unity引擎中引用
    private MyObjectPool<GameObject> pool;
    void Start()
    {
        pool = new MyObjectPool<GameObject>(NewBallet, Reset);
    }

    //实例化新子弹的方法
    private GameObject NewBallet()
    {
        GameObject g = Instantiate(ballet) as GameObject;		//实例化新子弹,实例化过程中需要设置子弹的位置等初始化操作写在这
        return g;
    }
    //重置对象的方法,
    private void Reset(GameObject g)
    {
        g.transform.position = Vector3.zero;
        g.transform.rotation = Quaternion.identity;
        g.SetActive(true);					//从池子中取后将物体设为可见,也可用其他方法代替
        //......
    }
    //销毁对象的方法
    private void Destroy(GameObject g)
    {
        g.SetActive(false);							//放入池子前将物体设为不可见
        pool.Recycle(g);
    }
}



对于面试经常遇到的对象池问题,自己整理后,所写的一个对象池,做个记录!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值