Объект, который вы хотите создать, является нулевым. Единство 3D - PullRequest
2 голосов
/ 30 января 2020

У меня проблема с моим кодом единства, и я не могу понять, почему он не работает. Я новичок в единстве, только начинаю учиться этому. У меня есть 4 префаба с разными именами в дереве проекта, и я хочу, чтобы префаб появлялся каждую секунду, но я хочу, чтобы он был рандомизирован без использования «if», поэтому я попытался сохранить имена префабов в массиве, а затем Создайте экземпляр GameObject, имя которого совпадает со значением массива. Когда я запускаю свой скрипт в Unity, он говорит, что объект, который я хочу создать, является нулевым, я пытался найти ответ в Интернете, но ничего не нашел. Вы можете помочь мне?

Это мой код:

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

public class Spawnnoif : MonoBehaviour
{
    public GameObject cub;
    public GameObject capsula;
    public GameObject cilindru;
    public GameObject sfera;
    public int x;
    public GameObject paleta;
    public float delta;
    public string[] a = { "cub", "capsula", "cilindru", "sfera" };

    void Start()
    {
        Vector3 position = new Vector3(UnityEngine.Random.Range(-1.88f, 2.1f), 1, UnityEngine.Random.Range(-7.81f, -3.1f));
        x = UnityEngine.Random.Range(0, 3);
        Instantiate(GameObject.Find(a[x]), position, Quaternion.identity);
    }

    IEnumerator Spawn()
    {
        while (true)
        {
            Vector3 position = new Vector3(UnityEngine.Random.Range(-1.88f, 2.1f), 1, UnityEngine.Random.Range(-7.81f, -3.1f));
            x = UnityEngine.Random.Range(0, 3);
            Instantiate(GameObject.Find(a[x]), position, Quaternion.identity);
            yield return new WaitForSeconds(1.0f);
        }
    }
}

Ответы [ 2 ]

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

Пожалуйста не используйте 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);
}
0 голосов
/ 30 января 2020

Вы можете использовать массив GameObjects (префабы) и назначить их в редакторе. Затем вы можете назначить столько префабов, сколько хотите в Инспекторе, и создать их случайным образом:

public class Spawnnoif : MonoBehaviour
{
    public GameObject[] prefabs;

    public int x;
    public GameObject paleta;
    public float delta;

    void Start()
    {
        Vector3 position = new Vector3(UnityEngine.Random.Range(-1.88f, 2.1f), 1, UnityEngine.Random.Range(-7.81f, -3.1f));
        x = UnityEngine.Random.Range(0, prefabs.Length);
        Instantiate(prefabs[x], position, Quaternion.identity);
    }
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...