サイトロゴ
ほみのキャラ画像
ゲーム開発
当サイトは広告を含んでいます。おすすめの商品や、おいしかったものを紹介しています。
別途タイトルなどで【PR】のように明記されていない場合、記事の本題は広告とは関係ありません。
詳細は「プライバーポリシー#広告について」をご覧ください。

【Unity】AddressableのAnalyzeRuleに独自ルールを追加する【Addressable】

記事のヘッダー画像/>
                            </div>
                            
                        </section>
                        <section class=

目次

はじめに

この記事では以下の内容を紹介します。

  • Addressables の AnalyzeTool に独自のルールを追加する方法

Addressables についての基本的な説明などは省いていますので、
必要に応じて公式ドキュメントなどもご確認ください。

Addressables package

実行環境

  • Unity6000.0.23f1
  • Unity Addressables 2.3.7

Unity Addressables 2.x 系は 2.3.1 以上でないと、AnalyzeTool 自体がないので注意です!

AnalyzeTool について

Analyze toolとは、Addressables のビルド時のレイアウトの分析ツールです。

Window > Asset Management > Addressables > Analyze から開くことができます。

ビルドした際に「どのようにバンドルにまとめられるか」「複数のバンドルに同じアセットが含まれていないか」などを知ることができます。
また、修正可能なルールについては「Fix Selected Rules」を押すことで自動で修正することが可能です。

この分析のルールに独自のルールを追加したり、修正可能なルール場合は修正する処理の定義などができます。

AnalyzeRule について

AnalyzeTool で分析に使用されるルールです。
分析ルールのクラスとして存在しています:AnalyzeRule

AnalyzeRuleを継承したクラスで分析ルールを定義することで、
AnalyzeTool 上で分析ルールとして分析や修正ができます。

概ね以下の流れで独自ルールの追加を行います。

  1. AnalyzeRuleを継承した独自ルールクラスを定義
  2. 独自ルールクラスをAnalyzeSystemに登録
  3. AnalyzeTool で分析や修正が可能になる

AnalyzeRule の派生クラス

AnalyzeRuleのドキュメントを見るとわかると思いますが、
BundleRuleBaseという派生クラスがあり、
さらにBundleRuleBaseの派生クラスにCheckBundleDupeDependenciesなどがあります。

BundleRuleBaseから派生している以下の 3 つは、既に AnalyzeTool に追加されているルールです。
ここから派生することも可能です。今回はCheckBundleDupeDependenciesの派生クラスとして独自ルールを追加してみています。

  • CheckBundleDupeDependencies
  • CheckResourcesDupeDependencies
  • CheckSceneDupeDependencies

独自ルールを作成してみる

CheckBundleDupeDependenciesの派生クラスとして独自ルールを追加します。
CheckBundleDupeDependenciesは複数のバンドルに同じアセットが含まれていないか(重複チェック)、を分析、修正できるルールです。

今回は「重複チェック」をしたうえで、「特定のフォルダに含まれているものは、特定のグループに移動(もしくは登録)する」という修正機能をもたせます。

想定ケースは以下の通りです。

  • プレハブを Addressable に登録
  • プレハブの登録グループの設定はBundle ModePackSeparately(→ プレハブごとに 1 つのバンドルにまとめる)
  • 複数のプレハブで同じマテリアルを使用している(そのままでは複数のバンドルに同じマテリアルが含まれてしまいます)
  • 複数のプレハブで使用されているマテリアルだけ、Addressable に PackSeparately で登録する(重複していないものはそのままプレハブと同じバンドルにしておく)

以下のコードは Editor フォルダに入れる前提のため、#if UNITY_EDITOR などで囲っていません。

using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;

public class SampleAnalyzeRule : CheckBundleDupeDependencies
{
    /// <inheritdoc/>
    public override string ruleName => "Sample analyze rule";

    /// <inheritdoc/>
    public override bool CanFix => true;

    /// <inheritdoc/>
    public override void FixIssues(AddressableAssetSettings settings)
    {
        if (this.CheckDupeResults == null)
        {
            this.CheckForDuplicateDependencies(settings);
        }

        if (!this.CheckDupeResults.Any())
        {
            return;
        }

        var group = settings.groups
            .Where(group => group.Name == "SampleGroup")
            .FirstOrDefault();

        if (group == null)
        {
            // 指定のグループがまだ作られていなければ、作っておく 
            group = settings.CreateGroup("SampleGroup", false, false, false, null, typeof(BundledAssetGroupSchema), typeof(ContentUpdateGroupSchema));
            group.GetSchema<ContentUpdateGroupSchema>().StaticContent = true;
            group.GetSchema<BundledAssetGroupSchema>().BundleMode = BundledAssetGroupSchema.BundlePackingMode.PackSeparately;
        }

        foreach (var result in this.CheckDupeResults)
        {
            // 特定のアセットパスのものだけ、指定のグループに移動する
            if (result.AssetPath.Contains("Assets/Materials/"))
            {
                var entry = settings.CreateOrMoveEntry(result.DuplicatedGroupGuid.ToString(), group, false, false);
                entry.SetAddress(Path.GetFileNameWithoutExtension(entry.AssetPath));
            }
        }

        settings.SetDirty(AddressableAssetSettings.ModificationEvent.BatchModification, null, true, true);
    }

    /// <summary>
    /// 実行時にルールを登録するためのクラス
    /// </summary>
    [InitializeOnLoad]
    private class RegisterSampleAnalyzeRule
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        static RegisterSampleAnalyzeRule()
        {
            AnalyzeSystem.RegisterNewRule<SampleAnalyzeRule>();
        }
    }
}

上記のコードを作成すると、独自ルールが AnalyzeTool に追加されます。
作成した独自ルールがAnalyzeToolに追加されている

他のルール同様、「Analyze Selected Rules」で分析の実行、「Fix Selected Rules」で修正の実行ができます。

▼ 分析の実行イメージ
分析の実行イメージ

今回はプレハブごとにまとまるようにしていますが、ある程度いくつかのプレハブをまとめたうえで、
複数のバンドルで重複しているアセットを登録する際にも同じようにできるかと思います。

アセットバンドルの数に比例してアセットバンドルのメタデータが変化します。バンドルの数が多すぎると、その分多くのメモリを消費します。
これを回避するために、バンドルの数を減らしつつ、グループ分けなどだけで上手くバンドルにまとめられないものは今回のように独自の分析ルールと修正によって解決することができます。

参考


運営者

ほみのアイコン

ほみ

プログラミングとか
おえかきとか
いろいろするのがすき

サイトについての詳細

【PR】鮭ジャーキー

鮭とばとはまた違うおいしさで、柔らかくチーズの味が合っていておいしかったです!