【问题标题】:cant load asset from firebase storage to unity无法将资产从 Firebase 存储加载到统一
【发布时间】:2019-11-18 15:38:34
【问题描述】:

我正在使用 vuforia 和 unity 创建一个增强现实应用程序。我已将我的assetbundle 上传到firebase 存储,我想检索保存在其中的3d 模型并将其作为子对象加载到我的图像目标游戏对象上,但我无法检索它。我还安装了firebase unity sdk。

using Firebase;
using Firebase.Storage;
using System.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using System;
using UnityEngine.Networking;
using UnityEngine.UI;

public class loadmodel2 : MonoBehaviour
{
    public GameObject test;

    void Start()
    {
        FirebaseStorage storage = FirebaseStorage.DefaultInstance;

        Firebase.Storage.StorageReference reference =storage.GetReferenceFromUrl("gs://fit-union-221609.appspot.com/assettest1/myasset");

        reference.GetDownloadUrlAsync().ContinueWith((Task<Uri> task) => {
            if (!task.IsFaulted && !task.IsCanceled)
            {
                Debug.Log("Download URL: " + task.Result);
                // ... now download the file via WWW or UnityWebRequest.
                StartCoroutine(Loadcoroutine());
            }
        });
    }

    IEnumerator Loadcoroutine()
    {
        string url = "gs://fit-union-221609.appspot.com/assettest1/myasset";
        WWW www = new WWW(url);
        while (!www.isDone)
            yield return null;
        AssetBundle myasset = www.assetBundle;

        GameObject mya1 = myasset.LoadAsset("Barbarian Variant") as GameObject;

        Instantiate(mya1).transform.parent = test.transform;
    }
}

我创建了一个具有相同名称“myasset”的新资产包并将其上传到 firebase 存储我还将 3d 模型的名称更改为“BarbarianVariant”删除空间

在这里,我在主摄像头中启用了 loadmodel2 脚本,并为我分配主摄像头的测试游戏对象。您还可以在控制台中看到我得到的输出

【问题讨论】:

    标签: firebase unity3d firebase-storage unitywebrequest


    【解决方案1】:

    首先,您的组件 loadmodel2 在 Inspector 中被禁用,因此它的 Start 永远不会被调用...


    我不是 Firebase 专家,但您首先使用 GetDownloadUrlAsync,然后无论如何都不要使用结果,而是创建一个新的 UnityWebRequest 从相同的参考 URL 下载它。

    您不想使用从task.Result 检索到的下载 URL,例如

    StartCoroutine(Loadcoroutine(task.Result));
    
    ...
    
    IEnumerator Loadcoroutine(Uri uri)
    {
        ...
    }
    

    然后注意 WWW(obsolete) != UnityWebRequest!

    您想要做的可能是使用UnityWebRequestAssetBundle.GetAssetBundle(或以前的版本UnityWebRequest.GetAssetBundle

    IEnumerator Loadcoroutine(Uri uri)
    {
        using(var www = UnityWebRequestAssetBundle.GetAssetBundle(uri))
        {
            yield return www.SendWebRequest();
    
            if(www.isNetworkError || www.isHttpError) 
            {
                Debug.Log(www.error);
            }
            else 
            {
                AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);
    
                // Make sure this path is correct! Afaik it should at least start with "Assets/..."
                var mya1 =  bundle.LoadAssetAsync<GameObject>("Barbarian Variant");
                yield return mya1;
    
                var obj = Instantiate((GameObject)mya1.asset);
                obj.transform.parent = test.transform;
            }
        }
    }
    

    一般来说,我也会避免在 GameObject 名称中使用空格。

    【讨论】:

    • tnx 的回复,但我收到一个错误,说我无法将 task.result 从 system.uri 转换为字符串
    • 是的,我的错.. 我后来注意到这是一个Task&lt;Uri&gt; 更新了答案。
    • 我在转换中得到一个错误,说对象不包含转换的定义,并且找不到接受对象类型的第一个参数的可访问扩展方法转换,但即使该行代码被删除,它也应该从 firebase 下载我的模型,但它没有被下载
    • 对不起,我只在手机上打字;)您必须将返回的 Object 转换为 GameObject。像var obj = Instantiate((GameObject)mya1.asset);var obj = (GameObject) Instantiate (mya1.asset); 应该是相同的afaik。您究竟如何跟踪下载?你有任何错误吗?你试过一步步调试代码吗?
    • 嗯,这是我在控制台上得到的输出 - 下载 URL:firebasestorage.googleapis.com/v0/b/… UnityEngine.Debug:Log(Object) Loadmodel2:b__1_0(Task`1)(在 Assets/Loadmodel2. cs:25) System.Threading._ThreadPoolWaitCallback:PerformWaitCallback()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2017-06-22
    • 2021-09-19
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多