しっぽを追いかけて

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

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

Unity の Addressables でリモートアセットを利用する

※ これは 2022/07/28 時点の Unity 2022.1.11f1 Addressables v1.20.3 Windows 11 の情報です

最新版では動作が異なる可能性がありますのでご注意ください

前回に引き続き Addressables で、今回は CDN などに配置する想定のリモートアセットを使ってみたい

アセット配信サーバー経由で取得

まずは Addressables Groups のウィンドウの Profile コンボボックスから Manage Profiles を選択

Manage Profiles

Remote の欄を Custom にして、Remote.LoadPthhttp://localhost/[BindingTarget] と入力

Profile 編集

これが配信サーバーのエンドポイントになる

次に Addressables の Settings を開き、Catalog のグループの中の Player Version Override1.0.0,Build Remote Catalog をオン、Build Load Paths に先ほどの Profile の Remote を指定、Only update catalogs manially をオンにして自前でカタログを更新するようにする

Catalog 設定

Addressables Groups のウィンドウに戻り、New のコンボボックスから Packed Assets を選び、追加された Group の名称を Remote Group にする

Remote Addressables Group 追加

Remote Group の設定は下記の通り

Remote Group の設定

Build & Load PathsRemoteAsset Bundle Compression は容量を削減するため LZMABundle Mode はラベルごとにアセットバンドルを分ける Pacl Together By LabelContent Update Restriction はオフになっていることを確認

Addressables Group のウィンドウにて cat.pngDefault Local Group から Remote Group に移動

Remote Group に移動

ここでアセットをビルドし直す

Addressables のアセットビルド

次に配信サーバーの構築

Apacahe などを利用してもよいが Windows の場合は IIS を使うのが早いので IIS を立てる

Windows のタスクバーの検索より、OptionalFeatures を検索して実行

OptionalFeatures 検索

Windows の機能の有効化または無効化」のダイアログが開くので、「インターネット インフォメーションサービス」にチェックを入れて「OK」ボタン押下

IIS の有効化

さらに Windows のタスクバーの検索より、IIS を検索して実行

IIS マネージャー検索

「インターネット インフォメーションサービス マネージャー」が開くので、Default Web Site を選択し、Mime の種類 を押下

MIME の種類追加

.hashtext/plain で追加し

.hash 追加

さらに .bundleapplication/octet-stream で追加する

Unity のプロジェクトディレクトリの ServerDataStandaloneWIndows64ディレクトリができているはずなので、これを丸ごと C:/inetpub/wwwrootIIS のドキュメントルートにコピーする

アセットを配信サーバーに配備

最後に Unity の Player Settings の Allow downloads over HTTP をオンにして http 通信を有効にする

HTTP 通信の有効化

あとは Test.cs を下記のように変更

using System.Linq;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI;

public class Test : MonoBehaviour
{
    [SerializeField]
    private Image thumbnailImage = null;

    private AsyncOperationHandle<Sprite> handle = default;

    public async void Start()
    {
        // Addresables 初期化
        await Addressables.InitializeAsync().Task;

        // リモートカタログに変更があれば更新する
        var catalogs = await Addressables.CheckForCatalogUpdates(true).Task;
        if (catalogs != null && catalogs.Count > 0)
        {
            var locators = await Addressables.UpdateCatalogs(catalogs, true).Task;
        }

        // Addressables 経由で Sprite を読み込んで表示
        this.handle = Addressables.LoadAssetAsync<Sprite>("Assets/Sprites/cat.png");
        this.thumbnailImage.sprite = await this.handle.Task;
    }

    public void OnDestroy()
    {
        // いらなくなったら handle を Release する
        Addressables.Release(this.handle);
    }
}

Addressables の初期化とカタログの更新処理を入れただけ

これで今までの埋め込みと同じような挙動で配信サーバーからダウンロードするようになるはず

できたできた