Как отключить скрипт, который привязан к случайным символам в Unity? - PullRequest
0 голосов
/ 24 января 2020

Я разрабатывал игру, но есть кое-что, что я не могу понять из-за немного нового в языке и редакторе. Я создаю несколько случайных персонажей, у которых есть базовый сценарий движения. Тем не менее, я также использую столкновение, чтобы заставить их остановиться, когда они что-то касаются. Таким образом, проблема возникает в этой точке. Я должен получить все символы в массиве, а затем я должен использовать al oop, насколько я знаю, но я не могу этого сделать, потому что у меня есть генератор, и я не знаю номеров символов, и я не могу добавить их как компонент основного сценария.

Так, как я могу решить это?

1 Ответ

1 голос
/ 24 января 2020

Прежде всего, почему генератор не может отслеживать сгенерированные символы в списке? Вы можете сделать этот список доступным c и легко иметь к ним доступ. Например,

public List<THE_TYPE>() Characters = new List<THE_TYPE>();

void GenerateCharacter()
{
    // now everytime you generate a new character add it to the list e.g.
    var newChar = Instantiate(...);

    Characters.Add(newChar.GetComponent<THE_TYPE>());
}

, вы можете просто использовать этот список, отфильтровать нулевые записи (объекты, которые могли быть уже уничтожены) и отключить компоненты, выбрать случайную запись, отключить ее компонент и удалить его из список, такой как

using System.Linq;

...

referenceToGenerator.Characters = referenceToGenerator.Characters.Where(c => c != null && c.enabled = true).ToList();

var pickedCharacter = referenceToGenerator.Characters[Random.Range(0, referenceToGenerator.Characters.Count)];
pickedCharacter.enabled = false;
// or if you rather wanted to deactivate the GameObject
//pickedCharacter.gameObject.SetActive(false);
referenceToGenerator.Characters.Remove(pickedCharacter);

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

var instances = FindObjectsOfType<THETYPE>(); 
instance[Random.Range(0, instances.Length)].enabled = false;

или, если вы хотите деактивировать весь GameObject

instance[Random.Range(0, instances.Length)].gameObject.SetActive(false);

если это возможно, хотя вы должны использовать Tray, чтобы хранить их в списке где-то, поскольку FindObjectsOfType, конечно, немного интенсивно работает.

...