前回はプロジェクトのAssetフォルダ内のResourcesフォルダに入っている画像ファイル(png)をImageに表示する方法について書きました。でも、ゲームなどではプログラマが用意した画像を表示できれば大抵よいのでそれで十分かも知れませんが、一般のアプリでは前に撮影した写真を表示するなどできないと困るでしょう。そこで今回はローカル(スマホのストレージ)に保存されている画像を表示するコードの紹介です。
準備としてプロジェクトに「RawImage100」というRawImageを用意しておきます(Canvasの下に)。また、好きなフォルダに画像ファイル(png)を保存しておきます。スマホでは、保存するフォルダがデフォルトで決まっているかもしれません。
次のようにコルーチンを定義します。コールするとき、引数のfilenameには(パソコンなら"c:\xxxx\・・・"のように)フォルダも含めたものをセットします。
IEnumerator getLocalFile(string filename) //filenameにはフォルダも含めてコール { UnityWebRequest request = UnityWebRequestTexture.GetTexture("file://" + filename); yield return request.SendWebRequest(); if (request.isNetworkError || request.isHttpError) { Debug.Log(request.error); } else { GameObject goRawImage = GameObject.Find("RawImage100"); RawImage rawim = goRawImage.GetComponent<RawImage>(); rawim.texture = ((DownloadHandlerTexture)request.downloadHandler).texture; } }
上のようにコルーチンを定義しておき、次のようにコールします。
//フォルダを含めたファイル名を引数にする StartCoroutine(getLocalFile("c:\\・・・・・"));
これでよいはずなのですが……問題が!! PCと違い、スマホはファイル名(フォルダを含めたもの)を取得するのが難しそうなのです。ネットを見るとAndroidのバージョンなどによって求め方が違うとか、様々、色んなことが書いてあります。大変そうで困っていたところ、「あ」と思いついて「Runtime File Browser」を使わせてもらうことに。
assetstore.unity.com
前回も触れましたが、これはWindowsで言うところのファイル選択ダイアログをスマホで利用できるようにするアセットです。インポートした上で
FileBrowser.ShowLoadDialog(onSuccess, onCancel, FileBrowser.PickMode.Files, false, null, "Load", "Select");
とやれば次のようなダイアログボックスが表示されます。おおっ、すばらしい!
引数の「onSucces」は、ユーザーがファイルを選択したときにコールされる関数で、目的に応じて例えば次のように定義しておきます。
void onSuccess(string[] paths) { fname = paths[0]; }
これによりPCでもスマホでも、ユーザーが好きなフォルダをクリック(タップ)してファイルを選択すると文字列変数fnameに選択されたファイル名(フォルダ名を含む)が入ります。以降ではこのfnameを使って先ほど書いたコルーチンで画像を表示できます。
こんな感じです!