Unity3D对象池技术(ObjectPool)小例子
2017-06-01 14:31
375 查看
ObjectPool 对象池脚本
这里面用继承单例框架脚本,此脚本在我的另一篇博客上单例框架脚本
using UnityEngine; using System.Collections; using System.Collections.Generic; public class ObjectPool : SingleTon<ObjectPool> { //创建一个池子来存储这些对象(用字典的形式来区分不同类型) private IDictionary<string,List<GameObject>>pool;//key用来存池子名称,value用list存游戏对象,我们用来叫做pool //实例化我的对象池 public ObjectPool(){ pool = new Dictionary<string, List<GameObject>> (); } //======== //对象池无非两种一个是存,一个是取 //======== /// <summary> /// 获取对象 /// </summary> public GameObject GetObj(string objName,Vector3 pos,Quaternion qua){ //要获取的对象 GameObject currentObj=null; //判断是否有该类型的对象池,如果包含这个对象池 if(pool.ContainsKey(objName)){ //再判断对象池中是否有东西 if(pool[objName].Count>0){ //获取当前对象 currentObj=pool[objName][0];//从第0号开始 //从池中移除 pool[objName].Remove(currentObj); } } //如果没有该类型对象池 //如果对象为空 if (currentObj == null) { //找一个继承mono的单例 currentObj = GameManager.instance.LoadObj (objName); } currentObj.transform.position = pos; currentObj.transform.rotation = qua; //激活对象 currentObj.SetActive(true); return currentObj; } /// <summary> /// 保存对象 /// </summary> public void SetObj(GameObject go){ //取消激活对象 go.SetActive (false);//对象要进入对象池里,不要对游戏产生影响,所以先设置为非激活 //获取对象池名称 string objPoolName = go.name.Replace ("(Clone)", "");//replace(替换)把带有clone的文件替换 //判断这个池子里是否有存在 //如果该类型的对象池存在 if (pool.ContainsKey (objPoolName)) { //将对象保存到对象池 pool [objPoolName].Add (go); //否则该类型的对象池不存在 } else { //创建对象池,并保存对象到对象池 pool.Add(objPoolName,new List<GameObject>(){go}); } } }
GameManager对象管理脚本
using UnityEngine; using System.Collections; using System.Collections.Generic; public class GameManager : MonoBehaviour { public static GameManager instance; void Awake(){ //单例脚本跟单例类的区别是,单例脚本要挂载到游戏对象上 instance = this; } void Update(){ if (Input.GetKeyDown (KeyCode.Space)) { ObjectPool.GetInstance ().GetObj ("Sphere", Vector3.zero, Quaternion.identity); } } /// <summary> ///加载并生成预设体的方法 /// </summary> /// <returns>The object.</returns> public GameObject LoadObj(string objName){ //加载预设体 GameObject currentPrefab = Resources.Load<GameObject> ("Prefabs/" + objName); return Instantiate (currentPrefab); } }
SphereObj 脚本(主要是协程)
using UnityEngine; using System.Collections; using System.Collections.Generic; public class SphereObj : MonoBehaviour { void OnEnable(){ StartCoroutine (Recycle());//设为非激活证明他启用,那么他既是开始 } IEnumerator Recycle(){ yield return new WaitForSeconds (2f); ObjectPool.GetInstance ().SetObj (gameObject); } }
相关文章推荐
- Unity3D内存管理——对象池(Object Pool)
- Unity3D内存管理——对象池(Object Pool)
- Unity3D之对象池(Object Pool)
- Unity3D-对象池GameObjectPool
- Unity3D内存管理——对象池(Object Pool)
- [译]Unity3D内存管理——对象池(Object Pool)
- Unity3D内存管理——对象池(Object Pool)
- Unity3D内存管理——对象池(Object Pool)
- Unity3d中对象池(ObjectPool)的实现思路
- Java通用对象池GenericObjectPool<T>原理总结和自定义的Jedis管理池例子
- Unity3d中对象池(ObjectPool)的概念和用法
- unity3D 内存管理——对象池(Object Pool)
- Unity3D内存管理——对象池(Object Pool)
- Unity3D内存管理——对象池(Object Pool)
- Unity3d中对象池(ObjectPool)的实现
- Unity3D内存管理——对象池(Object Pool)
- 设计模式之美:Object Pool(对象池)
- Java小对象的解决之道——对象池(Object Pool)的设计与应用
- Unity ----- 对象池GameObjectPool
- 对象池Object Pool