c# - 当对象被销毁时,如何使程序执行某些操作?
问题描述
我的程序中有飞机(如飞机)物体,当子弹击中它们时它们会被摧毁,但它们也会在 5 秒后离开屏幕时被摧毁。
我还有一个健康脚本,当它下降到 0 时会重置整个东西,并且我想在每次对象被销毁时删除一个点,但仅限于屏幕外。所以我将脚本分开。
我在船舶生成脚本中使用它来在 5 秒后摧毁它们,很简单。
Destroy(spawnedPlane, 5f);
如果我可以有一些代码来执行“在 X 秒后销毁此对象并将其添加到此值”,那将是完美的。因为据我了解,“销毁”只接受 2 个参数,不接受其他参数。
当然这是可能的,但我不知所措。对此仍然很陌生。抱歉,如果这不清楚,但我几乎不知道自己在做什么。
解决方案
您可以使用事件来干净利落地实现您所追求的目标。以下是您可能会发现有用的事件示例。其他对象可以侦听该事件,一旦触发,它们就会收到通知。
[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();
}
}
使用事件的另一大优势是你的飞机根本不知道分数的存在,它会让任何关心它的人知道它已被摧毁。同样,这个事件也可以用于在飞机被摧毁时触发粒子效果、动画和声音效果,您需要做的就是添加更多的侦听器。
推荐阅读
- excel - 有没有办法使用 LOOKUP/VLOOKUP/HLOOKUP 在 EXCEL 中返回标题。当前公式返回错误值
- node.js - create-react-app/express 代理错误:无法代理请求(ECONNRESET)
- python - 如何根据当前页面url更改django中的href?
- reactjs - 尽管在沙盒中有效,但国家端点没有返回任何内容
- python - 为什么这个插入二叉搜索树的python代码不起作用?
- html - 为什么有些网格项目出现乱序?
- java - 从数据库中读取 java.sql.Date 的 TimeZone 时,如何考虑它?
- c - 为 GTK 2.24 和 GTK 3 和 GTK 4 创建菜单栏
- rsync - 处理删除时双向同步
- django - 根据某些用户信息过滤 query_set 的最安全和最干燥的方法