Unity中对象池的应用
2017-12-01 19:39
519 查看
当项目中需要大量频繁创建或者销毁物体,我们不需要不断Instantiate和destory,只需要控制物体的显隐,节省内存开销。如子弹的生成,游戏中怪物和特效的管理都可以用到对象池。
using UnityEngine; using System.Collections; using System.Collections.Generic; public class pool : MonoBehaviour { public static pool instance; //创建一个字典dic 键为子弹或敌人种类 值为列表 存放多个同样的子弹或敌人 public static Dictionary<string, List<GameObject>> dic = new Dictionary<string, List<GameObject>>(); void Awake() { instance = this; } //方法(函数):调用后会返回一个属于需要的种类(dic的key值(实际为key + "(Clone)"))的 敌人或子弹(即一个gameobject)。 //key是子弹或敌人预设体的名字,预设体放在Resources中 //方法名get(可以自定义) 返回值为 参数为(obj名(子弹 敌人种类 dic的key),激活位置,激活角度) public static GameObject Get(string key, Vector3 position, Quaternion rotation) { //输出预设体名(这个没用 就是输出来看看 就是NSLog) Debug.Log(key); //创建返回值对象 GameObject go; //拼接制作dic的key名,因为instantiate出的gameobject都会自动命名为gameobject(Clone),这里是为了通下面return方法里给key的命名匹配 string GameObjectName = key + "(Clone)"; //如果字典里有gameobjectname这个key 并且key对应的数组不为空(有该种类子弹,且该种类子弹中有《已经创建过的》(未激活)的子弹gameobject) if (dic.ContainsKey(GameObjectName) && dic[GameObjectName].Count > 0) { //从gameobjectname这个key位置取出数组 List<GameObject> list = dic[GameObjectName]; //取出一号位的子弹 go = list[0]; //从列表中去除这个子弹(拿出来用) list.RemoveAt(0); //将子弹gameobject激活 go.SetActive(true);//使用时激活 //参数赋值于子弹 go.transform.position = position; //参数赋值于子弹 go.transform.rotation = rotation; } //如果没有 else { // Debug.Log("chi" + key); //在给定位置创建一个resources中名为给定key的预设体的gameobject go = Instantiate(Resources.Load(key), position, rotation) as GameObject; } //返回创建的东西 return go; } //函数(方法) 名return(可自定义) 参数是需要取消激活的对象g //将需要取消激活的对象取消激活 public static GameObject Return(GameObject g) { //获取gameobject的名字,会是一个在上面get方法里创建的(预设体的)gameobject,名字会是gameobject(Clone); string key = g.name; //如果字典里有这个key if (dic.ContainsKey(key)) { //就在这个key所对应的数组中加入这个g (这个g就是已经用完的子弹,放到这个数组里的gameobjet都是不销毁只是取消激活等待再次利用的gameobject) dic[key].Add(g); } //如果没有这个key else { //建立一个这个key的arraylist 并把g加进去 dic[key] = new List<GameObject>() { g }; } //不销毁而是取消激活 g.SetActive(false); //返回g return g; } }
相关文章推荐
- Unity 对象池(Object Pooling)理解与简单应用
- unity - 对象池技术的实现与应用
- Unity中对象池的应用
- unity中背景渐变shader对贝塞尔曲线的应用
- Unity制作的应用在android平台上的发布步骤
- 利用Unity实现Vuforia SmartTerrain的简易应用
- Hololens入门之使用Unity开发一个简单的应用
- Unity射线应用(第三人称Demo制作)
- DataSnap数据库连接池,数据集对象池的应用
- unity-点乘和叉乘的应用
- 矩阵在图形学以及Unity中的应用
- Unity骨骼动力学应用
- Unity 4.2 最新版已支持 WP8 和 黑莓 手机应用、游戏导出
- Unity内存管理——对象池(Object-Pool)
- Unity应用架构设计(10)——绕不开的协程和多线程(Part 1)
- Unity 在MVC上的应用(中:Repository)
- [Unity游戏开发]向量在游戏开发中的应用(三)
- 将Unity发布的apk变成系统应用 禁止卸载
- unity vr ar手机应用集成谷歌广告Admob教程
- Unity 对象池