网站建设 今晟网络,关键词竞价广告,移动应用开发技术有哪些,百度网盘下载#x1f468;#x1f4bb;个人主页#xff1a;元宇宙-秩沅
#x1f468;#x1f4bb; hallo 欢迎 点赞#x1f44d; 收藏⭐ 留言#x1f4dd; 加关注✅!
#x1f468;#x1f4bb; 本文由 秩沅 原创
#x1f468;#x1f4bb; 收录于专栏#xff1a;Uni… 个人主页元宇宙-秩沅
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 ListGameObject poolList;public PoolData(GameObject obj, GameObject poolObj){//给我们的抽屉 创建一个父对象 并且把他作为我们pool(衣柜)对象的子物体fatherObj new GameObject(obj.name);fatherObj.transform.parent poolObj.transform;poolList new ListGameObject() {};PushObj(obj);}/// summary/// 往抽屉里面 压都东西/// /summary/// param nameobj/parampublic void PushObj(GameObject obj){//失活 让其隐藏//obj.SetActive(false); //可放在外部去激活//存起来poolList.Add(obj);//设置父对象obj.transform.parent fatherObj.transform;}/// summary/// 从抽屉里面 取东西/// /summary/// returns/returnspublic GameObject GetObj(Transform parent) //参数为需要设置的父对象{GameObject obj null;//取出第一个obj poolList[0];//对物体的Y轴进行约束obj.GetComponentRigidbody().constraints RigidbodyConstraints.FreezePositionY;poolList.RemoveAt(0);//激活 让其显示obj.SetActive(true);//断开了父子关系obj.transform.SetParent(parent);return obj;}
}/// summary
/// 缓存池模块
/// /summary
public class PoolManager : SingleManager PoolManager
{//缓存池容器 衣柜public Dictionarystring, PoolData poolDic new Dictionarystring, PoolData();private GameObject poolObj;/// summary/// 从缓存池中拿东西/// /summary/// param name名字/param/// param parent挂载的父对象/param/// param position实例化的位置/param/// param rotation实例化的角度/param/// param callBack委托/parampublic void GetObj(string name, Transform parent, UnityActionGameObject callBack) //第三个参数为挂载的父对象{if(poolDic.ContainsKey(name) poolDic[name].poolList.Count 0){callBack(poolDic[name ].GetObj(parent));}else{//同步加载GameObject obj GameObject.Instantiate(ResManager.GetInstance().LoadGameObject(prefabs/ name));obj.name name; callBack(obj); //返回实例化的物品给委托通过异步加载资源 创建对象给外部用//ResManager .GetInstance().LoadAsyncGameObject(prefabs/name, (o) //{// o.name name;// callBack(o);//});//obj GameObject.Instantiate(Resources.LoadGameObject(name));//把对象名字改的和池子名字一样//obj.name name;}}/// summary/// 换暂时不用的东西给池子/// /summarypublic 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/// 清空缓存池的方法 /// 主要用在 场景切换时/// /summarypublic void Clear(){poolDic.Clear();poolObj null;}
}
⭐️⭐ ⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习 你们的点赞 收藏⭐ 留言 关注✅是我持续创作输出优质内容的最大动力、