Как исправить ошибку "объект типа" 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 и терпит неудачу. Одним из простых способов решения этой проблемы было бы установить первый объект (который будет клонирован всеми остальными) как неактивный, вызвавв Start(), а затем нужно только убедиться, что все клоны активны. В этом случае по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)
}
Другие вопросы по тегам