Как использовать делегата в единстве, чтобы уведомить, что firebase получил документ - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть файл firebasesript.cs с одноименным классом, и в меню «Пуск» я получаю документы Firebase. Для каждого извлечения c пытается получить 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));
    }
  };
});

И если есть более эффективные способы сделать это определение открытым для всех предложений. Спасибо.

1 Ответ

0 голосов
/ 14 апреля 2020

Для начала я настоятельно рекомендую прочитать документацию C# от Microsoft , включая как публиковать sh события .

TLDR - это то, что вы просто нужно вызвать onLoadDoc(); в вашем firebasescript, чтобы вызвать событие. Вы также, вероятно, захотите проверить на нулевое значение в случае:

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

Вы также захотите отписаться от слушателя в OnDestroy, в противном случае есть очень хороший шанс, что вы получите нулевое значение ссылаться на исключение, как Unity переопределяет нуль и опирается на лежащие в основе C ++ logi c (обратите внимание, что в нормальном C# фреймворке это все еще утечка памяти, даже если она не обнуляется):

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

Еще один совет: если вы работаете в Unity, вы, вероятно, захотите использовать UnityEvent , а не C# события. В моем собственном тестировании я нашел это немного менее эффективным. Положительным моментом является то, что он знает о жизненном цикле Unity (когда объекты go равны нулю / когда вызывается OnDestroy), вам не нужно выполнять проверку нуля перед вызовом, и вы можете подключить их в редакторе. Этот последний бит очень полезен при итерации вашего игрового дизайна или для включения менее технических членов вашей команды.

Вы бы изменили объявление поля, чтобы оно выглядело примерно так:

public UnityEvent OnLoadDoc = new UnityEvent();

You я бы вызвал его с помощью:

OnLoadDoc.Invoke();

И вы можете добавить слушателя с помощью:

OnLoadDoc.AddListener(DocLoaded);

Я обнаружил, что отписаться не нужно с UnityEvent, но это все еще хорошая практика (и, вероятно, немного повышение производительности):

OnLoadDoc.RemoveListener(DocLoaded);

Еще одна вещь, которую я могу предложить: вы можете использовать UniRx , чтобы добавить реактивные функции в вашу игру Firebase , Я не самый большой поклонник реактивного программирования, но большинство моих коллег действительно в курсе, и он дает вам мощные функции для управления тем, как события создаются, агрегируются и отправляются.

- Патрик

...