使用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;
}
}