【问题标题】:How to use a delegate in unity to notify that firebase has retrieved a document如何统一使用委托来通知firebase已检索到文档
【发布时间】:2020-04-14 02:18:32
【问题描述】:

我有一个具有相同名称的类的 firebasesript.cs 文件,在开始时我检索了 firebase 文档。对于检索到的每个试图让 main.cs 得到通知的文档。

在 firebasescript 中有

public delegate void LoadDoc();
public static event LoadDoc onLoadDoc;

主要有

void Start()
{

   firebasescript.onLoadDoc += DocLoaded;

}

void DocLoaded()
{
   Debug.Log("loaded");
}

只是不知道如何在 firebasescript 中触发事件:

  foreach (DocumentSnapshot documentSnapshot in capitalQuerySnapshot.Documents) {
    Debug.Log(String.Format("Document data for {0} document:", documentSnapshot.Id));
    Dictionary<string, object> city = documentSnapshot.ToDictionary();
    foreach (KeyValuePair<string, object> pair in city) {

**//here is where i want the notification to happen**

      Debug.Log(String.Format("{0}: {1}", pair.Key, pair.Value));
    }
  };
});

如果有更好的方法可以做到这一点,请接受所有建议。 谢谢。

【问题讨论】:

    标签: c# firebase unity3d


    【解决方案1】:

    首先,我强烈建议阅读Microsoft's C# event documentation,包括how to publish events

    TLDR 是您只需在 firebasescript 中调用 onLoadDoc(); 即可引发事件。您可能还需要检查 null 以防万一:

    if (onLoadDoc != null) {
        onLoadDoc();
    }
    

    您还需要取消订阅OnDestroy 中的侦听器,否则您很有可能会在Unity Overrides null 中获得空引用异常并依赖于底层 C++ 逻辑(请注意,在正常情况下C# 框架,这仍然是内存泄漏,即使它不为空):

    void OnDestroy() {
        firebasescript.onLoadDoc -= DocLoaded;
    }
    

    另外一条建议是,如果您在 Unity 中工作,您可能希望使用 UnityEvent 而不是 C# 事件。在我自己的测试中,我发现它的性能略逊一筹。好处是它知道 Unity 生命周期(当对象变为 null/当调用 OnDestroy 时),您不必在调用之前进行 null 检查,并且可以将它们连接到编辑器中。在迭代您的游戏设计或启用团队中技术含量较低的成员时,最后一点非常有用。

    您将字段声明更改为如下所示:

    public UnityEvent OnLoadDoc = new UnityEvent();
    

    你会调用它:

    OnLoadDoc.Invoke();
    

    你可以添加一个监听器:

    OnLoadDoc.AddListener(DocLoaded);
    

    我发现 UnityEvent 似乎没有必要取消订阅,但这仍然是一种很好的做法(并且可能会提高一点性能):

    OnLoadDoc.RemoveListener(DocLoaded);
    

    我可能会建议的另一件事是:您可以使用 UniRx 为您的 Firebase 游戏添加响应式功能。我不是最大的响应式编程爱好者,但我的大多数同事都非常喜欢这种模式,它为您提供了强大的功能来控制事件的构建、聚合和分派方式。

    --帕特里克

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多