Unity3D对象池小案例


对象池的概念:在激活对象时,它从池中提取。在停用对象时,它放回池中,等待下一个请求。(来自百度);

背景:跑酷游戏,道路上有障碍物,角色身后的障碍物消失,角色前面随机生成障碍物

你所需要的最基本的三样东西:

 

1、一个池子:用来装你所需的物品,和回收物品;

2、一个取物品的方法;

3、一个放物品的方法;

有这3样东西,你就可以建造对象池了

以下是完整的代码部分,里面有详细的注释

 

[csharp]  view plain  copy
 
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4.   
  5.   
  6. public class GameObjectPool : MonoBehaviour {  
  7.   
  8.     // Use this for initialization  
  9.   
  10.     //单例模式,如果不知道的话可以百度一下,这里不解释了,因为水平有限  
  11.     public static GameObjectPool instance;  
  12.       
  13.     //下面这句是用字典构造你的池子,字典里的String就是坑的名字,每一个坑对应一个GameObject列表  
  14.     Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>() { };  
  15.   
  16.     void Start () {  
  17.         instance = this;//单例模式  
  18.     }  
  19.   
  20.     //从池子得到物体的方法,传递两个参数,你需要得到的物体,和你需要放置的位置  
  21.     //你所需的物体应该已经制作成预置物体  
  22.     public GameObject GetPool(GameObject go,Vector3 position)  
  23.     {  
  24.         string key = go.name+"(Clone)";//要去拿东西的坑名字  
  25.   
  26.         GameObject rongqi; //你用来取物体的容器;  
  27.   
  28.   
  29.         //下面分三种情况来分析  
  30.         if (pool.ContainsKey(key) && pool[key].Count > 0)//如果坑存在,坑里有东西  
  31.         {   
  32.             //直接拿走坑里面的第一个  
  33.             rongqi = pool[key][0];  
  34.             pool[key].RemoveAt(0);//把第一个位置释放;  
  35.         }  
  36.         else if (pool.ContainsKey(key) && pool[key].Count <= 0)//坑存在,坑里没东西  
  37.         {  
  38.             //那就直接初始化一个吧  
  39.             rongqi = Instantiate(go,position,Quaternion.identity) as GameObject;  
  40.         }  
  41.         else  //没坑  
  42.         {   
  43.             //不仅要初始化,还要把坑加上  
  44.             rongqi = Instantiate(go, position, Quaternion.identity) as GameObject;  
  45.             pool.Add(key, new List<GameObject>() { });  
  46.         }  
  47.   
  48.         //调整物体初始状态  
  49.         rongqi.SetActive(true);  
  50.   
  51.         //这里我加了一个子物体也显示的代码,你可以不用加  
  52.         foreach (Transform child in rongqi.transform)  
  53.         {  
  54.             child.gameObject.SetActive(true);  
  55.         }  
  56.   
  57.         //位置初始化  
  58.         rongqi.transform.position = position;  
  59.         return rongqi;  
  60.     }  
  61.   
  62.     //放入池子中的方法  
  63.     public void IntoPool(GameObject go)  
  64.     {  
  65.         //理论上我们的东西都是从坑里拿出来的,所以放物体进去的时候肯定有他的坑,可以直接放入,不用分情况了  
  66.         string key = go.name;  
  67.         pool[key].Add(go);  
  68.         go.SetActive(false);  
  69.     }  
  70.       
  71. }  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM