Почему gameobject не null после удаления?
Делаю игру - бесконечный раннер с видом сбоку. Платформы, по которым бежит игрок, движутся влево и когда касаются объекта где-то за экраном, то платформа, которая коснулась его, уничтожается, после чего создаётся новая. Всего есть 2 платформы (в коде platform1 и platform2), которые идут друг за другом соответственно, когда срабатывает OnTriggerEnter на объекте Destroyer (который за экраном), то платформа уничтожается (по идее platform1 становится null), и я ожидаю срабатывания условия, после чего platform1 начинает ссылаться на platform2, а platform2 в свою очередь становится новым объектом.
[SerializeField] GameObject prefabPlatform;
[SerializeField] GameObject platform1;
[SerializeField] GameObject platform2;
private void OnTriggerEnter(Collider other)
{
Destroy(other.gameObject);
if (platform1 == null)
{
platform1 = platform2;
platform2 = Instantiate(prefabPlatform, platform1.transform.position + new Vector3(0, 0, 4.8f), Quaternion.identity);
}
}
OnTriggerEnter срабатывает, объекты, коснувшиеся его уничтожаются, но почему-то не срабатывает условие, хотя в Inspector'е platform1 считается Missing (GameObject) (рис. 1).
Вставлял это условие в FixedUpdate и Update, всё работает. Подскажите, где почитать об этом или что сделать.
Ответы (1 шт):
Значение становиться null после удаления, в инспекторе отображается Missing, потому что это поле с ссылкой, и ссылка пропала (Missing), Вы уничтожаете объект (хотя стоит завести туда проверку, чтобы не уничтожать наверное все коллайдеры вошедшие в триггер), но он не успел обработать это, но это гарантирует удаление, выполняйте действие дальше
И чтобы избежать ошибок не используйте ссылку на объект который собираетесь удалить в виде platform.transform из вашего кода. Сохраните значение до начало его удаления
private void OnTriggerEnter(Collider other)
{
if(other.GetComponent<Platform>()) // Необходима проверка что в триггер вошёл именно платформа, для этого используйте что нибудь характерное для вашей платформы, я указал пример
{
Vector3 oldPlatformPosition = platform1.transform.position;
Destroy(other.gameObject);
platform1 = Instantiate(prefabPlatform, oldPlatformPosition + new Vector3(0, 0, 4.8f), Quaternion.identity);
}
}
