【Unity植物大战僵尸】缓存池模块开发及阳光的缓存池应用(十六)

29、缓存池的编写

由于unity中物体的销毁是在内存满了之后才执行的,所以当资源很多时,就会造成内存的消耗,因此采用缓存池的方法,就可以很好的解决。新建PoolManager.cs
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、阳光的缓存池应用

首先修改来自太阳花的阳光
然后是销毁,这里并不是真正的销毁了,而是放进缓存池,也就是改变它的父物体,并且可见设置为false
最后就是来自天空阳光的修改
显然就是改变了前两行代码,也就是从缓存池中取出来实例阳光,第3、4行代码就是生成下落的位置,所以在初始化时不需要传入位置等信息了,这样阳光的修改就结束了。

测试

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~Lomiss~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值