当前位置:首页 >> 技术栈专业化分层 >> 【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG,百度AI伙伴智造未来

【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG,百度AI伙伴智造未来

cpugpu芯片开发光刻机 技术栈专业化分层 1
文件名:【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG,百度AI伙伴智造未来 【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

⭐🅰️⭐

文章目录 ⭐🅰️⭐⭐前言⭐🎶(==1==) 未添加缓存池之前🎶(==2==) 添加缓存池后🎶(==3==)缓存池 脚本⭐🅰️⭐


⭐前言⭐ 添加缓存池的本质其实就是资源的循环利用,减少多次CG。也就是说,当我们需要销毁一个物体的时候我们需要用到的story,但是多次的destroy,它会触发我们的CG回收,那此时我们如果说用一个列表或者是字典。形成了一个缓存池,让他临时存放,我们需要多次销毁的一个物体的话,那么它就避免了多次产生C机的回收机制。此时我们可以选择让存进去的物体失活,需要的时候再激活,把它存取出来,让就可以进行一个循环的利用。
🎶(1) 未添加缓存池之前


🎶(2) 添加缓存池后


🎶(3)缓存池 脚本
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Events;/// <summary>/// 抽屉数据 /// </summary>public class PoolData{//抽屉中 对象挂载的父节点public GameObject fatherObj;//对象的容器public List<GameObject> poolList;public PoolData(GameObject obj, GameObject poolObj){//给我们的抽屉 创建一个父对象 并且把他作为我们pool(衣柜)对象的子物体fatherObj = new GameObject(obj.name);fatherObj.transform.parent = poolObj.transform;poolList = new List<GameObject>() {};PushObj(obj);}/// <summary>/// 往抽屉里面 压都东西/// </summary>/// <param name="obj"></param>public void PushObj(GameObject obj){//失活 让其隐藏//obj.SetActive(false); //可放在外部去激活//存起来poolList.Add(obj);//设置父对象obj.transform.parent = fatherObj.transform;}/// <summary>/// 从抽屉里面 取东西/// </summary>/// <returns></returns>public GameObject GetObj(Transform parent) //参数为需要设置的父对象{GameObject obj = null;//取出第一个obj = poolList[0];//对物体的Y轴进行约束obj.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionY;poolList.RemoveAt(0);//激活 让其显示obj.SetActive(true);//断开了父子关系obj.transform.SetParent(parent);return obj;}}/// <summary>/// 缓存池模块 /// </summary>public class PoolManager : SingleManager <PoolManager>{//缓存池容器 (衣柜)public Dictionary<string, PoolData> poolDic = new Dictionary<string, PoolData>();private GameObject poolObj;/// <summary>/// 从缓存池中拿东西/// </summary>/// <param name="名字"></param>/// <param parent="挂载的父对象"></param>/// <param position="实例化的位置"></param>/// <param rotation="实例化的角度"></param>/// <param callBack="委托"></param>public void GetObj(string name, Transform parent, UnityAction<GameObject> callBack) //第三个参数为挂载的父对象{if(poolDic.ContainsKey(name) && poolDic[name].poolList.Count > 0){callBack(poolDic[name ].GetObj(parent));}else{//同步加载GameObject obj = GameObject.Instantiate(ResManager.GetInstance().Load<GameObject>("prefabs/" + name));obj.name = name; callBack(obj); //返回实例化的物品给委托通过异步加载资源 创建对象给外部用//ResManager .GetInstance().LoadAsync<GameObject>("prefabs/"+name, (o) =>//{// o.name = name;// callBack(o);//});//obj = GameObject.Instantiate(Resources.Load<GameObject>(name));//把对象名字改的和池子名字一样//obj.name = name;}}/// <summary>/// 换暂时不用的东西给池子/// </summary>public void PushObj(string name, GameObject obj){if (poolObj == null)poolObj = new GameObject("Pool");//里面有抽屉if (poolDic.ContainsKey(name)){poolDic[name].PushObj(obj);}//里面没有抽屉else{ poolDic.Add(name, new PoolData(obj, poolObj));}}/// <summary>/// 清空缓存池的方法 /// 主要用在 场景切换时/// </summary>public void Clear(){poolDic.Clear();poolObj = null;}} ⭐🅰️⭐

⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

⭐【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

⭐【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、



协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接