首页 > 解决方案 > 当对象被销毁时,如何使程序执行某些操作?

问题描述

我的程序中有飞机(如飞机)物体,当子弹击中它们时它们会被摧毁,但它们也会在 5 秒后离开屏幕时被摧毁。

我还有一个健康脚本,当它下降到 0 时会重置整个东西,并且我想在每次对象被销毁时删除一个点,但仅限于屏幕外。所以我将脚本分开。

我在船舶生成脚本中使用它来在 5 秒后摧毁它们,很简单。

Destroy(spawnedPlane, 5f);

如果我可以有一些代码来执行“在 X 秒后销毁此对象并将其添加到此值”,那将是完美的。因为据我了解,“销毁”只接受 2 个参数,不接受其他参数。

当然这是可能的,但我不知所措。对此仍然很陌生。抱歉,如果这不清楚,但我几乎不知道自己在做什么。

标签: c#unity3d

解决方案


您可以使用事件来干净利落地实现您所追求的目标。以下是您可能会发现有用的事件示例。其他对象可以侦听该事件,一旦触发,它们就会收到通知。

[Serializable]
public class PlaneEvent : UnityEvent<Plane> { }

定义事件后,您可以将其添加为平面中的字段。一旦你的飞机被摧毁,你可以触发事件,它会反过来通知任何正在监听的人!

public class Plane : MonoBehaviour {

    public PlaneEvent OnDestroyed;

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

}

OnDestroyed现在,在我们的 score 类中,我们添加了一个方法,一旦触发了飞机事件,就会调用该方法。

public class Score : MonoBehaviour { 

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

}

一旦我们有了这些部分,让它们一起工作就很简单了。我们乘坐飞机并将分数作为OnDestroyed事件的侦听器添加。然后,一旦飞机被摧毁,就会触发事件并告诉 score 加分。

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();
    } 
}

使用事件的另一大优势是你的飞机根本不知道分数的存在,它会让任何关心它的人知道它已被摧毁。同样,这个事件也可以用于在飞机被摧毁时触发粒子效果、动画和声音效果,您需要做的就是添加更多的侦听器。


推荐阅读