C#对象池

@C#对象池

对资源的重复利用,减少实例化,

#需要一个接口
可以命名为 IReusable
public interface IReusable {

//取出时候调用
void OnSpawn();

//回收调用
void OnUnSpawn();

}

#需要一个抽象类,继承接口,把方法也进行抽象,以供其他类调用的时候重写
public abstract class ReusableObject : MonoBehaviour, IReusable
{
public abstract void OnSpawn();

public abstract void OnUnSpawn();

}
#接下来的这个类是供外界调用 在场景里边挂载的(要继承单例)
public class ObjectPool : MonoSingleton
{

/// <summary>
/// 资源目录
/// </summary>
public string ResourceDir = "";

Dictionary<string, SubPool> m_pools = new Dictionary<string, SubPool>();

//取出物体
public GameObject Spawn(string name,Transform trans) {
    SubPool pool = null;
    if (!m_pools.ContainsKey(name)) {
        RegieterNew(name,trans);
    }
    pool = m_pools[name];
   return  pool.Spawn();
}

//回收物体
public void Unspawn(GameObject go) {
    SubPool pool = null;
    foreach (var p in m_pools.Values) {
        if (p.Contain(go)) {
            pool = p;
            break;
        }
    }
    pool.UnSpawn(go);
}

//回收所有
public void UnspawnAll() {
    foreach (var p in m_pools.Values) {
        p.UnspawnAll();
    }
}

//清除所有
public void Clear()
{
    m_pools.Clear();
}

//新建一个池子
void RegieterNew(string names,Transform trans) {
    //资源目录
    string path = ResourceDir + "/" + names;
    //生成预制体
    GameObject go = Resources.Load<GameObject>(path);
    //新建一池子
    SubPool pool = new SubPool(trans ,go);
    m_pools.Add(pool.Name,pool);
}

}
#下面这个类是具体建对象池
public class SubPool
{
//集合
List m_objecs = new List();

//预设
GameObject m_prefab;

//父物体的位置
Transform m_parent;


//名字
public string Name
{
    get
    {
        return m_prefab.name;
    }
}

public SubPool(Transform parent, GameObject go)
{
    m_prefab = go;
    m_parent = parent;
}

//取出物体
public GameObject Spawn()
{
    GameObject go = null;
    foreach (var obj in m_objecs)
    {

        if (!obj.activeSelf)
        {
            go = obj;
        }
    }

    if (go == null)
    {
        go = GameObject.Instantiate<GameObject>(m_prefab);
        go.transform.parent = m_parent;
        m_objecs.Add(go);
    }
    go.SetActive(true);
    go.SendMessage("OnSpawn", SendMessageOptions.DontRequireReceiver);
    return go;
}

//回收物体
public void UnSpawn(GameObject go)
{
    if (Contain(go))
    {
        go.SendMessage("OnUnSpawn", SendMessageOptions.DontRequireReceiver);
        go.SetActive(false);
    }
}


//回收所有
public void UnspawnAll()
{
    foreach (var obj in m_objecs)
    {

        if (obj.activeSelf)
        {
            UnSpawn(obj);
        }
    }

}

//判断是否属于list里边
public bool Contain(GameObject  go) {

    return m_objecs.Contains(go);

}

猜你喜欢

转载自blog.csdn.net/weixin_44560436/article/details/86530730
今日推荐