質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Storage

Google Cloud Storageは、グーグル社が提供しているクラウドベースのデベロッパー・企業向けストレージサービス。可用性に優れ、APIで操作可能なため、データのアーカイブ保存やアプリケーションのコンテンツ提供など様々な用途に活用できます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

1624閲覧

実機AndroidでDownloadHandlerAssetBundle.GetContent()がnullになる

nico29

総合スコア76

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Storage

Google Cloud Storageは、グーグル社が提供しているクラウドベースのデベロッパー・企業向けストレージサービス。可用性に優れ、APIで操作可能なため、データのアーカイブ保存やアプリケーションのコンテンツ提供など様々な用途に活用できます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/12/28 08:58

#やりたいこと
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にしています。
storageSS

#コード

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);

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問