【Unity】スクリプトからテクスチャーなどのリソースを読み込む様々な方法を紹介します!
Unityスクリプトからリソースを読み込む方法を紹介します。
Unityのリソースを読み込む方法が知りたいなあ。
リソースを読み込む方法はたくさんあるのでシンプルに紹介しますね。
Addressablesを利用する
Addressablesはアセット管理システムの一つです。ローカルやリモートなどアセットが配置される場所に関係なくアセットを扱えるパッケージです。詳しくは「Addressablesでリソースを管理する方法」を参照して下さい。
Addressablesは数多くのプロジェクトで採用されているアセット管理システムです。
Adressablesを選べば間違いないんだろうけど難しそうだなあ。
欠点は面倒くさいところだけど、使い方は知っておいた方がいいですよ。
ボクでも分かるもっと簡単な方法を紹介してほしいな。
Resources.Load関数を利用する
Resources.Load関数でリソースを読み込むことができます。Assets以下にResourcesという名前のフォルダを作成してリソースを配置して下さい。リソースが配布ファイルに含まれますので頻繁にアップデートするコンテンツには向きません。
テクスチャを読み込むサンプルコードはこんな感じになります。
Texture2D texture = Resources.Load<Texture2D>("apple");
すごくシンプルで分かりやすいね!
リソースを手っ取り早く読み込みたい場合はResouces.Loadを使いましょう。確認用やテスト用にも使い易いです。
アセットのみの更新でもアプリのビルドが必要になるのが弱点だね!
ローカルファイルのテクスチャーを読み込む
アセット外のローカルファイルをテクスチャーとして読み込む方法です。Texture2DクラスのLoadImage関数でバイト配列から読み込みます。対応している画像フォーマットはPNGとJPEG形式です。
ローカルの画像ファイルをテクスチャとして読み込むサンプルコードだよ!
using System.IO;
string path = "C:/fruits/lemon.png";
byte[] data = File.ReadAllBytes(path);
Texture2D texture = new Texture2D(1, 1);
texture.LoadImage(data);
texture.Apply();
アセット管理外のローカルファイルを動的に読み込みたいときに使いましょう。
HttpClientでネットワーク上の画像ファイルからテクスチャを読み込む
ネットワーク上の画像データを受信するのにHttpClientクラスを利用します。ここで注意しなければいけないのはHttpClientはアプリケーションで1回だけインスタンス化して再利用することです。
HttpClientはアプリケーションで1回だけインスタンス化して再利用しなければならないんだよ。
1つのインスタンスを使いまわすとなると・・・シングルトンパターンがいいね!
HttpClientでネットワーク上の画像を読み込むサンプルコードです。
using System.Net.Http;
using System.Threading.Tasks;
HttpClient client = new HttpClient();
Texture2D texture;
try
{
string uri = "https://unixo-lab.com/images/profile.png";
Task<byte[]> task = Task.Run(() => client.GetByteArrayAsync(uri));
task.Wait();
byte[] data = task.Result;
texture = new Texture2D(1, 1);
texture.LoadImage(data);
texture.Apply();
}
catch (HttpRequestException e)
{
Debug.LogError(e.Message);
}
今回のコードには非同期処理があるね!
コードを簡潔にするためにダウンロードするまでWaitでブロックしてるけど、なるべくブロックしないように実装して下さいね。
UnityWebRequestでネットワーク上の画像ファイルからテクスチャを読み込む
ネットワーク上の画像データを受信するのにUnityEngine.Networking.UnityWebRequestクラスを利用します。コルーチンを使用しますのでIEnumeratorを返す関数を用意します。
IEnumerator LoadTexture(string uri)
{
UnityWebRequest request = UnityWebRequest.Get(uri);
yield return request.SendWebRequest();
if(request.result == UnityWebRequest.Result.Success)
{
byte[] data = request.downloadHandler.data;
Texture2D texture = new Texture2D(1, 1);
texture.LoadImage(data);
texture.Apply();
}
}
今回はコルーチンを使って読み込むんだね!
StartCoroutine関数を使ってLoadTexture関数を呼び出します。
string uri = "https://unixo-lab.com/images/profile.png";
StartCoroutine(LoadTexture(uri));
今回のサンプルコードはダウンロード時にメインスレッドをブロックしない良いコードですね。
EditorGUIUtility.Load関数を利用する
この関数はエディター専用だから気を付けてね!
エディター専用の機能ですがEditorGUIUtility.Load関数でアセットを読み込むことができます。Assets以下にEditor Default Resourcesという名前のフォルダを作成してリソースを配置して下さい。Resources.Load関数のエディターバージョンです。Unityエディター拡張目的の関数のためコンテンツで使用することはできません。
Editor Default Resourcesにあるテクスチャを読み込むコードです。
Texture2D texture = (Texture2D)EditorGUIUtility.Load("banana.png");
Resources.Loadみたいに簡単に使えるね!
AssetDatabase.Load関数を利用する
この関数はエディター専用だから気を付けてね!
エディター専用の機能ですがAssetDatabase.Load関数でアセットを読み込むことができます。Unityエディター拡張目的の関数のためコンテンツで使用することはできません。
AssetDatabase.Load関数でテクスチャーを読み込むコードです。
Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Editor/orange.png");
リソースを配置する場所がどこでも良くて使い勝手がいいね!
まとめ
今回の記事のまとめだよ!
1.なるべくAddressablesを使う 2.簡単に使いたいならResources.Load! 3.臨機応変に他の読み込み方法を試す | ||
たくさんの方法を紹介してもらったからどれを使えばいいか迷っちゃうよ!
色々試してみて自分がやりやすい方法を見つけて下さいね。
関連ページ
こちらのページも合わせてご覧下さい