Мудрые!
У меня есть функция LoadData()
, которая успешно извлекает JSON данные из моей базы данных Firebase и обновляет мой PlayerData
объект.
Однако, когда я пытаюсь чтобы выполнить функцию UpdateValues()
в моем пользовательском интерфейсе после обновления PlayerData
через прослушиватель событий, он либо обновит пользовательский интерфейс значениями null
, либо Unity будет сканировать sh. И, что любопытно, когда он загружается со значениями null
, он останавливает все Debug.Log
вызовы консоли, продолжая выполнять функции, в которых они содержатся (т.е. данные будут загружаться и обновлять PlayerData
, но вызовы отладки которые должны быть связаны с этими функциями, не доходят до консоли, и UI_Updater
возвращает null
значений).
Метод проб и ошибок заставил меня поверить, что у меня проблема с выполнением UpdateValues()
на основной поток, в результате чего ведение журнала отладки останавливается, а Unity - cra sh.
Как я могу убедиться, что я выполняю UpdateValues()
после завершения async LoadData()
?
Для справки, вот async LoadData()
:
public async Task<PlayerData?> PleaseLoadPlayer()
{
DataSnapshot dataSnapshot = await _database.GetReference(PLAYER_KEY).GetValueAsync();
if (!dataSnapshot.Exists)
{
Debug.Log("PleaseLoadPlayer() returned null.");
return null;
}
else
{
PlayerData loadedPlayerData = JsonUtility.FromJson<PlayerData>(dataSnapshot.GetRawJsonValue());
_playerData.Name = loadedPlayerData.Name;
_playerData.Energy = loadedPlayerData.Energy;
_playerData.Water = loadedPlayerData.Water;
_playerData.Materials = loadedPlayerData.Water;
_playerData.LP = loadedPlayerData.Tribe_LP;
OnPlayerUpdated.Invoke(_playerData);
OnDataSaved.Invoke();
Debug.Log(loadedPlayerData.Name + " has been loaded successfully.");
}
OnLoadComplete.Invoke(); //This is where I am trying to trigger UpdateValues()
return JsonUtility.FromJson<PlayerData>(dataSnapshot.GetRawJsonValue());
}
И UpdateValues()
:
void Start()
{
_player = PlayerBehaviour.GetComponent<PlayerBehaviour>();
_playerSaveManager.OnLoadComplete.AddListener(UpdateValues);
}
public void UpdateValues()
{
if (_player.Name == null)
{
NameDisplay.SetText("Anonymous");
EnergyValueDisplay.SetText("0000");
WaterValueDisplay.SetText("0000");
MaterialValueDisplay.SetText("0000");
Debug.Log("No data exists in PlayerBehaviour.");
}
else
{
NameDisplay.SetText(_player.Name);
EnergyValueDisplay.SetText("" + Energy.ToString("0000"));
WaterValueDisplay.SetText("" + Water.ToString("0000"));
MaterialValueDisplay.SetText("" + Materials.ToString("0000"));
Debug.Log("UI data updated from PlayerBehaviour.");
}
}
Любые советы были бы весьма признательны. Спасибо!