公式ではResourcesは非推奨
少し古いサイトだと、Instantiate
などの際にResources
フォルダーを使用してアセットを読み込んでいるコードをよく見かけます。
しかしUnityのドキュメントによるとResources
フォルダーの使用は非推奨となっています。
Resources フォルダーは、しばしば Unity プロジェクトで発生する各種問題の原因となります。Resources フォルダーの不適切な使用が原因で、プロジェクトのビルドサイズの膨張やメモリの極端な過剰使用の原因となり、アプリケーションの起動時間が著しく長くなってしまうことがあります。
引用元:Resources フォルダー – Unity マニュアル
アセット管理システム「Addressables」
Resources
の代わりになる機能として、AssetBundle
とAddressable Asset System
(Addressables
)の2つがあります。
今回はAddressables
の方を使用します。
Addressables
とは、簡潔に言うとアドレスを使用してアセットを簡単にロードすることが出来るシステムです。
アドレスを割り当てることで、アセットの場所に関係なくロード呼び出せるようになります。
複雑なコードを書く必要が無く、Resources
やAssetBundle
よりも簡単に使用することが出来ます。
インストール
Window -> Package Manager
を開き、Packages: Unity Registry
を選択した状態で検索するとパッケージが表示されます。Addressables
を選択してInstall
をクリックします。
インストールが完了したらWindow -> Asset Management -> Addressables -> Groups
を開きます。
Create Addressables Settings
をクリックします。
これで導入完了です。
アセットの設定
次にAddressables
で管理するアセットを設定していきます。
方法1:Inspectorで設定
Inspector
の上の方にAddressable
のチェックボックスが追加されています。
管理したいアセットを選択してここにチェックを入れるだけでOKです。
方法2:Addressables Groupsで設定
Window -> Asset Management -> Addressables -> Groups
を開き、グループの中にアセットをドラッグ&ドロップして追加します。
Addressable Name
はロード時に使用する文字列(アドレス)で、好きな名前に変更することが出来ます。
フォルダをドラッグ&ドロップしてまとめて追加することもできますが、フォルダ内のアセットの名前は変更できなくなります。
アセットのロード
単体ロード
1つのアセットをロードする場合はAddressables.LoadAssetAsync
を使用します。
ロードは非同期で行われます。
Addressable Name
で指定したアドレスを使ってロードします。
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class LoadTest : MonoBehaviour
{
AsyncOperationHandle<Sprite> opHandle;
public IEnumerator Start()
{
// 「Test2_Img」というアドレスのSpriteをロード
opHandle = Addressables.LoadAssetAsync<Sprite>("Test2_Img");
yield return opHandle;
if (opHandle.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log(opHandle.Result.name);
}
}
void OnDestroy()
{
Addressables.Release(opHandle);
}
}
複数ロード
複数のアセットを同時にロードする場合はAddressables.LoadAssetsAsync
を使用します。
こちらはアドレスではなくラベルを使用します。
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class LoadTest : MonoBehaviour
{
AsyncOperationHandle<IList<Sprite>> opHandle;
public void Start()
{
// 「Image」というラベルのSpriteをロード
opHandle = Addressables.LoadAssetsAsync<Sprite>("Image", OnLoadSprite);
}
void OnLoadSprite(Sprite sp)
{
Debug.Log(sp.name);
}
void OnDestroy()
{
Addressables.Release(opHandle);
}
}
インスタンスを生成
Addressables.InstantiateAsync
でインスタンスを生成することが出来ます。
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class LoadTest : MonoBehaviour
{
AsyncOperationHandle<GameObject> opHandle;
public void Start()
{
opHandle = Addressables.InstantiateAsync("Box");
}
void OnDestroy()
{
Addressables.ReleaseInstance(opHandle);
}
}
プレハブ化したCubeオブジェクトに「Box」というアドレスを設定して上記のスクリプトを実行。
インスタンス化できました。
メモリの開放
読み込んだアセットはAddressables.Release
やAddressables.ReleaseInstance
で明示的に開放してやる必要があります。Destroy
は使わずに、必ずRelease
かReleaseInstance
で開放するようにしましょう。
コメント