作用:游戏中会有很多 Manager,使用 BaseManager 减少程序中对于单例模式的书写,节省时间
登录后复制
public class BaseManager<T> where T : new() //创建泛型类型,指定 T 必须为带有空参构造函数的类型
{
private static T m_Instance;
public static T GetInstance()
{
if (m_Instance == null)
{
m_Instance = new T();
}
return m_Instance;
}
}
之后如果有需要用单例模式的类,只需要继承此类就可以
在游戏进行的时候,我们写的代码可能会实例化 (Instantiate) 很多对象,这时,程序就会在内存中不停的分配内存,一般,我们会在对象使用完之后,对它进行 Destory() 操作,比如子弹,特效,但是这个 Destory() 操作,并不是真的把对象在内存中的分配回收掉,只是把对象在场景中删除了,它只是将对象与内存空间之间的引用删除了,意思就是,此对象在内存中分配的资源依然被占用着。C#中有垃圾回收机制 GC ,这个GC在什么时候调用呢,它会等到内存一直被分配满,直到没有内存空间的时候,才会进行垃圾回收,这个时候,GC 就会进行大量的计算,分辨哪个对象没有被引用,再进行回收释放操作,这样出现的问题就是,性能会被很大的消耗,设备不好的情况下,容易出现卡顿,延迟,如果GC的回收次数比较频繁,则出现卡顿的情况会增多,用户的体验感就会下降所以,我们需要缓存池模块,缓存池模块可以有效的减缓GC的调用频率
拿衣柜举例子,我们需要衣服的时候,就从里面去,不需要的时候就放进去
登录后复制
/// <summary>
/// 容器类,将poolmanager的List替换掉
/// </summary>
public class PoolData
{
public GameObject m_FatherObj; //用于放置在Pool下的抽屉
public List<GameObject> m_PoolList;
/// <summary>
/// 初始化容器
/// </summary>
/// <param name="obj"></param>
/// <param name="pool"></param>
public PoolData(GameObject obj,GameObject poolObj)
{
//给我们的抽屉创建一个父对象,并且作为Pool(衣柜)的子对象
m_FatherObj = new GameObject(obj.name); //新建一个 fatherobj对象
m_FatherObj.transform.SetParent(poolObj.transform); //将此父节点设置为Pool的对象
m_PoolList = new List<GameObject>();
PushObject(obj);
}
/// <summary>
/// 往抽屉里面放东西
/// </summary>
/// <param name="obj"></param>
public void PushObject(GameObject obj)
{
//存东西
m_PoolList.Add(obj);
//让其隐藏
obj.SetActive(false);
//设置父对象
obj.transform.SetParent(m_FatherObj.transform);
}
/// <summary>
/// 从抽屉取东西
/// </summary>
public GameObject GetObject()
{
GameObject obj = null;
//取出第一个
obj = m_PoolList[0];
m_PoolList.RemoveAt(0);
//激活
obj.SetActive(true);
//断开父子关系
obj.transform.parent = null;
return obj;
}
}
/// <summary>
/// 缓存池模块
/// </summary>
public class PoolManager : BaseManager<PoolManager>
{
//创建对象池
public Dictionary<string, PoolData> m_PoolDic = new Dictionary<string, PoolData>();
private GameObject m_PoolObj; //场景面板里存放所有对象池对象的根对象
/// <summary>
/// 从对象池当中获取对象
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public GameObject GetObject(string name)
{
GameObject obj = null;
//如果对象池当中,有池子,并且池子中物品的数量大于0
if (m_PoolDic.ContainsKey(name) && m_PoolDic[name].m_PoolList.Count > 0)
{
obj = m_PoolDic[name].GetObject();
}
else //对象池里没有这个对象
{
obj = GameObject.Instantiate(Resources.Load<GameObject>(name)); //创建这个对象
obj.name = name; //将对象的名称改为路径名称
}
return obj;
}
/// <summary>
/// 将对象放回对象池
/// </summary>
/// <param name="name"></param>
/// <param name="obj"></param>
public void PushObject(string name, GameObject obj)
{
if (m_PoolObj == null)
m_PoolObj = new GameObject("Pool");
//对象池里有这个池子
if (m_PoolDic.ContainsKey(name))
{
m_PoolDic[name].PushObject(obj); //放入池子
}
else //没有池子
{
m_PoolDic.Add(name, new PoolData(obj,m_PoolObj)); //创建一个新池子,将对象放入
}
}
/// <summary>
/// 在切换场景的时候使用
/// 清空当前场景里的对象和对象池
/// </summary>
public void Clean()
{
m_PoolDic.Clear();
m_PoolObj = null;
}
}
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删