机械化的对对象池进行解说就是: 对象池就存放需要被反复调用资源的一个空间,比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。
通俗的说就是:把经常大量使用的对象放在一个容器里面,当我们用的时候取出来,不用的时候就放到池子里面,不用每一次都销毁、创建,消耗性能。
下面就用代码实现一个简单的对象池栗子。
首先先创建一个GameManager脚本挂在相机上, 用来管理对象池 设为静态。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class GameManager : MonoBehaviour
{
public static GameManager _Instance;
//定义一个集合 (对象池)
List<GameObject> objectPools = new List<GameObject>();
void Awake()
{
_Instance = this;
}
/// <summary>
/// 从对象池中获取
/// </summary>
/// <param name="obj"></param>
public void GetObj(GameObject obj)
{
//判断池中是否有可用资源
if (objectPools.Count == 0) //没有则重新生成
{
GameObject go = Instantiate(obj, Vector3.zero, Quaternion.identity) as GameObject;
//并添加到池中
objectPools.Add(go);
}
else
{
//从对象池中取
GameObject go = objectPools[0];
go.SetActive(true);
objectPools.Remove(go);
}
}
/// <summary>
/// 放到对象池中
/// </summary>
/// <param name="obj"></param>
public void SetObj(GameObject obj)
{
objectPools.Add(obj);
obj.SetActive(false);
}
}
在创建一个脚本挂在子弹预设物上,用来回收子弹
public float Speed = 6f;
// Update is called once per frame
void Update()
{
//让子弹向前移动
transform.Translate(Vector3.forward * Time.deltaTime * Speed);
StartCoroutine(DesBullet(3f));
}
//回收子弹
private IEnumerator DesBullet(float v)
{
yield return new WaitForSeconds(v);
GameManager._Instance.SetObj(gameObject);
}
再创建一个脚本挂在相机上 获取池中的子弹
//子弹预设
public GameObject BullerPre;
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0)) {
GameManager._Instance.GetObj(BullerPre);
}
}
最后运行实验一下: