1

我正在使用 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);
}

}

我希望游戏对象“BumperPrefab”会出现,停留 0.2 秒然后消失。我应该可以重复多次,但实际发生的是我只能这样做一次,然后出现错误“'GameObject'类型的对象已被破坏,但您仍在尝试访问它”出现了,我不能让 BumperPrefab 再次出现。

任何帮助深表感谢!

4

3 回答 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);
}

现在,您正在用您的实例化对象覆盖包含预制对象的公共字段,然后将其销毁。将实例化的对象设置为变量,应该没问题。

于 2019-02-08T09:43:48.503 回答
0

问题是你在破坏BumperPrefab

当你Instantiate是一个新人时,GameObject你应该像这样将它添加到局部变量中

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

并且您必须销毁包含新创建的局部变量gameObject

Destroy(newbumper , lifetime);
于 2020-10-09T04:22:46.813 回答
-1

问题是在你的代码中你不关心你的游戏对象是否存在。例如,如果(出于某种原因)对象 BumperPrefab 不会被创建,Destory() 将尝试对 null 执行操作。您可以尝试使用以下命令添加到 BumperPrefab 脚本bumper.cs:

float lifetime = 0.2f;

private void OnEnable()
{
Desroy(this, lifetime)
}
于 2019-02-08T09:44:49.120 回答