销毁对象时如何使程序执行某些操作?

ste*_*_vo 1 c# unity-game-engine

我的程序中有飞机(如飞机)对象,当子弹击中它们时它们会被破坏,但是当它们离开屏幕5秒钟后它们也会被破坏。

我还有一个运行状况脚本,当它降为0时会重置整个对象,并且我希望每次销毁对象时都删除一个点,但仅在屏幕外时才删除。因此,我将脚本分开。

我在船只生成脚本中使用此命令在5秒钟后销毁它们,这很简单。

Destroy(spawnedPlane, 5f);
Run Code Online (Sandbox Code Playgroud)

如果我只需要执行“在X秒后销毁该对象并将其添加到该值”的代码,那将是完美的。因为据我了解,“ destroy”仅接受2个参数,而没有其他参数。

当然可以,但是我茫然。对此还是很新的。抱歉,如果还不清楚,但我几乎不知道自己在做什么。

CaT*_*aTs 5

您可以使用事件来完全实现所追求的目标。以下是一个可能有用的事件示例。其他对象可以侦听该事件,一旦事件触发,便会得到通知。

[Serializable]
public class PlaneEvent : UnityEvent<Plane> { }
Run Code Online (Sandbox Code Playgroud)

定义事件后,可以将其添加为“飞机”中的字段。飞机毁坏之后,您可以触发该事件,并依次通知正在收听的任何人!

public class Plane : MonoBehaviour {

    public PlaneEvent OnDestroyed;

    public void Destroy () {
        Destroy(gameObject);
        OnDestroyed.Invoke(this);
        OnDestroyed.RemoveAllListeners();
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,在得分类中,我们添加了一个方法,一旦OnDestroyed触发了飞机事件,该方法将被调用。

public class Score : MonoBehaviour { 

    public void AddPointsFor (Plane plane) {
        Debug.Log("A Plane was destroyed!");
        //Tick a counter, add points, do whatever you want!
    }

}
Run Code Online (Sandbox Code Playgroud)

一旦有了这些片段,使它们协同工作就变得很简单。我们乘飞机,并将比分添加为OnDestroyed事件的侦听器。然后,一旦飞机被摧毁,便会触发该事件,并告诉得分加分。

public class Game : MonoBehaviour {

    [SerializeField]
    private Score _score;
    [SerializeField]
    private Plane _plane;

    public void Start () {
        // When you are destroyed let me know so I can add some points.
        _plane.OnDestroyed.AddListener(_score.AddPointsFor);
        _plane.Destroy();
    } 
}
Run Code Online (Sandbox Code Playgroud)

使用事件的另一个大优势是您的飞机甚至不知道分数,它会让所有关心它的人都知道它已经被破坏了。以同样的方式,当飞机被销毁时,此事件还可以用于触发粒子效果,动画和声音效果,而您要做的就是添加更多的侦听器。