пропуск массива, когда он равен нулю

У меня есть объекты в моей 2D-игре, которые находятся в списке массивов. Эти объекты создают экземпляры других объектов в игре. Какие из них создаются случайным образом. Однако они могут быть уничтожены во время игры. Код все еще пытается найти разрушенное преобразование, поэтому я сказал ему создавать экземпляр только из массива, когда он не равен нулю, исправив сообщение об ошибке. Тем не менее, поведение остается. Поскольку один из этих массивов порождает gameObject каждые заданное количество секунд, он все равно может решить создать объект из массива, имеющего значение NULL. Когда он случайным образом выбирает нулевой массив, есть период времени, когда игра должна сидеть и ждать, пока что-то произойдет, что, конечно, недопустимо. Как сообщить игре, что, когда массив имеет значение NULL, пропустить его и перейти к следующему, чтобы избавиться от этого периода ожидания в игре? Я также знаю, что void ничего не возвращает. Это просто заполнитель в конце скрипта, потому что я не могу ввести break или continue, поскольку это не цикл for. Я публиковал это раньше, и как только сообщение об ошибке появилось, я подумал, что это конец. Прошу прощения за то, что разместил это во второй раз. Заранее спасибо.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;


public class podControl : MonoBehaviour {


public Transform [] spawns;
public float spawnTime = 6f;
public float secondSpawnTime = 3f;      
public GameObject podPrefab;



void Start ()
{

    InvokeRepeating ("landingPod", spawnTime, secondSpawnTime);

}



void landingPod ()
{

    int spawnIndex = Random.Range (0, spawns.Length);

    if (spawns[spawnIndex] != null) {

        Instantiate (podPrefab, spawns [spawnIndex].position, spawns [spawnIndex].rotation); 

    }
    else {
        if (spawns [spawnIndex] = null)
            return;

    }
}   

}


person Joe Clark    schedule 21.03.2017    source источник


Ответы (2)


Вы можете просто продолжать поиски подходящего спауна, прежде чем Instantiate его:

void landingPod()
{

    int spawnIndex = Random.Range(0, spawns.Length);

    while(spawns[spawnIndex] == null)
    {
        spawnIndex = Random.Range(0, spawns.Length);
    }

    Instantiate(podPrefab, spawns[spawnIndex].position, spawns[spawnIndex].rotation);

}

И у вас было это, где вы делаете свое возвращение:

if (spawns[spawnIndex] = null)

Имея только =, а не ==, вы не проверяете, является ли он нулевым, но присваиваете этому spawns[spawnIndex] нулевое значение.

person I.B    schedule 21.03.2017
comment
Итак, теперь это работает. Я не знал, что вы можете применить == к нулю, поэтому мне даже в голову не приходило. Большое спасибо. - person Joe Clark; 21.03.2017
comment
Пожалуйста, и да, точно так же, как вы проверили, не было ли оно пустым, выполнив !=, вы можете использовать ==, чтобы сделать обратное. @JoeClark - person I.B; 21.03.2017
comment
@JoeClark, если этот или любой ответ решил ваш вопрос, пожалуйста, примите его, нажав на галочку. Это показывает широкому сообществу, что вы нашли решение, и дает некоторую репутацию как автору, так и вам. Это не обязательно. - person I.B; 21.03.2017
comment
конечно, я был бы более чем счастлив. Спасибо, что показал мне веревки, лол - person Joe Clark; 22.03.2017

Вместо того, чтобы устанавливать для позиций массива значение NULL, заполните их последним элементом и отслеживайте количество элементов в массиве.

public Transform [] spawns;
private int spawnsCount;

// Index must be in the range [0 ... spawnsCount - 1] and spawnsCount > 0.
public DeleteSpawnAt(int index)
{
    spawnsCount--;
    spawns[index] = spawns[spawnsCount];
    spawns[spawnsCount] = null;
}

В диапазоне от 0 до spawnsCount - 1 у вас всегда будут ненулевые преобразования. Все null записи будут в конце массива.

А затем создайте индекс с

int spawnIndex = Random.Range (0, spawnsCount);

Удалить "D":

              +-----------------------+
              |                       |
              V                       |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| A | B | C | D | E | F | G | H | I | J |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
                                    |<--|
                                    spawnCount--

после:

+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| A | B | C | J | E | F | G | H | I |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
person Olivier Jacot-Descombes    schedule 21.03.2017