Просто чтобы расширить предыдущий ответ. Вы захотите сделать следующее:
1) На самом деле назовите функцию для обработки события (чтобы вы могли -=
это позже):
private void HandleValueChanged(object sender, ValueChangedEventArgs args) {
}
2) Кэшируйте ссылку на запрос, который вы будете использовать ValueChanged с:
Query _cachedQuery;
void Start() {
playersRef = FirebaseDatabase.DefaultInstance.GetReference("players");
_cachedQuery = playersRef.OrderByChild("level");
_cachedQuery.ValueChanged += HandleValueChanged;
}
3) Когда вы закончите, удалите слушателя. Для получения бонусных баллов проверьте, не является ли оно ненулевым (ie: если вы используете Start вместо Awake, это будет обрабатывать случай, когда объект вызывал DestroyImmediate
до первого обновления l oop).
void OnDestroy() {
if (_cachedQuery != null) {
_cachedQuery -= HandleValueChanged;
_cachedQuery = null;
}
}
C# само по себе обычно не позволяет вам «удалить все» из события (хотя вы можете обойти это ). Но если вы привыкли к этому шаблону или (как и я) предпочитаете работать в UnityEvent
с, вы всегда можете сделать все это в классе, который предоставляет UnityEvent
. Затем вы можете вызвать RemoveAllListeners для этого создаваемого вами прокси-класса (хотя я бы посчитал RemoveAll
«запахом кода» в своем личном стиле, каждая команда должна решать, что они делают, а что нет). рассмотреть хороший код).