Моим лучшим предложением будет кэширование ссылки на вашу базу данных в сценарии, где вы ее извлекаете. Примерно так:
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);
}
Так что вы можете удалить слушателя на объекте другой , чем тот, на котором вы его зарегистрировали.
Несколько других вещей, которые нужно перепроверить. Я бы порекомендовал вам сделать это на MonoBehaviour
, а не на ScriptableObject
. Поскольку вы упоминаете, что события запускаются, когда кнопка воспроизведения не нажата, я ожидаю, что это происходит в редакторе. ScriptableObject
обычно ведет себя не так, как я ожидаю в редакторе, и может вызывать странные проблемы с воспроизведением / паузой.
Если он установлен на MonoBehaviour
, я бы порекомендовал вам не устанавливать его на тот, который имеет атрибут [ExecuteInEditMode]
. Вы также можете получить странное поведение, если вызываете некоторые из этих вызовов из сценария редактора (CustomEditor, PropertyDrawer и & c).
Я не думаю, что какой-либо из них (кроме ссылки) ваша проблема. Но стоит взглянуть еще на несколько вещей.
Надеюсь, это поможет!
- Патрик