«ArgumentException: объект, который вы хотите создать, является нулевым» Unity, и я не могу понять, почему - PullRequest
0 голосов
/ 08 мая 2018

Это внезапно перестало работать, когда попытка создать экземпляр снаряда говорит мне, что снаряд пуст. Хотя я объявляю ценность для него. Отладка говорит мне, что Start () запущен. Не могу дать гораздо больше контекста.

Вопрос здесь не в том, «что означает эта ошибка», а в том, «почему она нулевая?». Я получил отличный ответ от Дедала, который сказал мне держаться подальше от поиска строк. Я попробую это и скажу вам, если это сработало.

РЕДАКТИРОВАТЬ: // Мой учитель добавил некоторый код в текст, который я забыл удалить (он не мог выяснить, почему я получаю нулевое значение), однако теперь он удален, и это правильный код, который не работает. Метка не написана неправильно, я проверил корпус и т. Д.

void Start()
{
    targPlayer = GameObject.FindGameObjectWithTag("Player").transform;
    projectile = GameObject.Find("Projectile");
    Debug.Log("was run");
}

void Update()
{
    fire -= Time.deltaTime;
    dmg -= Time.deltaTime;

    if (fire <= 0)
    {
        if (Vector2.Distance(transform.position, targPlayer.position) <= detectionRange)
        {
            // This is where the error happens
            Instantiate(projectile, transform.position, Quaternion.identity);
        }
        fire = fireRate;
    }

    if (Vector2.Distance(targPlayer.position, transform.position) <= detectionRange && Vector2.Distance(targPlayer.position, transform.position) >= stopRange)
    {
        transform.position = Vector2.MoveTowards(transform.position, targPlayer.position, movSpeed * Time.deltaTime);
    }
}

1 Ответ

0 голосов
/ 08 мая 2018

Здесь есть много возможных решений, поэтому я расскажу о нескольких, которые приходят на ум.

Прежде всего, поиск со строками - это одна вещь, которую, я думаю, большинство разработчиков назвали бы объективно плохой. Если оставить в стороне проблемы, связанные с кейсами и культурой, для сравнения, то вы или другой член команды невероятно легко можете сделать опечатку, чтобы позже изменить имя этого объекта, не забывая, что эти поиски зависят от него, и при использовании в нетривиальных случаях, Есть серьезные проблемы с производительностью. Это особенно верно для Unity, которая будет просто перебирать иерархию, пока не найдет соответствующий объект, по существу для всех вызовов find.

Что-то подобное должно было произойти, если ваш инстанцирующий вызов не удался.

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

Чтобы обойти поиск строк, вы можете сделать снаряд переменной.

public Transform projectile;

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

[SerializeField] private Transform projectile;

После этого у вас будет немедленный доступ к снаряду без каких-либо накладных расходов на поиск и без беспокойства о нарушении поисков.

Ваша философия дизайна, несомненно, сильно изменится по мере вашего прогресса, и я бы сказал, что вам не следует связывать какие-либо данные такого рода с логическими классами (на всякий случай, если кто-то упоминает об этом), но я бы сказал, Это хороший шаг в правильном направлении, чтобы начать с изменения структуры поиска.

...