Как исправить ошибку "объект типа" GameObject "уничтожен, но вы все еще пытаетесь получить к ней доступ" в Unity?
Я создаю 2.5D файтинг в Unity с C#. В настоящее время я пытаюсь заставить бампер появляться вокруг плеера и исчезать через определенное время. Мне удалось заставить бампер появляться и исчезать один раз, но после этого, когда я пытаюсь заставить бампер появляться снова, Unity имеет для меня ошибку: "Объект типа" GameObject "был уничтожен, но вы все еще пытаетесь чтобы получить к нему доступ. "
Я попытался использовать команды "instantiate" и "destroy", следуя инструкции "Brackeys" по 2D-стрельбе. После того, как я прочитал несколько вопросов на форумах об этой проблеме, я снова изменил свой код, но проблема сохраняется.
firePoint
является пустым объектом, из которого создается экземпляр BumperPrefab.
using UnityEngine;
public class weapon: MonoBehaviour
{
public Transform firePoint;
public GameObject BumperPrefab;
public float lifetime = 0.2f;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
attack();
}
}
void attack()
{
BumperPrefab = (GameObject) Instantiate(BumperPrefab, firePoint.position, firePoint.rotation);
Destroy(BumperPrefab, lifetime);
}
}
Я ожидаю, что GameObject "BumperPrefab" появится, задержится на 0,2 секунды и исчезнет. Я должен быть в состоянии повторить это столько раз, сколько захочу, но на самом деле происходит то, что я могу сделать это только один раз, а затем появляется ошибка "Объект типа" GameObject "уничтожен, но вы все еще пытаетесь получить к нему доступ" появляется, и я не могу заставить BumperPrefab появляться снова.
Любая помощь высоко ценится!
4 ответа
using UnityEngine;
public class weapon: MonoBehaviour
{
public Transform firePoint;
public GameObject BumperPrefab;
public float lifetime = 0.2f;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
attack();
}
}
void attack()
{
var bumper = (GameObject) Instantiate(BumperPrefab, firePoint.position, firePoint.rotation);
Destroy(bumper, lifetime);
}
Прямо сейчас вы перезаписываете свое открытое поле, содержащее готовый объект, своим экземпляром, а затем уничтожаете его. Установите экземпляр объекта в качестве переменной, и все будет в порядке.
У меня была похожая проблема. Основная причина заключается в том, что первый исходный объект (в данном случае BumperPrefab) уничтожен, а Instantiate пытается клонировать значение null и терпит неудачу. Одним из простых способов решения этой проблемы было бы установить первый объект (который будет клонирован всеми остальными) как неактивный, вызвавbumper.SetActive(true)
Проблема в том, что вы разрушаете
BumperPrefab
когда ты
Instantiate
новый
GameObject
вы должны добавить его в локальную переменную следующим образом
var newbumper = (GameObject) Instantiate(BumperPrefab, firePoint.position,firePoint.rotation);
и вы должны уничтожить вашу локальную переменную, которая содержит вновь созданные
gameObject
Destroy(newbumper , lifetime);
Проблема в том, что в вашем коде вас не волнует, существует ли ваш GameObject. Так, например, если (по какой-то причине) объект BumperPrefab не будет создан, Destory() попытается действовать с нулевым значением. Вы можете попробовать добавить в скрипт BumperPrefab bumper.cs с помощью:
float lifetime = 0.2f;
private void OnEnable()
{
Desroy(this, lifetime)
}