1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】Addressableのカタログは分割可能と聞いたので試してみた

Last updated at Posted at 2025-03-01

Addressableについて調べていたらもうこんな時間です。

アセットバンドルのビルドに数時間かかる事例を目にしたので、何かいい方法がないか調べていると、Addressableのカタログは分割が可能であるという情報をいくつか見つけました。

Addressables.LoadContentCatalogAsyncにカタログが置いてあるURLを渡すことで、カタログをロードすることができるそうです。
カタログのロード後は通常通りAddressables.LoadAssetAsyncなどでアセットのロードが可能になります。

「unity addressable カタログ 分割」で検索すると他にもいくつか出てきます。

しかし、この関数を使えばよいといった情報ばかりで、実例を見つけられなかったため、自分の想像している通りのことが可能か実際に試してみました。
(本当は、同じカタログの一部のアセットだけをビルドできれば良いのですが)

環境

Unity: 6000.0.38f1
Addressables: 2.2.2
アセットバンドル格納先: aws s3(CloudFront)

各種設定

awsについて

本筋ではないので簡潔に。
参考にしたリンクと自分用の手順メモを貼っておきます。
(お金がかかる可能性があります。)

手順メモ
  • s3設定
    推奨設定でバケットを作成
    ブロックパブリックアクセス設定だけオフに変更
  • CloudFront設定
    Origin domain...作成したs3のバケットを設定
    オリジンアクセス...Legacy access identitiesを指定し、オリジンアクセスアイデンティティで新しいOAIを作成
    バケットポリシーを自動で更新する
    キャッシュビヘイビア...ビューワープロトコルポリシーをRedirect HTTP to HTTPSに変更
    キャッシュキーとオリジンリクエスト...キャッシュポリシーをCachingDisableに変更(ここはCloudFrontのキャッシュ削除ができるようになったら、そのままにしてよさそう)
    ウェブアプリケーションファイアウォール (WAF) ...お金がかかるので、いったんオフ
    料金クラス...北米、欧州、アジア、中東、アフリカを使用

Addressablesについて

Unityプロジェクトを新規作成してPackageManagerからAddressablesをインストールしたら、Settingsなどの設定を行います。

  • Addressables Profiles
    プロファイルを3つ作成し、RemoteのBuildPathとLoadPathを変更します。
    BuildPathには、ServerData/data1/[BuildTarget]
    LoadPathには、https://{Remote.RemoteURL}.cloudfront.net/AssetBundle/[BuildTarget]
    を設定します。
    各プロファイルでdata1、data2、data3とAssetBundle、AssetBundle2、AssetBundle3と設定します

  • Addressable Asset Settings

こちらの画像を参考にしてください

スクリーンショット 2025-02-25 234629.png
スクリーンショット 2025-02-25 234656.png

  • Addressables Groups
    FirstGroup、SecondGroup、ThirdGroupを作成し、それぞれ画像アセットを1つずつ追加します。
    スクリーンショット 2025-02-24 221051.png
    Addressable Asset Groupなどの設定は、下の画像を参考にしてください。3種類とも同じ設定です。
Addressable Asset Group

スクリーンショット 2025-02-24 220924.png

Bundled Asset Group Schema

スクリーンショット 2025-02-25 235201.png

実験準備

アセットのビルド

グループごとにアセットのビルドを行います。

必要な作業はAddressables Profilesウィンドウからプロファイルを切り替えることと、
Addressable Asset GroupのInclude In Buildを切り替えることです。

プロファイルごとに、Include In Buildのチェックが入っているアセットグループが一つだけになるように切り替えます。
切り替えたら、Addressables GroupsウィンドウのBuild->New Buildからビルドします。これを各プロファイルで行います。

ビルドが完了すると、Assetsなどのフォルダの並びにServerDataフォルダが作成されます。
ServerDataフォルダの中には、BuildPath通りにAssetBundleが配置されているので、それぞれ対応するLoadPath通りにs3へアップロードします。

s3の画像

今回の設定では下記のようにフォルダを用意して、対応する[BuildTarget]フォルダをそれぞれのs3フォルダにドロップする
スクリーンショット 2025-02-24 220135.png

プロジェクトのビルド

スクリーンショット 2025-02-24 232042.png
画像のようなシーンを用意しました。catalogボタンでカタログを、imageボタンで対応するカタログの画像をロードし、表示します。

catalogボタンに設定した関数
public class AddressableTest : MonoBehaviour
{
    [SerializeField] TextMeshProUGUI text;

    string cloudFrontPath = "https://" + Remote.RemoteURL + ".cloudfront.net/";
    string[] bundlePaths = { "AssetBundle", "AssetBundle2", "AssetBundle3" };
    string catalogPath = "/StandaloneWindows64/catalog_0.1.0.json";

    public void LoadCatalog(int number)
    {
        string path = bundlePaths[number] + catalogPath;
        Addressables.LoadContentCatalogAsync(cloudFrontPath + path, true);
        text.text = "Load " + path;
    }
}
PreferenceのAddressablesの欄にある「Build Addressables on build Player」を 「Do Not~」に切り替えてからビルドする。

実験

スクリーンショット 2025-02-24 235325.png
catalog1を押下し、それからimage1を押下する
=> FirstGroupに設定した画像が表示される


スクリーンショット 2025-02-24 235339.png
catalog2を押下せずにimage2を押下する
=> キーが存在しないというエラーが表示され、画像が読み込まれなかった時用の画像が表示される


スクリーンショット 2025-02-24 235355.png
catalog2を押下してから、image2を押下する
=> SecondGroupに設定した画像が表示される


アプリを一度再起動
スクリーンショット 2025-02-24 235416.png
catalog3を押下せずにimage3を押下する
=> なぜかThirdGroupに設定した画像が表示される
=> settings.jsonを確認すると、AssetBundle3のカタログがデフォルトになっていた
スクリーンショット 2025-02-24 234738.png

まとめ

LoadContentCatalogAsyncを使うことで、catalog(アセットバンドル)を分割しても、問題なくアセットをロードすることができました。
一点注意があり、アセットバンドルを分割した場合、分割をまたいで参照を持つことができなくなるそうです。この点は意識してアセットを分割するしかないです。(あるいは解決方法を探すか)

また、プロファイルとアセットグループの切り替えを手動で行うのはかなり面倒です。
そのため、エディター拡張などを行い、手軽に運用できる環境を整えていく必要がありそうです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?