Переместить / сдвинуть объекты в массиве вверх, затем переместить первый элемент к последнему индексу

Я создаю игру в 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();
}
Другие вопросы по тегам