Как исправить, что объект типа 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 снова появиться.

Любая помощь высоко ценится!


person TheBattleCat    schedule 08.02.2019    source источник
comment
Почему вы используете (GameObject) при создании экземпляра, просто используйте var obj = Instantiate(...) Затем уничтожьте obj   -  person Ali Kanat    schedule 08.02.2019


Ответы (3)


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);
}

Прямо сейчас вы перезаписываете свое общедоступное поле, содержащее префаб-объект, созданным вами объектом, а затем уничтожаете его. Установите экземпляр объекта как переменную, и все будет в порядке.

person Steven Coull    schedule 08.02.2019

проблема в том, что вы уничтожаете BumperPrefab

когда вы Instantiate новый GameObject, вы должны добавить его в локальную переменную, как это

var newbumper = (GameObject) Instantiate(BumperPrefab, firePoint.position,firePoint.rotation);

и вы должны уничтожить вашу локальную переменную, которая содержит вновь созданный gameObject

Destroy(newbumper , lifetime);
person Jaydeep chatrola    schedule 09.10.2020

Проблема в том, что в вашем коде вас не волнует, существует ли ваш GameObject. Так, например, если (по какой-то причине) объект BumperPrefab не будет создан, Destory () попытается действовать на null. Вы можете попробовать добавить в скрипт BumperPrefab bumper.cs с помощью:

float lifetime = 0.2f;

private void OnEnable()
{
Desroy(this, lifetime)
}
person Adam Frańczak    schedule 08.02.2019