Unity中的对象池用法

来源:互联网 发布:淘宝整点聚秒杀神器 编辑:程序博客网 时间:2024/06/01 19:42

       在游戏开发过程中,有时候需要频繁的创建相同的游戏物体(例如,子弹、炮弹等),刚开始学习游戏脚本编写时的做法是:反复的Instantiate去实例化游戏物体,当不需要时再Destory掉。然而这种做法是相当耗费资源的。当然,肯定有优化的方法,那就是我们接下来要讲的“对象池”。对象池,顾名思义就是有很多游戏对象的池子,它保存着当前不需要使用到但是却随时会被使用到的游戏对象。

      对象池的结构:1、一个池子,用来存放我们的游戏物体        pool

                               2、一个可以在池子里取物体的公有的静态方法      GetObject

                               3、一个可以将使用完的物体放回池子的公有静态方法     ReturnObject

      接下来就是对上面的三个结构的类型定义了:

                     1、由于在对象池中可能会有很多种类型的物体,而且每种类型的游戏物体又可能有多个,所以,  我们将pool的类型定义为Dictionary<string, ArrayList>,前面的string为物体的类型,后面的数  组就可以用来保存相同类型的游戏物体了。也就是说,这个Dictonary的实例就是一个对象池。

                     2、GetObject是从对象池里获取游戏物体的,所以它需要有一个参数(string type)来指定我们要  获取的对象是什么类型的,接着获取到这个对象之后还需要对这个对象的position和rotation进  行初始化,所以还需要两个参数(Vector3 position)和(Quaternion quat)。

     3、ReturnObject是把我们使用完的对象放回对象池中,所以我们只需要一个参数,即当前要放入   对象池的物体。

说了那么多,下面直接上代码:

        

<span style="font-size:24px;">using UnityEngine;using System.Collections;using System.Collections.Generic;public class ObjectPool : MonoBehaviour{    private static Transform hang;  //物体从对象池中取出来后挂在这个游戏物体下    private static Transform poolTransform;     //对象池    void Start()    {        hang = GameObject.FindGameObjectWithTag("hang").transform;        poolTransform = transform;    }    //这个Dictionary就是我们所说的对象池的实质了,它就是管理这些池子里的物体的    private static Dictionary<string, ArrayList> pool =         new Dictionary<string, ArrayList>         {            { "Ball", new ArrayList() } //这里的Ball就是我自己定义的类型,可以再继续初<span style="white-space:pre"></span>//始化来保存多种类型的游戏物体        };    //从池子里获取游戏物体    public static GameObject GetObject(string type, Vector3 positon, Quaternion quat)    {        GameObject o = null;        ArrayList array = pool[type] as ArrayList;        if (array.Count > 0)        {            o = array[0] as GameObject;            array.RemoveAt(0);        }        else        {           o = Instantiate(Resources.Load("Prefabs/" + type), positon, quat) as GameObject;        }        o.SetActive(true);        o.name = type;        o.transform.localPosition = positon;        o.transform.localRotation = quat;        o.transform.parent = hang;        return o;    }    //把使用完的游戏物体放回池子中    public static void ReturnObject(GameObject o)    {        ArrayList array = pool[o.name] as ArrayList;        array.Add(o);        o.transform.parent = poolTransform;        o.SetActive(false);    }}</span>
这样就可以当我们要使用一个对象时直接使用 ObjectPool.GetObject去对象池取,而使用完一个对象之后就再使用ObjectPool.ReturnObject将对象放回池子中。

0 0