對象池的概念:在激活對象時,它從池中提取。在停用對象時,它放回池中,等待下一個請求。(來自百度);
背景:跑酷游戲,道路上有障礙物,角色身后的障礙物消失,角色前面隨機生成障礙物
你所需要的最基本的三樣東西:
1、一個池子:用來裝你所需的物品,和回收物品;
2、一個取物品的方法;
3、一個放物品的方法;
有這3樣東西,你就可以建造對象池了
以下是完整的代碼部分,里面有詳細的注釋
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- public class GameObjectPool : MonoBehaviour {
- // Use this for initialization
- //單例模式,如果不知道的話可以百度一下,這里不解釋了,因為水平有限
- public static GameObjectPool instance;
- //下面這句是用字典構造你的池子,字典里的String就是坑的名字,每一個坑對應一個GameObject列表
- Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>() { };
- void Start () {
- instance = this;//單例模式
- }
- //從池子得到物體的方法,傳遞兩個參數,你需要得到的物體,和你需要放置的位置
- //你所需的物體應該已經制作成預置物體
- public GameObject GetPool(GameObject go,Vector3 position)
- {
- string key = go.name+"(Clone)";//要去拿東西的坑名字
- GameObject rongqi; //你用來取物體的容器;
- //下面分三種情況來分析
- if (pool.ContainsKey(key) && pool[key].Count > 0)//如果坑存在,坑里有東西
- {
- //直接拿走坑里面的第一個
- rongqi = pool[key][0];
- pool[key].RemoveAt(0);//把第一個位置釋放;
- }
- else if (pool.ContainsKey(key) && pool[key].Count <= 0)//坑存在,坑里沒東西
- {
- //那就直接初始化一個吧
- rongqi = Instantiate(go,position,Quaternion.identity) as GameObject;
- }
- else //沒坑
- {
- //不僅要初始化,還要把坑加上
- rongqi = Instantiate(go, position, Quaternion.identity) as GameObject;
- pool.Add(key, new List<GameObject>() { });
- }
- //調整物體初始狀態
- rongqi.SetActive(true);
- //這里我加了一個子物體也顯示的代碼,你可以不用加
- foreach (Transform child in rongqi.transform)
- {
- child.gameObject.SetActive(true);
- }
- //位置初始化
- rongqi.transform.position = position;
- return rongqi;
- }
- //放入池子中的方法
- public void IntoPool(GameObject go)
- {
- //理論上我們的東西都是從坑里拿出來的,所以放物體進去的時候肯定有他的坑,可以直接放入,不用分情況了
- string key = go.name;
- pool[key].Add(go);
- go.SetActive(false);
- }
- }