c# - Destroy() 在 Unity3D 中不再工作

标签 c# unity3d destroy gameobject

我正在开发一款赛车游戏,该游戏在地面上设有加速器。当车辆接触到它时,附加到加速器的脚本会实例化一个 Fire 预制件,然后在 2 秒后将其销毁。

这是我的脚本(在 C# 中),它过去工作正常但现在 Destroy() 函数没有任何效果,我可以在游戏层次结构中看到我的 Fire 预制件的实例:

private GameObject _fireModel, _fireObj;

void Start ()
{
    _fireModel = Resources.Load("Fire1") as GameObject;
    _watch = new Stopwatch();
    enabled = false; // (don't call Update() on each frame)
}

void OnTriggerEnter (Collider col)
{
    _fireObj = Instantiate(_fireModel) as GameObject;
    enabled = true; // (do call Update() on each frame)
    _watch.Start();
}

void Update ()
{
    _fireObj.transform.position = _player.position;

    if (_watch.ElapsedMilliseconds >= _fireDurationMs)
    {
        Destroy(_fireObj);
        _watch.Stop();
        _watch.Reset();
        enabled = false; // if I remove this line, 
        // I get a console error saying _fireObj 
        // has been destroyed! Yet I can still 
        // see it on the game and in the hierarchy
    }
}

您是否见过此脚本不会破坏 Fire1 实例的情况?

最佳答案

如果在 _fireDurationMs 内发生两个 OnTriggerEnter 事件,您将获得对象的两个新实例化,并且只有 1 个将被销毁,因为您只保留对最近一次火灾的引用。

如果这是我的游戏,我会稍微改进一下设计。您可以编写一个名为“DestroyAfterMilliseconds”之类的脚本,而不是让加速器负责消灭火,它会在预设时间发生后销毁它所附加的游戏对象,并将其附加到火预制件。这样一来,每次火灾都将自行毁灭,而加速器的责任就会减少。然后可以在您想要为其赋予有限生命周期的任何其他对象上重复使用相同的脚本。拆分职责也将使代码更易于调试和维护。

关于c# - Destroy() 在 Unity3D 中不再工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990780/

相关文章:

c# - 如何多次旋转游戏对象

PHP向数据库发送空白信息

autocomplete - 为什么 MonoDevelop 代码完成对对象不起作用?

mysql - Rails 依赖销毁非关联对象

javascript - 如何释放和垃圾收集 WebGL 上下文?

c# - 证明int++不是原子的可靠方法

c# - 如果任务管理器中的内存使用量不断增加,如何知道是否是内存泄漏

c# - Entity Framework 4 : convert a string condition to a lambda expression?

c# - SevenZipSharp - 压缩内存流

c++ - 在 Qt 5 中重用现有的 QDirIterator