unity 对象池代码

对象池笔记

封装接口:

using System.Collections;
using System.Collections.Generic;

public interface IReusable  {

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

    //回收调用
    void OnUnSpawn();

}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class ReusableObject : MonoBehaviour, IReusable
{
    public abstract void OnSpawn();

    public abstract void OnUnSpawn();
}

子池的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;

public class SubPool
{
    //集合
    List<GameObject> m_objecs = new List<GameObject>();

    //预设
    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);
    
    }
}

大池子,通过这个池子存取

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoSingleton<ObjectPool> {

    /// <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);
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值