各种管理类---
对象缓冲池,对象管理类
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
}