我正在尝试使用以下示例从Firebase存储中下载和使用图像:
How to download image from firebase database, and load it into image in unity
跟随调试查找问题:
UnityEngine.UnityException:SupportsTextureFormatNative只能从主线程调用。
请提供,如何解决?或者,也许您可以提供其他方式来下载和使用图像。
谢谢!
我的代码:
var firebase = FirebaseStorage.DefaultInstance;
var storageRef = firebase.GetReferenceFromUrl(_urlPics);
storageRef.Child(_resourceName).GetBytesAsync(1024*1024).ContinueWith(task =>
{
if (task.IsCompleted)
{
var texture = new Texture2D(2, 2);
byte[] fileContent = task.Result;
texture.LoadImage(fileContent);
var newRect = new Rect(0.0f, 0.0f, texture.width, texture.height);
var sprite = Sprite.Create(texture, newRect, Vector2.zero);
_image.sprite = sprite;
Debug.Log("FINISH DOWNLOAD");
}
else
{
print("DOWNLOAD WRONG");
}
});
从以下位置抛出错误:
var texture = new Texture2D(2, 2);
答案 0 :(得分:1)
对此我很快得到了一个很好的说明(感谢Pux0r3):
这是次要更新,但是将
ContinueWith
替换为ContinueWithOnMainThread可以稍微改善这一点。在.NET 4.x运行时中,延续可能经常在后台执行,而此扩展方法会将其推送到主线程。
.NET 3.x运行时不存在此问题,因为连续性包含在Parse库中,而隐式做到这一点。
有关此方法和其他实现方式的更多信息,请参见 Firebase and Tasks, how to deal with asynchronous logic in Unity 。
因此,前ContinueWith
前“有效”。为了确保并且不必使用例如来实现自定义工作器ConcurrentQueue<Action>
(一种在Unity中将回调分配到主线程的常用方法),只需将Firebase.Extensions.TaskExtension
中的ContinueWith
替换为ContinueWithOnMainThread
,就可以了。