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

标签 c# unity3d

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

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

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

Destroy(spawnedPlane, 5f);


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

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

最佳答案

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

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




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

public class Plane : MonoBehaviour {

    public PlaneEvent OnDestroyed;

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

}




现在,在得分类中,我们添加了一个方法,一旦触发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!
    }

}




一旦有了这些片段,使它们协同工作就变得很简单。我们乘飞机,并将乐谱作为侦听器添加到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();
    } 
}


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

关于c# - 销毁对象时如何使程序执行某些操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56387393/

相关文章:

c# - 脚本需要Derive from MonoBehaviour,不能带参数

c# - Topshelf 中托管的 WCF 服务需要很长时间才能关闭

c# - XAML 键绑定(bind) 1,2,3

c# - Unity中的简单键盘输入

c# - Unity 180 旋转 Texture2D,或者翻转两者

c# - 评估嵌套在 foreach 中的值和国际象棋中的 if 方法

c# - ASP.NET MVC Cookie 在页面更改时丢失值

c# - 如何绑定(bind)或以其他方式获取和设置资源中控件的值?

c# - YouTube HTTP请求

c# - Unity Particle Collider 与粒子