好吧,并非在所有情况下都可以,但是在生产中使用它们时,您肯定需要三思。
事件驱动架构在Unity中变得非常流行,因为它简化了组件之间的通信。 没有事件,现代UI也可能是不可想象的。 C#中的事件由委托支持,在本文中,我重点介绍多播委托。
因此,让我们通过示例检查代理的问题。 我已经实例化了〜1000个对象,这些对象都已订阅一个委托
Manager.OnSomethingHappend + =回调;
在下面的屏幕截图中,我们可以看到当我们添加一个也订阅该事件的对象时发生了什么。

让我们看看MulticastDelegate.CombineImpl()
源中发生了什么
这是一个不变的列表,每次我们订阅事件时都会重新创建。 Unity 2017随附的更新版本的Mono Runtime怎么样? 它使用Array.Copy
,所以基本上每次我们订阅/退订我们都会创建一个新数组(源)。
除了创建自己的委托实现之外,我们还有哪些选择? 不幸的是,没有灵丹妙药,我们需要在不同的情况下使用每种解决方案。
接口应该有所帮助。 当然,用接口替换每个事件不是一个完美的方法。 这会使您的代码肿,或使其可读性降低。 但是,对于一些偶尔使用的情况有几个通用的回调接口,对于经常使用的回调有一些特定的(非常描述性的)接口很方便。
如果订阅者列表非常小,则仍可以使用代表 ,但您不希望一小撮人肯定会监听一个事件。