【发布时间】:2022-01-17 08:39:11
【问题描述】:
我正在使用 Unity 3D,但是,该信息对于解决此问题应该无关紧要,因为核心问题是 System.Delegate(我想让您知道,因为我将链接到一些 Unity 文档以进行澄清)。
我有一个自定义窗口,它具有自定义更新功能DirectorUpdate。无论用户/窗口在做什么,我都需要这个函数来运行每个编辑器更新。
为了在每次编辑器更新时调用它,我将我的方法与 Delegate EditorApplication.update 结合起来:
protected void OnEnable()
{
// If I do the below, base EditorApplication.update won't be called anymore.
// EditorApplication.update = this.DirectorUpdate;
// So I need to do this:
EditorApplication.update = (EditorApplication.CallbackFunction)System.Delegate.Combine(new EditorApplication.CallbackFunction(this.DirectorUpdate), EditorApplication.update);
... // Other stuff
}
请注意,这是在窗口的 OnEnable 内完成的。
问题在于 OnEnable 在一次运行期间可能会被多次调用(例如,在单个编辑器会话期间关闭窗口然后重新打开窗口时)导致强>
EditorApplication.update = (EditorApplication.CallbackFunction)System.Delegate.Combine(new EditorApplication.CallbackFunction(this.DirectorUpdate), EditorApplication.update);
被多次调用,意味着我的更新方法(this.DirectorUpdate)每次更新最终都会被多次调用,这会导致一些严重的错误。
所以, 问题是我如何检查EditorApplication.update 是否已经有我的方法“内部”。 (在里面,我当然是说它已经是System.Delegate.Combine(d) 给代表了。)
我知道可能还有其他解决方案,例如在窗口关闭时将 EditorApplication.update 恢复到之前的状态,但这并不适用于所有情况(例如,在窗口刷新期间也会调用 OnEnable 和这样)并且该错误将持续存在。 (另外,如果另一个窗口在此窗口打开时与 EditorApplication.update 连接怎么办?)因此,最好的解决方案是在 Delegate.Combine 之前检查 EditorApplication.update 是否已经调用此方法。
【问题讨论】:
标签: c# unity3d delegates concatenation multicastdelegate