Destroy() 在 Unity3D 中不再工作
Destroy() not working anymore in Unity3D
我正在开发一款赛车游戏,该游戏在地面上有加速器。当车辆接触它时,附加到加速器的脚本会实例化一个 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" 的脚本,而不是让 speedboosters 负责消灭火,它会在预设的时间发生后销毁它所附加的游戏对象,并将其附加到火预制件。这样一来,每次火灾都将自行毁灭,而加速器的责任就会减少。然后可以在您想要为其赋予有限生命周期的任何其他对象上重复使用相同的脚本。拆分职责也将使代码更易于调试和维护。
您只需要为您的点火对象添加一个脚本。
using UnityEngine;
using System.Collections;
public class fireScript: MonoBehaviour {
void Start () {
Destroy(gameObject, 2f);
}
void Update () {
}
}
`
现在您不必在其他脚本中控制您的火焰对象。只需初始化它,Firescript 就会处理 destroy 方法。
这对我有用。
Destroy(RigidbodyVariable);//First Line for Rigidbody
Destroy(GameObjectVariable);//Second Line 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" 的脚本,而不是让 speedboosters 负责消灭火,它会在预设的时间发生后销毁它所附加的游戏对象,并将其附加到火预制件。这样一来,每次火灾都将自行毁灭,而加速器的责任就会减少。然后可以在您想要为其赋予有限生命周期的任何其他对象上重复使用相同的脚本。拆分职责也将使代码更易于调试和维护。
您只需要为您的点火对象添加一个脚本。
using UnityEngine;
using System.Collections;
public class fireScript: MonoBehaviour {
void Start () {
Destroy(gameObject, 2f);
}
void Update () {
}
}
`
现在您不必在其他脚本中控制您的火焰对象。只需初始化它,Firescript 就会处理 destroy 方法。
这对我有用。
Destroy(RigidbodyVariable);//First Line for Rigidbody
Destroy(GameObjectVariable);//Second Line GameObject