Unity Firebase删除用于云功能的侦听器

时间:2020-01-25 22:08:44

标签: c# firebase unity3d firebase-realtime-database

我很难弄清楚如何删除每隔几分钟触发的云功能的侦听器。我有以下代码:

void InitializeFirebase() {
      FirebaseDatabase.DefaultInstance.GetReference ("Main").ValueChanged += ListenForServerTimestamp;
    }

void OnDisable() {
      FirebaseDatabase.DefaultInstance.GetReference("Main").ValueChanged -= ListenForServerTimestamp;
    }

问题在于,即使在Unity未运行时,偶数仍会注册。即播放按钮已关闭,它仍在注册事件。我在删除事件上一定做错了事,但是在查看了所有其他答案之后,我无法弄清楚问题出在哪里。

谢谢。

编辑:如果有某种方法可以在Unity中断开Firebase的连接,那也是我可以尝试的方法。但是我再找不到在Unity中断开Firebase的任何地方。

1 个答案:

答案 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)中调用其中一些调用,您也会得到奇怪的行为。

除了您的裁判,我认为这些都不是您的问题。但这还有更多要看的东西。

我希望这会有所帮助!

-帕特里克