Задача, возвращаемая Firebase, вероятно, завершает выполнение в потоке, отличном от основного, а сопрограммы Unity могут работать только в основном потоке.
Поддержка Unity многопоточности и асинхронности c довольно нестабильна, включая "съедание" некоторых ошибок, если продолжение этих ошибок будет выполняться в другом потоке, отличном от основного.
Чтобы исправить это, вам нужно изменить функцию, запускающую вашу сопрограмму:
try {
// Important: ConfigureAwait(true) ensures the code after this will run in the
// same thread as the code before (which is the main thread!)
var url = await path_reference.GetDownloadUrlAsync().ConfigureAwait(true);
StartCoroutine(DownloadStuff(url));
} catch (Exception ex) {
// Tip: when logging errors, use LogException and pass the whole exception,
// that way you will get pretty links to the error line in the whole stack trace.
Debug.LogException(ex);
}
Кстати, у меня обычно есть несколько методов расширения для всех моих проектов, чтобы справиться с этим, оставаясь в asyn c -world вместо coroutine-world (потому что, по крайней мере, с asyn c я могу поймать ошибки, а не просто «остановиться и загореться», как сопрограммы Unity) *
await new WaitForSeconds(0.2f).ToTask(this);
UnityWebRequest request = /* etc */;
await request.SendAsync(this);
var texture = DownloadHandlerTexture.GetContent(request);
Обратите внимание, что эти методы не требуют ConfigureAwait
, поскольку их вызовы SetResult
/ SetException
выполняются из продолжений сопрограмм, предоставляемых Unity.