• 知识点:Dictionary, List, GameObject
  • 作用: 节约性能, 减少CPU和内存消耗

image.png
没有缓存池,用完就删掉
有了缓存池,用完就放到缓存池(衣柜)
代码发现缓存池有,就不会实例化,而是使用缓存池中的对象
使用完后,又会放回到缓存池
image.png
“衣柜”中有不同的”抽屉”,只装对应的对象


代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// 缓存池模块
  6. /// 前置知识点:
  7. /// 1. Dictionary List
  8. /// 2. GameObject 和 Resources 两个公共类中的API
  9. /// </summary>
  10. public class PoolMgr : BaseManager<PoolMgr> // 单例模式
  11. {
  12. public Dictionary<string,List<GameObject>> poolDic = new Dictionary<string,List<GameObject>>();
  13. /// <summary>
  14. /// 往外拿东西
  15. /// </summary>
  16. /// <param name="name">规定预设体的路径作为抽屉的名字</param>
  17. /// <returns></returns>
  18. public GameObject GetObj(string name)
  19. {
  20. GameObject obj = null;
  21. // 有抽屉且抽屉里有东西
  22. if (poolDic.ContainsKey(name) && poolDic[name].Count > 0)
  23. {
  24. obj = poolDic[name][0];
  25. poolDic[name].RemoveAt(0); // 取出的从List中移除掉
  26. }
  27. else
  28. {
  29. // 抽屉里没有,则实例化一个新的返回出去
  30. // 规定预设体的路径作为抽屉的名字
  31. obj = GameObject.Instantiate(Resources.Load<GameObject>(name));
  32. obj.name = name; // 让对象的名字和外面传进来的名字一样,即资源路径名,也是我们规定的抽屉名,方便存进池子时获取名字
  33. }
  34. // 放进池子的对象是失活的,取出的时候要激活
  35. obj.SetActive(true);
  36. return obj;
  37. }
  38. /// <summary>
  39. /// 还暂时不用的对象
  40. /// </summary>
  41. public void PushObj(string name, GameObject obj)
  42. {
  43. // 放进池子就要失活
  44. obj.SetActive(false);
  45. // 里面有抽屉
  46. if (poolDic.ContainsKey(name))
  47. {
  48. poolDic[name].Add(obj);
  49. }
  50. // 里面没有抽屉
  51. else
  52. {
  53. poolDic.Add(name, new List<GameObject>() { obj });
  54. }
  55. }
  56. }

使用

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class TestObj : MonoBehaviour
  5. {
  6. // Update is called once per frame
  7. void Update()
  8. {
  9. if(Input.GetMouseButtonDown(0))
  10. {
  11. PoolMgr.GetInstance().GetObj("Test/Cube");
  12. }
  13. if (Input.GetMouseButtonDown(1))
  14. {
  15. PoolMgr.GetInstance().GetObj("Test/Sphere");
  16. }
  17. }
  18. }
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class DelayPush : MonoBehaviour
  5. {
  6. // 当对象激活时会进入的生命周期函数
  7. private void OnEnable()
  8. {
  9. Invoke("Push", 1);
  10. }
  11. void Push()
  12. {
  13. PoolMgr.GetInstance().PushObj(this.gameObject.name, this.gameObject);
  14. }
  15. }

作用

减小了GC的次数,内存换性能.