29、缓存池的编写
由于unity中物体的销毁是在内存满了之后才执行的,所以当资源很多时,就会造成内存的消耗,因此采用缓存池的方法,就可以很好的解决。新建PoolManager.cs
![](https://i-blog.csdnimg.cn/blog_migrate/d3fc34d23287ad30a7c34674f784bd1a.png)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PoolManager
{
// 创建单例
private static PoolManager instance;
public static PoolManager Instance
{
get
{
if (instance == null)
{
instance = new PoolManager();
}
return instance;
}
}
private GameObject poolObj;
// 预制体=>实例化后的具体游戏物体
private Dictionary<GameObject, List<GameObject>> poolDataDic = new Dictionary<GameObject, List<GameObject>>();
/// <summary>
/// 从缓存池中获取第一个obj
/// </summary>
/// <param name="prefab"></param>
/// <returns></returns>
public GameObject GetObj(GameObject prefab)
{
GameObject obj = null;
// 如果字典中存在预制体这个key并且数量大于0
if (poolDataDic.ContainsKey(prefab) && poolDataDic[prefab].Count > 0)
{
// 返回list的第一个
obj = poolDataDic[prefab][0];
// 同时移除第一个
poolDataDic[prefab].RemoveAt(0);
}
else
{
obj = GameObject.Instantiate(prefab);
}
obj.SetActive(true);
// 让其没有父物体
obj.transform.SetParent(null);
return obj;
}
public void PushObj(GameObject prefab, GameObject obj)
{
// 判断是否有根目录,没有则创建一个空游戏物体作为根
if (poolObj == null) poolObj = new GameObject("poolObj");
// 存在这个key
if (poolDataDic.ContainsKey(prefab))
{
// 把物体放进去
poolDataDic[prefab].Add(obj);
}
else
{
// 创建这个预制体的缓存池数据
poolDataDic.Add(prefab,new List<GameObject>(){obj});
}
// 如果根目录下没有预制体命名的子物体
if (poolObj.transform.Find(prefab.name) == false)
{
// 则创建,并且父节点是poolObj
new GameObject(prefab.name).transform.SetParent(poolObj.transform);
}
// 隐藏
obj.SetActive(false);
// 设置父物体为根目录下的该预制体
obj.transform.SetParent(poolObj.transform.Find(prefab.name));
}
// 清除所有的数据
public void Clear()
{
poolDataDic.Clear();
}
}
接下来就是让一些游戏中随时需要实例化和销毁的物体,满足缓存池的要求。
30、阳光的缓存池应用
首先修改来自太阳花的阳光
![](https://i-blog.csdnimg.cn/blog_migrate/a3334fe1e77fd19b4b17fec3f81d726b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ad811948d5b077cf7d46c0e9e977d499.png)
然后是销毁,这里并不是真正的销毁了,而是放进缓存池,也就是改变它的父物体,并且可见设置为false
![](https://i-blog.csdnimg.cn/blog_migrate/ddb962e52ea414002ae14f0941a9b02c.png)
最后就是来自天空阳光的修改
![](https://i-blog.csdnimg.cn/blog_migrate/daa422a91502e022a7fd64addbbe0366.png)
显然就是改变了前两行代码,也就是从缓存池中取出来实例阳光,第3、4行代码就是生成下落的位置,所以在初始化时不需要传入位置等信息了,这样阳光的修改就结束了。
测试
![](https://i-blog.csdnimg.cn/blog_migrate/f3951594e4695909a95b84d5b982de62.gif)