Переместить / сдвинуть объекты в массиве вверх, затем переместить первый элемент к последнему индексу
Я создаю игру в Unity3D и пытаюсь повторно использовать GameObjects, включая и отключая их, а не создавая и уничтожая их.
У меня есть 10 пружин в массиве GameObject, и каждый раз, когда я использую пружину, я хочу взять ее из первого элемента в массиве, сдвинув все остальные элементы этого массива вверх, а затем переместить первый объект в последний индекс в массив.
1 ответ
Это называется объединением объектов. Вам не нужно удалять массив из первого или последнего, чтобы сделать это. Есть много способов архивировать это в Unity.
Метод 1 (рекомендуется):
Даже если это работает, нет необходимости и неэффективно перемещать объекты в массиве. Вы можете иметь индекс, который перемещается. Начинается с 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();
}
Способ 2:
List
достаточно сделать это, если бассейн маленький. Пожалуйста, взгляните на официальный учебник Unity для Object Pooling, который реализовал это. Нет необходимости размещать код здесь.
Вы просто отключаете GameObject в List
переработать его. В следующий раз, когда вам нужен новый, обведите List
и вернуть первый отключенный GameObject в List
, Если он включен, это означает, что он все еще используется.
Если отключенный GameObject не найден в List
, тогда ты можешь Instantiate
новый, добавить его в список, а затем вернуть его. Это самый простой способ сделать это. Просто посмотрите учебник Unity для получения дополнительной информации.
Способ 3:
Используйте Очередь или Стек. Вы можете ставить в очередь и ставить в очередь или выдвигать / выдвигать объекты из пула. Существует множество реализаций, если вы выполните простой поиск по этому вопросу.
Способ 4:
Это упоминается только потому, что это был ваш первоначальный вопрос о том, как сместить объекты вверх в массиве, а затем поместить первое значение в последний индекс массива. Вы не должны использовать это. Это только здесь, чтобы показать, что это может быть сделано.
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();
}