当玩家通过几个平台时,留下的平台被摧毁。我制作了一个列表来跟踪平台并删除它们最后一个平台预制件(列表 [0])。新的会提前实例化。
有很多方法可以使对象池化。其中之一包括将对象添加到队列并在使用时将其删除。当您想回收/销毁它们时,请将它们添加回列表中。
我应该如何重用我创建的池中的对象?
这真的很容易。而不是每次都这样做:
Instantiate(prefab, postion, Quaternion.identity);
当游戏在 Start 函数开始时执行多次,然后存储在 Array/List 中:
List<GameObject> pool = new List<GameObject>();
void Start()
{
for (int i = 0; i < 50; i++)
{
GameObject tempObj = Instantiate(prefab, postion, Quaternion.identity) as GameObject;
pool.Add(tempObj);
}
}
当你需要在游戏过程中实例化 Object 时,只需从 List/Array 中获取一个即可:
//Check if object is available in pool
if (pool.Count > 0)
{
//Object is. Return 1
GameObject objFromPool = pool[0];
//Enable the Object
objFromPool.SetActive(true);
}
else
{
//Object is NOT. Instantiate new one
GameObject objFromPool = Instantiate(prefab, postion, Quaternion.identity) as GameObject;
//Enable the Object
objFromPool.SetActive(true);
}
当你完成使用 Object. 而不是这样做 Destroy(objFromPool);
,重置那个游戏对象的位置,如果你想也可以禁用它,然后将它添加回List
:
//Reset Pos
objFromPool.transform.position = Vector3.zero;
//Disable?
objFromPool.SetActive(false);
//Return back to the array
pool.Add(objFromPool);
最后,最好的方法是将所有对象实例化为一个数组或列表。使用您递增的整数。整数从 0 开始并递增,直到达到list/array.Length-1
。然后,您可以使用该整数从池中获取对象。
您可以在ArrayObjectPooling
此处查看此方法的示例以及如何使用它。