🎃

Unity Addressable Assets(AAS)

2024/03/20に公開

AASの中身はAssetBundleでカタログファイルという巨大なJsonファイル
基本Fast Modeで実装を行い、実問題が起こった時だけPacked Play Mode
FastModeでは細かな解析が出来ない

Addressable Assetsのアドレスはファイル名とは別に自由に設定できますが、同じアドレスを設定する事が出来てしまいます。設定時、ロード時共にエラーも出ないので、気付かず重複していて、思ったのと違うのをロードしていたなんて事にもなりかねません。https://kan-kikuchi.hatenablog.com/entry/AddressDuplicateDetecter

Package Managerでインストール必要

Window -> Asset Management -> Addressables
Addressable Assets関連のファイルはAssets/AddressableAssetsDataにあるので、消してはいけない

単体ロード

using UnityEngine;
using UnityEngine.AddressableAssets;//Addressablesを使うのに必要

public class NewBehaviourScript : MonoBehaviour {

  private void Start () {
    //Alchemist_ManというAddressのSpriteを非同期でロード
    Addressables.LoadAssetAsync<Sprite>("Alchemist_Man").Completed +=  op => { 
      //op.ResultがロードしたSprite
      Debug.Log(op.Result.name);
    };
  }
	
}

複数同時ロード

using UnityEngine;
using UnityEngine.AddressableAssets;//Addressablesを使うのに必要

public class NewBehaviourScript : MonoBehaviour {

  private void Start () {
    //PrefabというLabelが付いたGameObjectを全て取得
    Addressables.LoadAssetsAsync<GameObject>("Prefab", OnLoadPrefab);
  }

  //Prefabのロードが完了する度に(1つのPrefabづつ)呼ばれる
  private void OnLoadPrefab(GameObject prefab) {
    Debug.Log(prefab.name);
  }
	
}

インスタンスの生成と破棄

using UnityEngine;
using UnityEngine.AddressableAssets;

public class NewBehaviourScript : MonoBehaviour {

  private void Start() {
    //PlayerというPrefabをロードし、インスタンスを作成
     Addressables.InstantiateAsync("Player").Completed +=  op => { 
      Debug.Log(op.Result.name);
    };
  }
	
}

//Destroyで削除しちゃダメ!
//Destroy(_player);

//削除する時はReleaseInstance
Addressables.ReleaseInstance(_player);

文字列(AddressやLabel)の直接入力を避ける

using UnityEngine;
using UnityEngine.AddressableAssets;

public class NewBehaviourScript : MonoBehaviour {

  //Inspectorで設定出来るように
  [SerializeField]
  private AssetReference _prefabReference = null;

  private void Start () {
    //Addressの文字列の代わりにAssetReferenceを使ってロード
    Addressables.LoadAssetAsync<GameObject>(_prefabReference).Completed += op => {
      Debug.Log(op.Result.name);
    };
  }
	
}
//Inspectorで設定出来るように
[SerializeField]
private AssetLabelReference _labelReference;

//PlayerというLabelが付いたアセットだけ設定出来るように
[AssetReferenceUILabelRestriction("Player")]
public AssetReference _prefabReference;

引用元
https://kan-kikuchi.hatenablog.com/entry/Addressable_Assets_Rewrite

Discussion