我很难弄清楚如何删除每隔几分钟触发的云功能的侦听器。我有以下代码:
void InitializeFirebase() {
FirebaseDatabase.DefaultInstance.GetReference ("Main").ValueChanged += ListenForServerTimestamp;
}
void OnDisable() {
FirebaseDatabase.DefaultInstance.GetReference("Main").ValueChanged -= ListenForServerTimestamp;
}
问题在于,即使在Unity未运行时,偶数仍会注册。即播放按钮已关闭,它仍在注册事件。我在删除事件上一定做错了事,但是在查看了所有其他答案之后,我无法弄清楚问题出在哪里。
谢谢。
编辑:如果有某种方法可以在Unity中断开Firebase的连接,那也是我可以尝试的方法。但是我再找不到在Unity中断开Firebase的任何地方。
答案 0 :(得分:1)
我的主要建议是将数据库引用缓存在要检索它的脚本中。像这样:
DatabaseReference _mainRef;
void InitializeFirebase() {
_mainRef = FirebaseDatabase.DefaultInstance.GetReference ("Main");
_mainRef.ValueChanged += ListenForServerTimestamp;
}
void OnDisable() {
if(_mainRef != null) {
_mainRef.ValueChanged -= ListenForServerTimestamp;
_mainRef = null;
}
}
如果您检查GetReference
,则会在ILSpy中看到以下内容:
public DatabaseReference GetReference(string path)
{
return new DatabaseReference(this.internalDatabase.GetReference(path), this);
}
因此,您可能要删除对象 other 上的监听器,而不是注册它的对象。
还有一些其他事情需要仔细检查。我建议您在MonoBehaviour
而不是ScriptableObject
上执行此操作。由于您提到事件是在未选择“播放”按钮时触发的,因此我希望这会在编辑器中发生。 ScriptableObject
通常不会像我在编辑器中期望的那样运行,并且可能导致播放/暂停周围出现奇怪的问题。
如果它位于MonoBehaviour
上,则建议您不要将其放在具有[ExecuteInEditMode]
属性的对象上。如果您从编辑器脚本(CustomEditor,PropertyDrawer和&c)中调用其中一些调用,您也会得到奇怪的行为。
除了您的裁判,我认为这些都不是您的问题。但这还有更多要看的东西。
我希望这会有所帮助!
-帕特里克