在Unity3D中Destroy()不再工作了

时间:2015-11-30 02:53:46

标签: c# unity3d destroy gameobject

我正在开发一款赛车游戏,它拥有快速增压器。当车辆接触到它时,附加到speedbooster的脚本会实例化一个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实例的情况?

3 个答案:

答案 0 :(得分:5)

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

如果这是我的游戏,我会改进设计。你可以制作一个名为" DestroyAfterMilliseconds"之类的脚本,而不是让speedbooster负责销毁火,它会在预设的时间量之后销毁它附加的游戏对象,然后将它附加到火上预制。然后,火灾的每个实例都将负责摧毁自己,而速度保护者将承担更少的责任。然后,可以在要为其提供有限生命周期的任何其他对象上重复使用相同的脚本。分担责任也可以使代码更容易调试和维护。

答案 1 :(得分:0)

您只需要为fire对象添加一个脚本。

using UnityEngine;
using System.Collections;

public class fireScript: MonoBehaviour {


    void Start () {
        Destroy(gameObject, 2f);
    }


    void Update () {

    }
}
`  

现在您不必在另一个脚本中控制您的fire对象。只需初始化它,Firescript就会处理destroy方法。

答案 2 :(得分:0)

这对我有用。

 Destroy(RigidbodyVariable);//First Line for Rigidbody
 Destroy(GameObjectVariable);//Second Line GameObject