如何在Unity中从Firebase存储设置图像?

问题描述

我现在正在为Unity和Firebase Storage苦苦挣扎。我想获取存储在Firebase存储中的图像,将其设置为纹理,然后将纹理指定为材质。但是,红色的问号像图片一样出现在场景中。我试图找到解决方案,但找不到。这是我的代码

public class TestScript : MonoBehavIoUr
{
    public GameObject plane;
    public Material testMaterial;

    private void Start()
    {
        // Get a reference to the storage service,using the default Firebase App
        Firebase.Storage.FirebaseStorage storage = Firebase.Storage.FirebaseStorage.DefaultInstance;

        Firebase.Storage.StorageReference storage_ref = storage.GetReferenceFromUrl("removed for question");

        byte[] fileContents = null;

        storage_ref.Child("redHeart.png").GetBytesAsync(1024 * 1024)
         .ContinueWith((Task<byte[]> task) =>
         {
             if (task.IsFaulted || task.IsCanceled)
             {
                 Debug.Log(task.Exception.ToString());
             }
             else
             {
                fileContents = task.Result;
             }
         });

        Texture2D texture = new Texture2D(1024,1024);
        texture.LoadImage(fileContents);
        testMaterial.SetTexture("_MainTex",texture);
        plane.GetComponent<Renderer>().sharedMaterial = testMaterial;
        Debug.Log("finished");
    }
}

enter image description here

解决方法

据我了解您的问题,我想回答。
我认为加载图片后运行的异步功能可能存在问题。
试试这个。存储后,即可显示它。
像这样的东西

Firebase.Storage.FirebaseStorage storage = Firebase.Storage.FirebaseStorage.DefaultInstance;

Firebase.Storage.StorageReference storage_ref = storage.GetReferenceFromUrl("removed for question");

storage_ref.Child("redHeart.png").GetBytesAsync(1024 * 1024)
     .ContinueWith((Task<byte[]> task) =>
         {
             if (task.IsFaulted || task.IsCanceled)
             {
                 Debug.Log(task.Exception.ToString());
             }
             else
             {
               byte[] fileContents = task.Result;
               Debug.Log("Load Image after getting result!");

               Texture2D texture = new Texture2D(1024,1024);
               texture.LoadImage(fileContents);
               testMaterial.SetTexture("_MainTex",texture);
               plane.GetComponent<Renderer>().sharedMaterial = testMaterial;
               Debug.Log("finished");
             }
         });