Unity の Addressables でリモートアセットの取得先を切り替える
※ これは 2022/08/19 時点の Unity 2022.1.13f1 Addressables v1.20.5 Windows 11 の情報です
最新版では動作が異なる可能性がありますのでご注意ください
前回失敗したリモートアセットの取得先エンドポイントを切り替えに別の方法で再挑戦
アセットとして前回と同じく うちのこメーカー で作成した下記画像2枚を使う
Addressables.InternalIdTransformFunc という Addressables のアドレスを置換する機能があるらしいのでこれを試してみる
やることは前回の Test.cs
を下記のように書き変えるだけ
using System.IO; using System.Threading.Tasks; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.ResourceManagement.ResourceLocations; using UnityEngine.UI; public class Test : MonoBehaviour { [SerializeField] private Image thumbnailImage = null; private AsyncOperationHandle<Sprite> handle = default; private const string RemoteLoadPath = @"http://localhost/StandaloneWindows64/{0}/"; private static string OriginalRootPath = null; private static string CurrentRootPath = null; public async void Start() { // Addresables 初期化 var locator = await Addressables.InitializeAsync().Task; // 初期化時のルートパス取得 var info = Addressables.GetLocatorInfo(locator.LocatorId); OriginalRootPath = info.HashLocation.InternalId.Replace(Path.GetFileName(info.HashLocation.InternalId), ""); // アドレス書き換えを有効化 Addressables.InternalIdTransformFunc = MylIdTransform; await SetCatAsset("Cafe"); } private static string MylIdTransform(IResourceLocation location) { // ルートパスを置き換える if (location.InternalId.StartsWith(OriginalRootPath)) { return location.InternalId.Replace(OriginalRootPath, CurrentRootPath); } return location.InternalId; } private async Task SetCatAsset(string catName) { Cat.Name = catName; // ルートパスの再評価 CurrentRootPath = string.Format(RemoteLoadPath, Cat.Name); // リモートカタログに変更があれば更新する var catalogs = await Addressables.CheckForCatalogUpdates(true).Task; if (catalogs != null && catalogs.Count > 0) { var locators = await Addressables.UpdateCatalogs(catalogs, true).Task; // リモートアセットの取得先を確認 if (locators[0].Locate("Assets/Sprites/cat.png", typeof(Sprite), out var locations)) { // リモートアセットの URL は Dependencies に入っている foreach(var location in locations[0].Dependencies) { UnityEngine.Debug.Log($"--------------> uri={Addressables.InternalIdTransformFunc(location)}"); } } } // すでにハンドルがあったら解放 if (this.handle.IsValid()) { Addressables.Release(this.handle); } // Addressables 経由で Sprite を読み込んで表示 this.handle = Addressables.LoadAssetAsync<Sprite>("Assets/Sprites/cat.png"); this.thumbnailImage.sprite = await this.handle.Task; } /// <summary> /// Mocha ボタン押下イベントハンドラ /// </summary> public async void OnMochaButtonClicked() { await SetCatAsset("Mocha"); } public void OnDestroy() { // いらなくなったら handle を Release する if (this.handle.IsValid()) { Addressables.Release(this.handle); } } }
毎回アドレス解決に文字列置換が走るのは気になるけどこれで再チャレンジ
今度はちゃんと切り替わった