Unity3D对象池的理解与小例子

最近在学习Unity3D,在制作一个跑酷Demo的时候,发现不停的初始化障碍物和删除障碍物比较卡,后来研究了一下对象池,整了大半天,总算是明白了。现在记录下来,希望能帮助和我一样的新手,如果有不对的地方,还请大牛指正!

本文大部分借鉴了这篇文章

unity3D初识对象池技术

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

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

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


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> pool = new Dictionary>() { };

	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() { });
        }

        //调整物体初始状态
        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);
    }
    
}

 
 

你可能感兴趣的:(unity3d)