如何修复“类型为'GameObject'的对象已被破坏,但您仍在尝试访问该对象”错误?

问题描述 投票:0回答:3

我正在使用C#在Unity中创建2.5D格斗游戏。目前,我正在尝试使保险杠出现在播放器周围,并在设定的时间后消失。我设法使保险杠出现并消失一次,但是之后,当我尝试再次使保险杠出现时,Unity对我来说有一个错误:“'GameObject'类型的对象已被破坏,但您仍在尝试访问它。“

我尝试使用“实例化”和“破坏”命令,并遵循“ 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。

非常感谢您的帮助!

c# unity3d 3d 2.5d
3个回答
1
投票
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);
}

现在,您要用实例化的对象覆盖包含预制对象的公共字段,然后销毁它。将实例化的对象设置为变量,就可以了。


0
投票

问题是,在您的代码中,您并不关心GameObject是否存在。因此,例如,如果(由于某种原因)将不创建对象BumperPrefab,则Destory()将尝试对null进行操作。您可以尝试通过以下方式将其添加到BumperPrefab脚本bomber.cs中:

float lifetime = 0.2f;

private void OnEnable()
{
Desroy(this, lifetime)
}

0
投票

这个问题真奇怪。看看这个视频https://www.youtube.com/watch?v=NmEIBUWHajc他展示了一个(如果不是唯一的)解决方案。希望它有用。

© www.soinside.com 2019 - 2024. All rights reserved.