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