Grupo de objetos de Unity y la implementación más simple

Grupo de objetos


对象池Como su nombre lo indica, es un contenedor para almacenar objetos. Principalmente solo adecuado para escenas que requieren una gran cantidad de objetos y se destruyen después de su uso, como balas en juegos de disparos, monstruos en defensa de torres, y se destruyen rápidamente después de que se generan una gran cantidad de ellos. La generación y destrucción frecuente de objetos consumirá muchos recursos de la CPU, hará que el juego se congele y los objetos se almacenen en un 堆内存espacio discontinuo, lo que provocará problemas de fragmentación de la memoria. Con el aumento del tiempo de ejecución, el programa puede bloquearse.

  • La idea general del grupo de objetos

Use una colección para almacenar los objetos que se producirán en masa y use una clase para mantener la colección. Existen principalmente dos métodos GetObjy se Recycleutilizan para proporcionar objetos y reciclar objetos.

  • Implementación simple en la unidad

    Construcción de escenas
    1. Cree una cápsula, cree un objeto vacío como su objeto secundario, como el punto de lanzamiento de la viñeta
      Inserte la descripción de la imagen aquí
    2. Cree una esfera Sphere y guárdela como prefabricada, almacenada en el Resources/Prefabsnombrebullet
      Inserte la descripción de la imagen aquí

Pool.cs

using UnityEngine
 	public class Pool
 	{
 		//单例模式实现
 		static Pool _instance;
 		public static Pool Instance
 		{
 			get
 			{
 				if(instance == null)
 				{
 					instance = new Pool();
 				}
 				return _instance;
 			}
 		}
 		GameObject _obj; //需要大量产生销毁的对象
		List<GameObject> pool;
		private Pool()
		{
			pool = new List<GameObject>();
			//动态获取该对象
			_obj = Resources.Load<GameObject>("Prefabs/bullet");
		}
		public GameObject GetObj()
		{
			GameObject obj;
			if(pool.Count ==0)
			{
				//pool中没有存储对象时
				obj = GameObject.instantiate(_obj);  
				obj.SetActive(false);
				obj.AddComponent<Bullet>();
				pool.Add(obj);
			}
			obj = pool[0]; //每次只取第一个
			obj.SetActive(true);
			//将提供的对象从pool中移除
			pool.RemoveAt(0);
			return obj;
		}

		public void Recycle(GameObject obj)
		{
			//将对象失活而不是Destory。然后存入到维护的pool中
			obj.SetActive(false);
			pool.Add(obj);
		}
 	}

Bullet.cs

//继承MonoBehaviour
public class Bullet:MonoBehaviour
{
	void OnEnable()
    {
    	//一定要写在OnEnable中
        StartCoroutine(Recycle());
    }
	void Update () {
        transform.Translate(Vector3.forward * 10 * Time.deltaTime);
	}

	//使用协程完成自动回收,也可以使用计时器
    IEnumerator Recycle()
    {
        yield return new WaitForSeconds(1f);
        BulletPool.Instance.Recycle(gameObject);
    }
}

Test.cs

//挂载在胶囊上面
public class Test:MonoBehaviour
{
	void Start () {
	}
	void Update () {
        if (Input.GetKeyDown(KeyCode.Space))
        {
        	//按空格产生子弹
            GameObject bullet = BulletPool.Instance.GetObj();
            bullet.transform.position = transform.GetChild(0).position;
        }
	}
}

Supongo que te gusta

Origin blog.csdn.net/weixin_36382492/article/details/88257275
Recomendado
Clasificación