该说的,上一篇也说了。话不多说,直接开肝。
unity对象池模块
先直接上源码:
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 对象池管理器
/// </summary>
public class PoolManager : SingleTon<PoolManager>
{
/// <summary>
/// 对象池字典
/// </summary>
private Dictionary<string, List<GameObject>> objectPool;
/// <summary>
/// 继承SingleTon且私有化无参构造,即相当于实现了单例
/// </summary>
private PoolManager()
{
//初始化对象池
objectPool = new Dictionary<string, List<GameObject>>();
}
/// <summary>
/// 从对象池中获取一个对象
/// </summary>
/// <param name="name">对象名称</param>
/// <returns></returns>
public GameObject GetObj(string name)
{
GameObject obj = null;
//判断池中是否有此对象
if (objectPool.ContainsKey(name) && objectPool[name].Count > 0)
{
obj = objectPool[name][0];
objectPool[name].RemoveAt(0);
}
else
{
obj = GameObject.Instantiate(Resources.Load<GameObject>(name));
obj.name = name;
}
obj.SetActive(true);
return obj;
}
/// <summary>
/// 从对象池中获取一个对象
/// </summary>
/// <param name="name"></param>
/// <param name="parent">放到的父物体</param>
/// <returns></returns>
public GameObject GetObj(string name, Transform parent)
{
GameObject obj = null;
//判断池中是否有此对象
if (objectPool.ContainsKey(name) && objectPool[name].Count > 0)
{
obj = objectPool[name][0];
objectPool[name].RemoveAt(0);
}
else
{
obj = GameObject.Instantiate(Resources.Load<GameObject>(name),parent);
obj.name = name;
obj.transform.localPosition = parent.localPosition;
}
obj.SetActive(true);
return obj;
}
/// <summary>
/// 对象回收方法
/// </summary>
/// <param name="obj"></param>
public void SetObj(GameObject obj)
{
if (obj == null)
{
return;
}
obj.SetActive(false);
//如果池子中有当前对象的键,直接回收
if (objectPool.ContainsKey(obj.name))
{
objectPool[obj.name].Add(obj);
}
//如果池子中没有当前对象的键,先建立池子再回收
else
{
objectPool.Add(obj.name, new List<GameObject>(){obj});
}
}
public void Clear()
{
objectPool.Clear();
}
}
再谈谈为什么要用对象池。
我们在游戏开发中经常会遇到需要不停创建和销毁物体的需求(比如无限滚动背包,射击类游戏的子弹等),如果每次创建和销毁物体我们都实实在在的去创建和销毁,那对cpu来说就是一场灾难了。
这个时候就要用到对象池,原理就是把创建的可能还会用到的对象在一个“缓存池”里存起来,用的时候从里面拿,不用了再放回去。这样就可以做到复用这些对象,而不用一直创建销毁。
当然还能优化和细分,这我就不展开了。
下一篇,我打算归置观察者模式——事件中心模块。
下一篇——Unity程序框架总结归置系列(3)——事件中心