Unity3D對象池小案例

對象池的概念:在激活對象時,它從池中提取。在停用對象時,它放回池中,等待下一個請求。(來自百度);ide

背景:跑酷遊戲,道路上有障礙物,角色身後的障礙物消失,角色前面隨機生成障礙物this

你所須要的最基本的三樣東西:spa

 

一、一個池子:用來裝你所需的物品,和回收物品;.net

二、一個取物品的方法;orm

三、一個放物品的方法;對象

有這3樣東西,你就能夠建造對象池了blog

如下是完整的代碼部分,裏面有詳細的註釋遊戲

 

[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. }  
相關文章
相關標籤/搜索