Пожалуйста не используйте Find
для этого! Это очень дорого! И ненадежный!
Эта функция возвращает только активные GameObjects
. Если GameObject с именем не может быть найден, null
возвращается .
Тем более, что похоже, что вы хотите использовать это для префабов, которые существуют только в активах, а не в Сцене это всегда будет возвращать null
, поскольку он только находит объекты из Сцены.
Вместо этого используйте массив типа
public GameObject[] Prefabs;
, ссылающийся на ваши объекты здесь, и просто выполните
Vector3 position = new Vector3(Random.Range(-1.88f, 2.1f), Random.Range(-7.81f, -3.1f));
Instantiate(Prefabs[Random.Range(0, Prefabs.Length)], position, Quaternion.identity);
Для вашего IEnuemrator
... ну, вы никогда не запускаете это как сопрограмму, поэтому он просто никогда не запускается.
Вы можете сделать это непосредственно в Start
используя StartCoroutine
private void Start()
{
StartCoroutine(Spawn());
}
private IEnumerator Spawn()
{
while (true)
{
Vector3 position = new Vector3(Random.Range(-1.88f, 2.1f), Random.Range(-7.81f, -3.1f));
Instantiate(Prefabs[Random.Range(0, Prefabs.Length)], position, Quaternion.identity);
yield return new WaitForSeconds(1.0f);
}
}
на самом деле вы можете даже напрямую использовать
private IEnumerator Start()
{
while (true)
{
Vector3 position = new Vector3(Random.Range(-1.88f, 2.1f), Random.Range(-7.81f, -3.1f));
Instantiate(Prefabs[Random.Range(0, Prefabs.Length)], position, Quaternion.identity);
yield return new WaitForSeconds(1.0f);
}
}
Если Start
объявлен как IEnumerator
Unity автоматически запускает его как Coroutine.
Или в таком простом случае вы могли бы использовать InvokeRepeating
как
private void Start()
{
// second parameter is the initial delay
// last parameter the repeat interval
InvokeRepeating(nameof(Spawn), 0, 1.0f);
}
private void Spawn()
{
Vector3 position = new Vector3(Random.Range(-1.88f, 2.1f), Random.Range(-7.81f, -3.1f));
Instantiate(Prefabs[Random.Range(0, Prefabs.Length)], position, Quaternion.identity);
}