Destroy() больше не работает в Unity3D

Я работаю над гоночной игрой, в которой есть скоростные ускорители на земле. Когда транспортное средство касается его, скрипт, прикрепленный к спидбустеру, создает сборку огня, а затем уничтожает ее через 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?


person Seeven    schedule 30.11.2015    source источник
comment
вы прошли через код ..? также вы заявляете, что получаете консольную ошибку.. что это за фактическая ошибка.. можете ли вы проверить, не равно ли _fireObj нулю..? и если это так.. тогда назначьте его = null.. или внедрите IDisposible в свой игровой объект.. прочитайте следующее answers.unity3d.com/questions/37531/   -  person MethodMan    schedule 30.11.2015


Ответы (3)


Если в течение _fireDurationMs произойдет два события OnTriggerEnter, вы получите два новых экземпляра объектов, и только один будет уничтожен, потому что вы сохраняете ссылку только на последний пожар.

Если бы это была моя игра, я бы немного улучшил дизайн. Вместо того, чтобы возлагать ответственность за уничтожение огня на скоростные ускорители, вы можете написать скрипт с именем что-то вроде «DestroyAfterMilliseconds», который уничтожает игровой объект, к которому он прикреплен, по истечении заданного периода времени, и прикрепить его к сборке огня. Тогда каждый случай пожара будет отвечать за самоуничтожение, а у ускорителей будет меньше обязанностей. Затем этот же скрипт можно повторно использовать для любых других объектов, которым вы хотите ограничить время жизни. Разделение обязанностей также облегчит отладку и сопровождение кода.

person LVBen    schedule 30.11.2015
comment
Спасибо за ваши объяснения! Я перенес все в скрипт, который занимается FX, так как у меня есть другие, которые следят за машиной. - person Seeven; 03.12.2015

Вам просто нужно добавить скрипт для вашего объекта огня.

using UnityEngine;
using System.Collections;

public class fireScript: MonoBehaviour {


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


    void Update () {

    }
}
`  

Теперь вам не нужно управлять своим огненным объектом в другом скрипте. Просто инициализируйте его, и Firescript обработает метод уничтожения.

person Burak Karasoy    schedule 30.11.2015

Это сработало для меня.

 Destroy(RigidbodyVariable);//First Line for Rigidbody
 Destroy(GameObjectVariable);//Second Line GameObject
person garish    schedule 15.10.2018