Прежде всего, почему генератор не может отслеживать сгенерированные символы в списке? Вы можете сделать этот список доступным 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
, конечно, немного интенсивно работает.