我正在用C#在Unity中创建一个2.5D格斗游戏。目前,我正试图让保险杠出现在玩家周围,并在一段时间后消失。我已经设法让保险杠出现和消失了一次,但在那之后,当我试图让保险杠再次出现时,Unity给我带来了一个错误:"‘游戏对象’类型的对象已经被破坏,但你仍在试图访问它。">
我尝试过使用"实例化"one_answers"销毁"命令,遵循"Brackeys"关于2D拍摄的教程。在论坛上关注了一些关于同一问题的问题后,我再次修改了代码,但问题仍然存在。
firePoint
是一个空对象,从中实例化BumperPremab。
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);
}
}
我预计游戏对象"BumperPremab"会出现,停留0.2秒后消失。我应该可以随心所欲地重复,但实际情况是,我只能重复一次,然后出现错误"类型为‘GameObject’的对象已被销毁,但您仍在尝试访问它",我无法再次出现BumperPremab。
非常感谢您的帮助!
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);
}
现在你正在用实例化的对象覆盖包含预制对象的公共字段,然后销毁它。将实例化的对象设置为变量,你就可以了。
问题是,在你的代码中,你不在乎你的GameObject是否存在。例如,如果(由于某种原因)对象BumperPremab将不会被创建,Destory()将尝试对null执行操作。你可以尝试添加到BumperPremab脚本保险杠.cs与:
float lifetime = 0.2f;
private void OnEnable()
{
Desroy(this, lifetime)
}
问题是您正在销毁BumperPrefab
当您Instantiate
一个新的GameObject
时,您应该将它添加到本地变量中,就像这个一样
var newbumper = (GameObject) Instantiate(BumperPrefab, firePoint.position,firePoint.rotation);
并且您必须销毁包含新创建的gameObject
的本地变量
Destroy(newbumper , lifetime);
我也遇到过类似的问题。根本原因是第一个初始对象(在本例中为BumperPremab)被销毁,Instantiate尝试克隆null并失败。解决这个问题的一个简单方法是,通过在Start()中调用SetActive(false)
,将第一个对象(将由所有其他对象克隆)设置为非活动对象,然后只需要确保所有克隆都处于活动状态。在这种情况下,通过bumper.SetActive(true)