Firebase Unity3d无法生成Uri链接以启动dwonload assetbundle

Firebase Unity3d无法生成Uri链接以启动dwonload assetbundle,firebase,unity3d,google-cloud-firestore,Firebase,Unity3d,Google Cloud Firestore,问候, 最近,我在一些项目中试用Unity3d和Firebase。我设法从Firebase存储下载了图像,并尝试对assetbundle执行同样的操作 但当我开始下载时,它只是停在Debug.Log(“下载链接生成”) 通常在那之后它会给我Uri链接。 我在图像下载现场再次测试了代码,它仍然有效 以前有人经历过吗?或者我遗漏了一些需要为assetbundle下载做准备的内容 忘了提了,它还在同一个项目中。但是不同的场景 public void DownloadStarted() {

问候,

最近,我在一些项目中试用Unity3d和Firebase。我设法从Firebase存储下载了图像,并尝试对assetbundle执行同样的操作

但当我开始下载时,它只是停在
Debug.Log(“下载链接生成”)
通常在那之后它会给我Uri链接。
我在图像下载现场再次测试了代码,它仍然有效

以前有人经历过吗?或者我遗漏了一些需要为assetbundle下载做准备的内容

忘了提了,它还在同一个项目中。但是不同的场景

public void DownloadStarted()
    {
        StorageReference asset_ref = storage.GetReferenceFromUrl("gs://dummy_link.appspot.com/test_folder/Test_Asset/testbox");

        asset_ref.GetDownloadUrlAsync().ContinueWith((Task<Uri> task) =>
        {
            if (task.IsFaulted && task.IsCanceled)
            {
                Debug.Log(task.Exception.ToString());
            }
            else
            {
                Debug.Log("download link generated");
                Debug.Log("Download URL: " + task.Result);
                downloadLink = task.Result;
                _isDownload = true;

                StartCoroutine(DownloadAsset(task.Result));
            }
        });
    }

    IEnumerator DownloadAsset(Uri uri)
    {
        Debug.Log("Start Download");

        using (UnityWebRequest uwr = UnityWebRequestAssetBundle.GetAssetBundle(uri))
        {
            yield return uwr.SendWebRequest();

            if (uwr.isNetworkError || uwr.isHttpError)
            {
                Debug.Log(uwr.error);
            }
            else
            {

                AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(uwr);

                GameObject instance = Instantiate(bundle.LoadAsset("cube", typeof(GameObject)), gameObj.transform) as GameObject;
            }
        }
    }





public void DownloadStarted()
{
StorageReference asset\u ref=storage.GetReferenceFromUrl(“gs://dummy\u link.appspot.com/test\u folder/test\u asset/testbox”);
asset_ref.GetDownloadUrlAsync().ContinueWith((任务)=>
{
if(task.IsFaulted&&task.IsCanceled)
{
Debug.Log(task.Exception.ToString());
}
其他的
{
Log(“生成下载链接”);
Log(“下载URL:+task.Result”);
downloadLink=task.Result;
_isDownload=true;
start例程(下载资产(task.Result));
}
});
}
IEnumerator下载资产(Uri)
{
Log(“开始下载”);
使用(UnityWebRequest uwr=UnityWebRequestAssetBundle.GetAssetBundle(uri))
{
产生返回uwr.SendWebRequest();
if(uwr.isNetworkError | | uwr.isHttpError)
{
调试日志(uwr.error);
}
其他的
{
AssetBundle bundle=DownloadHandlerAssetBundle.GetContent(uwr);
GameObject实例=实例化(bundle.LoadAsset(“cube”,typeof(GameObject)),gameObj.transform)为GameObject;
}
}
}
可能在与Unity主线程不同的线程上执行

Unity的大多数API只在主线程中工作

在您的情况下,
startcroutine
可能会在线程中无声地(?)失败


特别是对于Unity,您应该在Unity中使用Firebase中的扩展

请注意,您的
if
条件也应该是
|
而不是
&
so


public void DownloadStarted()
{
StorageReference asset\u ref=storage.GetReferenceFromUrl(“gs://dummy\u link.appspot.com/test\u folder/test\u asset/testbox”);
asset_ref.GetDownloadUrlAsync()。ContinueWithOnMainThread((任务)=>
{
//我想这里应该是| |而不是&&
if(task.IsFaulted | | task.IsCanceled)
{
Debug.Log(task.Exception.ToString());
}
其他的
{
Log(“生成下载链接”);
Log(“下载URL:+task.Result”);
downloadLink=task.Result;
_isDownload=true;
start例程(下载资产(task.Result));
}
});
}

public void DownloadStarted(){
StorageReference asset_ref=storage.GetReferenceFromUrl(虚拟链接);
`asset_ref.GetDownloadUrlAsync().ContinueWithOnMainThread((任务)=>{…`像这样吗?是的,基本上和你刚才用
ContinueWith
替换
ContinueWith
(如果需要添加名称空间等)测试过的一样,仍然停留在同一个地方。但是谢谢你回答我的问题。@GuanShengWong你检查错误了吗?应该是
if(task.IsFaulted | | task.IsCanceled)
而不是
&&
可能是您的请求失败了,但您尝试访问
任务。结果
。检查您的URL是否正确是的,在您编辑的评论之后。我设法得到了此错误。
System.aggregateeexception:发生了一个或多个错误。-->Firebase.Storage.StorageException:权限被拒绝。无法执行此操作Http代码:403---内部异常堆栈跟踪结束---->(内部异常#0)Firebase.Storage.StorageException:权限被拒绝。无法执行此操作Http代码:403btw我认为如果(task.IsFaulted | | task.IsCanceled)则应该是
。我完全不熟悉Unity3D api,而不是
&&
。但请检查
Result
属性是否应在下载开始阶段可用,或仅在下载结束时可用。有时可能是它以极快的速度下载资产(然后获得第二个日志),还没有完成的案例,只是暂停。