管理类(三)-- 对象缓冲池

各种管理类--- 对象缓冲池,对象管理类

1.继承自 MonoBehaviour的单例基类


using UnityEngine;
using System.Collections;

//继承MonoBehaviour 的单例模版,别的脚本可以直接用,省去七行代码
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    #region 单例

    private static T instance;

    public static T Instance {
        get {
            if (instance == null) {
                GameObject obj = new GameObject (typeof(T).Name);
                instance = obj.AddComponent<T> ();
            }
            return instance;
        }
    }

    #endregion

    protected virtual void Awake ()
    {
        instance = this as T;
    }

}

2. 对象池基类接口类
public interface IReuse {
    void Spawn();
    void UnSpawn();
}

3.资源加载类
using UnityEngine;
using System.Collections;

// 通过用户传递进来的枚举值, 自动的分析出该枚举值对应的资源在哪个路径下.
public class LoadResourcesMgr : Singleton<LoadResourcesMgr>
{
    // 面向用户的方法:  方法名<T>指定类型
    /// <summary>
    /// 返回用户需要的资源.
    /// </summary>
    /// <param name="enumName">Enum name.</param>
    /// <typeparam name="T">The 1st type parameter.</typeparam>
    public T LoadObject<T> (object enumName) where T : Object
    {
        // 获取枚举类型的字符串形式
        string enumType = enumName.GetType ().Name;

        //空的字符串
        string filePath = string.Empty;

        switch (enumType) {

        case "cube":   
            {
                filePath = "cube/" + enumName.ToString ();
                break;
            }
        default:
            {
                break;
            }
        }
        return Resources.Load<T> (filePath);
    }
}

4.池子类
using UnityEngine;
using System.Collections;
using System.Collections.Generic;


//一个池子类
public class SubPool
{
    #region 字段

    // 这个list链表存放该池子内的所有对象
    List<GameObject> m_subPool = new List<GameObject> ();
    // 池子中预设体的预设体类型.
    GameObject m_prefab;

    #endregion

    #region 属性

    // 当前池子里预设体的名称
    public string Name {
        get {
            return m_prefab.name;
        }
    }

    #endregion

    #region 构造方法

    // 外部可以通过传入一个预设体构造一个池子.
    // 但是池子是什么时候创建的呢?
    // 调用这个方法也没有new一个池子啊.
    public SubPool (GameObject prefab)
    {
        m_prefab = prefab;
    }

    //激活池子里对象的方法
    public GameObject Spawn ()
    {
        //由于接受对象的一个空对象
        GameObject obj = null;
        //遍历池子
        foreach (GameObject go in m_subPool) {
            //如果该对象没有被激活
            if (go.activeSelf == false) {
                //取出来
                obj = go;
                break;
            }
        }

        //obj为空的话,表示池子里面的对象全部被激活了,或者是没有多余的对象了
        if (obj == null) {
            //那么就实例化一个对象,并添加到池子里面
            obj = GameObject.Instantiate (m_prefab) as GameObject;
            m_subPool.Add (obj);
        }

        // 从池子取出对象以后, 就要将激活他.
        obj.SetActive (true);
        // 这里获取池子对象中的接口方法, 如果有才调用.
        //iReuse.Spawn这个方法是池子里对象本身自带的接口方法,当对象被激活的时候,调用
        //里面可以写一些特效,音效等
        IReuse iReuse = obj.GetComponent<IReuse> ();
        //不为空的时候才会调用,为空的话直接跳过
        if (iReuse != null) {
            iReuse.Spawn ();
        }
        return obj;
    }

    //隐藏池子里被激活的对象
    public void UnSpawn (GameObject obj)
    {
        //如果池子里包含该对象
        if (m_subPool.Contains (obj)) {
            //调用消失对象的方法
            IReuse iReuse = obj.GetComponent<IReuse> ();
            if (iReuse != null) {
                iReuse.UnSpawn ();
            }
            //隐藏对象
            obj.SetActive (false);
        }
    }

    //隐藏池子里全部的对象
    public void UnSpawnAll ()
    {
        //遍历池子
        foreach (GameObject obj in m_subPool) {
            //如果对象是被激活状态
            if (obj.activeSelf) {
                //直接点用上面隐藏对象的方法,隐藏该对象
                UnSpawn (obj);
            }
        }
    }

    //判断是包含是否存在该对象的方法,返回一个bool值
    public bool Contains (GameObject go)
    {
        return m_subPool.Contains (go);
    }

    #endregion
}

5.池子管理类
using UnityEngine;
using System.Collections.Generic;

//池子管理类,继承自MonoBehaviour的单例
public class ObjectPoolCtrl : MonoSingleton<ObjectPoolCtrl>
{

    #region 字段

    // 用字典定义总池子,<池子名称,类型>
    Dictionary<string, SubPool> m_pools = new Dictionary<string, SubPool> ();

    #endregion

    #region 面向用户的方法

    //判断子池子,添加子池子,激活子池子里面对象的方法
    public GameObject Spawn (object name)
    {
        SubPool subPool;
        // 如果总的池子中, 不含有子池子的名称
        if (!m_pools.ContainsKey (name.ToString ())) {
            //注册池子
            RegisterSubPools (name);
        }
        // 将刚刚创建好的子池子放入到大池子中
        subPool = m_pools [name.ToString ()];
        return subPool.Spawn ();//返回子池子里激活池子里面对象的方法
    }

    //注册池子的方法
    private void RegisterSubPools (object name)
    {
        //通过动态加载类加载对象,传入的是池子名称,池子名称跟池子里面对象的名吃应该是一致的
        GameObject prefab = LoadResourcesMgr.Instance.LoadObject<GameObject> (name);
        print (prefab);
        //创建新池子
        SubPool subPool = new SubPool (prefab);
        //将新池子添加到总池子字典中
        m_pools.Add (subPool.Name, subPool);
    }

    public void UnSpawn (GameObject obj)
    {
        //遍历总池子里面的所有池子
        foreach (SubPool pool in m_pools.Values) {
            if (pool.Contains (obj)) {         // 这里是比对的两个对象完全相等.
                pool.UnSpawn (obj);        //隐藏对象
                break;
            }
        }
    }
    // 清空所有池子的方法
    public void UnSpawnALl ()
    {
        foreach (SubPool pool in m_pools.Values) {
            pool.UnSpawnAll ();
        }
    }
    #endregion
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值