使用Unity制作简单的对象池

发表于2017-09-22
评论0 1.1k浏览
使用Unity制作简单的对象池


该篇文章将指导你使用Unity去制作一个简单的对象池,主要是考虑到有很多人对对象池认识的还不够,所以有必要给各位同学介绍下。



使用Unity制作简单的对象池(基础)



使用Unity制作简单的对象池(进阶)


完整项目:

    http://pan.baidu.com/s/1gf9QYJ5


完整代码(用于够字数申请原创):


    ObjectPool.cs


using UnityEngine;

using System.Collections;

using System.Collections.Generic;



public class ObjectPool

{

    /// <summary>

    /// 对象

    /// </summary>

    public GameObject poolObj;


    /// <summary>

    /// 对象池容器

    /// </summary>

    private List<GameObject> poolObjs;


    /// <summary>

    /// 是否自动生成新的对象

    /// </summary>

    public bool isAutoGrow;


    public ObjectPool (GameObject _obj, int _initPoolSize, bool _isAutoGrow)

    {

        poolObjs = new List<GameObject>();

        poolObj = _obj;

        isAutoGrow = _isAutoGrow;


        //为对象池进行初始化

        for (int i = 0; i < _initPoolSize; i )

        {

            GameObject obj = GameObject.Instantiate(poolObj);

            obj.transform.parent = GameObject.FindWithTag("ObjcetPoolManager").transform;

            obj.SetActive(false);

            poolObjs.Add(obj);

        }

    }


    public GameObject GetGameObject ()

    {

        //从对象池集合中找到当前未使用的对象,将其返回给使用者

        for (int i = 0; i < poolObjs.Count; i )

        {

            //当前对象不是激活的状态时,执行的操作

            if (!poolObjs[i].activeSelf)

            {

                poolObjs[i].SetActive(true);

                return poolObjs[i];

            }

        }


        //当对象池的大小不够用的时候,则自动生成新的对象,然后将对象存储再池中进行管理

        if (isAutoGrow)

        {

            GameObject obj = GameObject.Instantiate(poolObj);

            obj.transform.parent = GameObject.FindWithTag("ObjcetPoolManager").transform;

            poolObjs.Add(obj);

            return obj;

        }


        return null;

    }


}



    ObjectPoolManager.cs




using System;

using UnityEngine;

using System.Collections;

using System.Collections.Generic;


/// <summary>

/// 用于存储我们的对象池信息

/// </summary>

[System.Serializable]

public struct ObjectPoolInfo

{

    public GameObject obj;

    public int initPoolSize;

    public bool isAutoGrow;

}


public class ObjectPoolManager : MonoBehaviour

{

    public static ObjectPoolManager instance;


    public ObjectPoolInfo[] ObjectPoolInfos;


    void Awake()

    {

        instance = this;

    }


    /// <summary>

    /// 对象池容器

    /// </summary>

    public Dictionary<string, ObjectPool> objectPools;



    void Start()

    {

        objectPools = new Dictionary<string, ObjectPool>();


        for (int i = 0; i < ObjectPoolInfos.Length; i )

        {

            CreateObjectPool(ObjectPoolInfos[i].obj,ObjectPoolInfos[i].initPoolSize,ObjectPoolInfos[i].isAutoGrow);

        }

    }


    /// <summary>

    /// 创建对象池

    /// </summary>

    /// <param name="_obj">对象池所生成的对象</param>

    /// <param name="_initPoolSize">对象池的大小</param>

    /// <param name="_isAutoGrow">是否自动扩充</param>

    void CreateObjectPool(GameObject _obj, int _initPoolSize, bool _isAutoGrow)

    {

        //如果对象池已经存在,则不会创建新的对象池

        if (objectPools.ContainsKey(_obj.name))

        {

            Debug.LogError("对象池已经存在,直接获取就行!!!");

        }

        //如果对象池不存在,则创建新的对象池

        else

        {

            ObjectPool objectPool = new ObjectPool(_obj, _initPoolSize, _isAutoGrow);

            objectPools.Add(_obj.name, objectPool);

        }

    }


    /// <summary>

    /// 通过对象池的名字获取对应的对象

    /// </summary>

    /// <param name="objNmae">对象池的名字</param>

    /// <returns></returns>

    public GameObject GetGameObject(string objNmae)

    {

        GameObject obj = objectPools[objNmae].GetGameObject();

        //obj.transform.parent = transform;

        return obj;

    }

}


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: