Addressablesとは?
Unity
で動的にファイルを読み込むためにはいくつかの方法があります。
Resources
フォルダにファイルを配置するStreamingAssets
フォルダにファイルを配置するAssetBundle
を使用する
それぞれに長所と短所が存在します。
例えば、特定のフォルダにファイルを配置しなければならなかったり、
ビルドや管理が煩雑になったり、プラットフォームごとに読み込み方法を変える必要があったりと、さまざまな課題があります。
こうした課題を解決するために、公式から登場したのが Addressables
です。
使用するバージョン
本記事で使用している Unity および Addressables パッケージのバージョンは以下のとおりです。
- Unity 6000.0.40f1
- Addressables 2.2.2
Addressablesの導入
Unity Editor
のメニューからWindow
→Package Manager
を選択し、PackageManger
を開きます。
リストからAddressables
を選択し、Install
ボタンを押します。
しばらく待てば導入は完了です。
Addressables Settingを用意する
Addressables
を導入したら、Unity Editor
のメニューから
Window
→ Asset Management
> Addressables
> Groups
を選択し、
Addressables Groups
ウインドウを開きます。
中央のCreate Addressables Settings
ボタンをクリックします。
Assets
フォルダ以下に
AddressableAssetsData
フォルダが作成されます。
この中にAddressables
で管理するアセットの情報が保存されます。
先ほどのAddressables Groups
ウィンドウも以下のように変化し、
Addressables
で管理しているアセットの情報を確認できるようになります。
ファイルをAddressablesに登録する
任意のアセットをAddressables Groups
ウィンドウの任意のグループ(今回はDefault Local Group
)にドラッグ&ドロップします。
このとき、アセットはResources
フォルダやStreamingAssets
フォルダ以下でなくても、
Assets
フォルダ以下であればどこにあっても問題ありません。
もしくはアセットを選択し、インスペクタの上部にあるAddressables
にチェックを入れることでも追加されます。
グループはあとから変更できます。
Addressables上の名前を変更する
アセットをAddressables
に登録すると、Addressables
上でその時のファイルパスが名前として登録されます。
ファイルを読む時もこの名前を使用しますが、冗長ですし後々ファイルを移動してパスが変わるかもしれません。
名前は任意に変更できるため開発上扱いやすい名前に変更しましょう。
事前に名前付けのルールを決めておくとよいかもしれません。
名前を変更するには、Addressables Groups
ウィンドウ上かインスペクタから変更できます。
アセットを読んでくる
以下の様なスクリプトを用意しました。
“Icon01”という名前でSprite
を読んできて、Image
に設定して表示しています。
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;
public class AddressablesTest : MonoBehaviour
{
[SerializeField] private Image _icon01;
private void Start()
{
var handle = Addressables.LoadAssetAsync<Sprite>("Icon01");
handle.Completed += (operation) =>
{
if (operation.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
{
// アセットのロードが成功した場合
_icon01.sprite = operation.Result;
}
else
{
// アセットのロードが失敗した場合
Debug.LogError("Failed to load asset.");
}
};
}
}
Start
メソッドが呼ばれてから非同期でIcon01が読み込まれます。
実際には読み込みが終わるまで画面を暗転させておくなど工夫が必要です。
アセットを解放する
読み込んだアセットが必要なくなったらしっかり解放しましょう。
解放しないと無駄に使われたままのメモリが発生します。
これをメモリリークと言います。
アセットを解放するには読み込んだ時のHandle
を使用します。
// Unity2021以降
handle.Release();
// もしくは、こちらでも可
Addressables.Release(handle);
まとめ
今回はAddressables
の導入について解説しました。
Resources
フォルダは非推奨となっており、現在はAddressables
の使用が推奨されています。
Addressables
を使用することで、以下のようなメリットがあります:
- 必要な時に非同期でアセットを読み込めるようになり、メモリ効率が向上します
- メモリの解放を明示的に行えるため、アプリケーションのパフォーマンス管理が可能です(ただし、メモリリークには注意が必要です)
- アセット間の依存関係を自動で把握してビルドしてくれるため、
AssetBundle
のように開発者が手動で管理する必要がありません - 事前に設定しておけば、アプリのローカルからでもサーバー上からでもアセットを読み込めます
- 配信済みのアプリ本体を更新することなく、一部のアセットだけを差し替える運用が可能になります
GameObject
を読み込むケースについては、別途記事でまとめる予定です。