#やりたいこと
Firebase Storageにあるアセットバンドルを読み込みたい
#問題点
Firebase StorageからURIを取得して、リクエストを送信するまではできたのですが、DownloadHandlerAssetBundle.GetContent(request)を実行すると、Unity上では問題なく読み込めるのですが、Androidで実行するとnullが返されます。
#開発環境
Unityのバージョン変更しても同じでした。
Unity2019.4.17f1 personal
Unity2020.1.17f1 personal
実機 Android ver9 API28
Minimun API Level Android4.4(API19)
Target API Level Automatic(API30)
#AssetBundleのBuildについて
c#
1 [MenuItem("Assets/Build AssetBundles")] 2 static void BuildAllAssetBundles() 3 { 4 BuildPipeline.BuildAssetBundles("Assets/AssetBundles/", BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.Android); 5 BuildPipeline.BuildAssetBundles("Assets/AssetBundles/", BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.WebGL); 6 }
#Firebase Storageの状態
スプライトを割り当てたImageゲームオブジェクトをPrefabにしています。
#コード
C#
1public class LoadAssetBundle : MonoBehaviour 2{ 3 [SerializeField] Text log; 4 AssetBundle assetBundle; 5 Uri uri; 6 7 private void Start() 8 { 9 GetURI(); 10 } 11 12 async void GetURI() 13 { 14 log.text = "GetReferenceFromUrl"; 15 16 //参照作成 17 FirebaseStorage storage = FirebaseStorage.DefaultInstance; 18 StorageReference ref_store = storage.GetReferenceFromUrl("gs://xxx.appspot.com/"); 19 var ref_test = ref_store.Child("public/test"); 20 21 log.text += " : ref_test.Name = " + ref_test.Name; 22 log.text += "\n" + "GetDownloadUrlAsync"; 23 24 //URIを取得 ※1 25 uri = await Task.Run(() => ref_test.GetDownloadUrlAsync()); 26 27 log.text += " : uri = " + uri.ToString(); 28 29 StartCoroutine(DownloadAssetBundle()); 30 } 31 32 IEnumerator DownloadAssetBundle() 33 { 34 log.text += "\n" + "UnityWebRequestAssetBundle"; 35 36 //リクエストを送信 37 var request = UnityWebRequestAssetBundle.GetAssetBundle(uri); 38 39 yield return request.SendWebRequest(); 40 41 //エラー処理 42 if (request.isHttpError || request.isNetworkError) 43 { 44 log.text += " : " + request.error; 45 yield break; 46 } 47 48 log.text += " : request.GetHashCode = " + request.GetHashCode(); 49 log.text += "\n" + "DownloadHandlerAssetBundle"; 50 51 //ハンドラーからアセットバンドルを取得 52 assetBundle = DownloadHandlerAssetBundle.GetContent(request); 53 54 if (assetBundle == null) 55 { 56 log.text += " : null"; 57 yield break; 58 } 59 60 log.text += " : assetBundle.GetHashCode = " + assetBundle.GetHashCode(); 61 62 //アセットバンドルの読み込み 63 var list = assetBundle.GetAllAssetNames(); 64 65 log.text += "\n" + "assetBundle.GetAllAssetNames[0]= " + list[0]; 66 log.text += "\n" + "LoadAssetAsync"; 67 68 var loadAsset = assetBundle.LoadAssetAsync(list[0]); 69 70 yield return loadAsset; 71 72 log.text += " : asset.name = " + loadAsset.asset.name; 73 74 //読み込んだプレハブを配置 75 var instance = Instantiate(loadAsset.asset) as GameObject; 76 instance.transform.SetParent(GameObject.Find("Canvas").transform); 77 instance.transform.localPosition = Vector3.zero; 78 instance.transform.localScale = Vector3.one; 79 80 log.text += "\n" + "complete"; 81 } 82}
※1 uri取得について
firebaseの公式に書かれてるContinueWith()を使うと、Task<Uri>でエラーが出たり、実機だと進まなかったりしたため、このような書き方をしてます。(合ってるのかどうかわからないのですが)
同様の理由で、GooglePlay開発者サービスのチェックも書けずにいますが、実機には最新バージョンをインストール済みです。
#log.textについて
VisualStudioでデバッグする方法を試したのですがエラー出て接続できなかったので、テキストに出すようにしてます。
結果は以下の通りです。
Unity
1GetReferenceFromUrl : ref_test.Name = test 2GetDownloadUrlAsync : uri = https://firebasestorage.googleapis.com/v0/b/xxxx.appspot.com/o/public%2Ftest?alt=media&token=xxxx 3UnityWebRequestAssetBundle : request.GetHashCode = 80432256 4DownloadHandlerAssetBundle : assetBundle.GetHashCode = 14838 5assetBundle.GetAllAssetNames[0]= assets/image.prefab 6LoadAssetAsync : asset.name = Image 7complete
Android
1GetReferenceFromUrl : ref_test.Name = test 2GetDownloadUrlAsync : uri = https://firebasestorage.googleapis.com/v0/b/xxxx.appspot.com/o/public%2Ftest?alt=media&token=xxxx 3UnityWebRequestAssetBundle : request.GetHashCode = 1271490944 4DownloadHandlerAssetBundle : null
#試したこと
Unityフォーラム
機械翻訳頼みですが、同じ現象のように思います。解決されてないのかなと思いますが、その場合、違うやり方があるのでしょうか?
WWWを、旧式ですというメッセージを無視して使ってみたのですが、結果は同じでした。
実機は一度アンインストールしてからビルドしてます。
c#
1 //ハンドラーからアセットバンドルを取得 2 WWW www = WWW.LoadFromCacheOrDownload(uri.ToString(), 0); 3 while (!www.isDone) 4 { 5 yield return null; 6 } 7 assetBundle = www.assetBundle; 8 www.Dispose(); 9 10 11 //assetBundle = DownloadHandlerAssetBundle.GetContent(request);
よろしくお願いいたします。
あなたの回答
tips
プレビュー