しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

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);
        }
    }
}

毎回アドレス解決に文字列置換が走るのは気になるけどこれで再チャレンジ

切り替え成功

今度はちゃんと切り替わった