【Unity】Addressable Asset Systemをサクッと使ってみよう
私も含めて「Addressable Asset System よくわからん!」という方のためにとりあえず使ってみて使い方を覚えていくというアプローチでいきたいと思います。では早速やっていきましょう!
環境
Unity 2019.4.5f1
Addressables 1.19.4
1. Addressable Asset Systemパッケージのインストール
Addressable Asset Systemを利用するためにUnityプロジェクトへパッケージをインストールします。エディタのメニューから[Window] > [PackageManager]を選択し、パッケージ一覧から「Addressables」を探します。(検索欄に「add」と入力するとフィルタリングできます)
今回利用するバージョンは1.19.4です。バージョンによってはこの後に解説する項目の名前が違ったりする場合があるので注意してください。現時点(2021年9月)ではverifiedよりも最新版の方が安定しているように思います。
[Install]ボタンを押すとインストールが開始されます。
2. 初期設定
インストールが完了したら再びメニューの[Window] > [Asset Management] > [Addressables] > [Groups]を選択します。
初めて利用する場合は、以下のようなウィンドウが表示されるので、[Create Addressables Settings]ボタンを押します。
これによって、ProjectウィンドウのAssetsフォルダの下にAddressable Assets Systemに関する設定ファイルが出力されます。
設定ファイルが出力されると、Addressable Gropusのウィンドウは以下のようになります。ここにアセットを登録していくことになります。
3. アセットの登録
今回は画像アセットをAddressable Asset Systemを使って表示していきます。表示したい画像をプロジェクト内に追加してください。この解説ではいらすとやの画像を使わせて頂きました。
画像はSpriteとして使うため、インスペクタ上でTexture TypeをSprite (2D and UI)に設定し、[Apply]ボタンを押して変換しておきます。
Addressable Asset Systemへはインスペクタ上の「Addressable」にチェックを入れるか、Addressables Groupウィンドウの「Default Local Group」へアセットをドラッグアンドドロップで登録することができます。
4. アセットのパス設定
アセットをAddressable Asset Systemに登録すると以下のようになります。
スクリプトからアセットを読み出すにはAddressable Nameを指定します。デフォルトではアセットが保存されているパス+ファイル名になっていますが、階層が深くなったりファイル名が長く冗長に感じる場合は、グループ名を右クリックして「Simplify Addressable Names」を選択するとファイル名で呼び出せるようなシンプルな名前に変換することができます。
名前自体は任意に設定することができるため、わかりやすい名前にしておくと良いでしょう。
これで「apple」でこのアセットを呼び出すことができるようになります。以上で設定は完了です。
5. 読み出し
以下のスクリプトを適当なオブジェクトにアタッチします。
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
public class Controller : MonoBehaviour
{
[SerializeField] private Image m_Image;
private AsyncOperationHandle<Sprite> m_SpriteHandle;
private void Start() {
Addressables.LoadAssetAsync<Sprite>("apple").Completed += handle => {
m_SpriteHandle = handle;
if (handle.Result == null) {
Debug.Log("Load Error");
return;
}
m_Image.sprite = handle.Result;
};
}
private void OnDestroy() {
if (m_SpriteHandle.IsValid()) Addressables.Release(m_SpriteHandle);
}
}
アタッチ後、ヒエラルキー上でImageオブジェクトを配置してスクリプトのインスペクタへ参照を追加します。
6. 実行
これですべての準備が整いましたので実行してみてください。うまくいっていれば以下のようにりんごの画像が表示されます。
7. 読み出し : Prefab編
画像以外のアセットを呼び出したい場合はどうすれば良いの?と思う方のためにPrefabの読み出し方を解説します。
PrefabをAddressable Asset Systemから読み出すにはInstantiateAsyncを使います。Spriteのときと同様にPrefabをAddressable Asset Systemに登録したら、スクリプトを以下のようにします。
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class PrefabController : MonoBehaviour
{
private AsyncOperationHandle<GameObject> m_CubeHandle;
private void Start() {
m_CubeHandle = Addressables.InstantiateAsync("Cube", new Vector3(0, 0, 0), Quaternion.identity);
}
private void OnDestroy() {
if (m_CubeHandle.IsValid()) Addressables.Release(m_CubeHandle);
}
}
基本的にはInstantiateと同じですね。
8. 読み出し : 文字列・数値編
セリフ、キャラクターのパラメータなどの文字列や数値はScriptableObject化することでAddressable Asset Systemから読み出すことができます。
まずはScriptableObjectの元となるスクリプトを作成します。
using UnityEngine;
[CreateAssetMenu(menuName = "ScriptableObject/MyData")]
public class MyData : ScriptableObject {
public string Name;
public int Hp;
}
これでエディタからScriptableObjectを作成することができるようになるので、Projectウィンドウ上で右クリックで[Create] > [ScriptableObject] > [MyData]を選択してScriptableObjectを作成します。名前は用途に応じて付けてください。
適当に値を入れたら、インスペクタ上の「Addressable」にチェックを入れてAddressable Asset Systemへ登録します。Addressable NameもSpriteのときと同じようにシンプルにしておくと良いでしょう。
以下のスクリプトを適当なオブジェクトにアタッチして実行します。
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;
public class EnemyController : MonoBehaviour {
[SerializeField] private Text m_Text;
private AsyncOperationHandle<MyData> m_EnemyHandle;
private void Start() {
Addressables.LoadAssetAsync<MyData>("Enemy").Completed += handle => {
m_EnemyHandle = handle;
if (handle.Result == null) {
Debug.Log("Load Error");
return;
}
var enemy = handle.Result;
m_Text.text = $"{enemy.Name} : {enemy.Hp}";
};
}
private void OnDestroy() {
if (m_EnemyHandle.IsValid()) Addressables.Release(m_EnemyHandle);
}
}
9. おわりに
Addressable Asset Systemはパッケージのインストールと初期設定が必要ですが、一度行ってしまえばほぼResourcesのように使うことができます。
また、コード内のリソースの解放については触れませんでしたが、基本的な考え方として読み込んで使ったアセットは不要になったときにクリアしてメモリを空ける必要があります。
こうすることで、アセットが不要になった時点で割り当てらているメモリを解放し、メモリリークを抑え効率良くアプリを動作させることができます。(OnDestoryの部分)
Addressable Asset Systemは最初はハードルが高いように感じるため、まずは基本機能に触れて使ってみることで慣れていくのが良いと思います。この記事が少しでもその手助けになれば幸いです。🌱
この記事が気に入ったらサポートをしてみませんか?