这称为对象池。您不需要从第一个或最后一个删除数组来执行此操作。在 Unity 中有多种归档方式。
方法一(推荐):
即使这样有效,移动数组中的对象也是不必要且低效的。你可以有一个移动的索引。它从0 开始,每次您请求一个对象时,都会将其加一。如果索引等于Array.Length - 1,则将索引重置回0。
public class ArrayObjectPooling
{
int amount = 10;
GameObject[] objArray;
int currentIndex = 0;
public ArrayObjectPooling(GameObject objPrefab, string name, int count)
{
amount = count;
objArray = new GameObject[amount];
for (int i = 0; i < objArray.Length; i++)
{
objArray[i] = UnityEngine.Object.Instantiate(objPrefab, Vector3.zero, Quaternion.identity);
objArray[i].SetActive(false);
objArray[i].name = name + " #" + i;
}
}
//Returns available GameObject
public GameObject getAvailabeObject()
{
//Get the first GameObject
GameObject firstObject = objArray[currentIndex];
//Move the pointer down by 1
shiftDown();
return firstObject;
}
//Returns How much GameObject in the Array
public int getAmount()
{
return amount;
}
//Moves the current currentIndex GameObject Down by 1
private void shiftDown()
{
if (currentIndex < objArray.Length - 1)
{
currentIndex++;
}
else
{
//Reached the end. Reset to 0
currentIndex = 0;
}
}
}
用法:
public GameObject prefab;
void Start()
{
ArrayObjectPooling arrayPool = new ArrayObjectPooling(prefab, "Springs", 10);
GameObject myObj = arrayPool.getAvailabeObject();
}
方法二:
如果池
小,
List 就足够了。请take 看看 Unity 的 Object Pooling 官方教程实现了这一点。此处无需贴代码。
您只需禁用 List 中的 GameObject 即可回收它。下次你需要一个新的时,循环List 并返回List 中第一个禁用的游戏对象。如果已启用,则表示它仍在使用中。
如果在List 中没有找到禁用的游戏对象,那么您可以Instantiate 一个新对象,将其添加到列表中然后返回。这是最简单的方法。只需观看 Unity 教程即可了解更多信息。
方法三:
使用队列或堆栈。您可以对池中的对象进行排队和入队或推送/弹出。如果您对此进行简单的研究搜索,则有很多实现。
方法四:
这只是因为这是您最初的问题,即如何在数组中向上移动对象,然后将第一个值放在数组的最后一个索引中。你不应该使用它。这里只是为了表明它可以做到。
public class ArrayObjectPooling
{
int amount = 10;
public GameObject[] objArray;
public ArrayObjectPooling(GameObject objPrefab, string name, int count)
{
amount = count;
objArray = new GameObject[amount];
for (int i = 0; i < objArray.Length; i++)
{
objArray[i] = UnityEngine.Object.Instantiate(objPrefab, Vector3.zero, Quaternion.identity);
objArray[i].SetActive(false);
objArray[i].name = name + " #" + i;
}
}
//Returns available GameObject
public GameObject getAvailabeObject()
{
//Get the first GameObject
GameObject firstObject = objArray[0];
//Move everything Up by one
shiftUp();
return firstObject;
}
//Returns How much GameObject in the Array
public int getAmount()
{
return amount;
}
//Moves the GameObject Up by 1 and moves the first one to the last one
private void shiftUp()
{
//Get first GameObject
GameObject firstObject = objArray[0];
//Shift the GameObjects Up by 1
Array.Copy(objArray, 1, objArray, 0, objArray.Length - 1);
//(First one is left out)Now Put first GameObject to the Last one
objArray[objArray.Length - 1] = firstObject;
}
}
用法:
public GameObject prefab;
void Start()
{
ArrayObjectPooling arrayPool = new ArrayObjectPooling(prefab, "Springs", 3);
GameObject myObj = arrayPool.getAvailabeObject();
}