Skip to content

Latest commit

 

History

History
691 lines (540 loc) · 42.7 KB

README_JA.md

File metadata and controls

691 lines (540 loc) · 42.7 KB

Asset Regulation Manager Asset Regulation Manager

ARM: アセットレギュレーション自動テストツール

license license license

ドキュメント (English, 日本語)

Unityでアセットレギュレーション(テクスチャサイズ、頂点数など)のテストを作成、実行、自動化するためのツールです。

目次

詳細

コンセプトと特徴

Unityゲーム開発において「アセットレギュレーション」を厳密に管理することは重要です。
アセットレギュレーションの代表的な例としては以下のような項目が挙げられます。

  • テクスチャのサイズ
  • メッシュの頂点数
  • ファイル名

もしこれらのアセットレギュレーションが守られていなかったり、あるいは明確に定められていなかったりすると、以下のような問題が起こり得ます。

  • アセットの容量が増大してダウンロードに掛かる時間が長くなる
  • アセットの容量が増大してロードに掛かる時間が長くなる
  • メモリ使用量が増大してアプリがクラッシュする
  • 頂点数とともにシェーダの処理負荷が増大しフレームレートが低下する
  • ファイル名が間違えていて読み込めない

Asset Regulation Manager を使うと、このようなアセットのレギュレーションをテストすることできます。
下図のような直感的なインターフェースにより、誰でも(エンジニア以外でも)簡単にインポートしたアセットをテストできます。

Asset Regulation Viewer
Asset Regulation Viewer

また、コマンドラインインターフェース(CLI)を用意しているため、定期的に自動テストして結果を通知するといったことも実現できます。

テストするアセットレギュレーションは下図のようなGUIツールを使って設定します。
このツールにより誰でも簡単にアセットレギュレーションを管理することができます。

Asset Regulation Editor
Asset Regulation Editor

セットアップ

要件

本ツールは以下の環境に対応しています。

  • Unity 2019.4 以上

インストール

インストールは以下の手順で行います。

  1. Window > Package Manager を選択
  2. 「+」ボタン > Add package from git URL を選択
  3. 以下を入力してインストール

Package Manager

あるいは Packages/manifest.json を開き、dependencies ブロックに以下を追記します。

{
    "dependencies": {
        "jp.co.cyberagent.assetregulationmanager": "https://github.com/CyberAgentGameEntertainment/AssetRegulationManager.git?path=/Assets/AssetRegulationManager"
    }
}

バージョンを指定したい場合には以下のように記述します(バージョンは適宜書き換えてください)。

バージョンを更新するには上述の手順でバージョンを書き換えてください。
バージョンを指定しない場合には、Packages/package-lock.json ファイルを開いて本ライブラリの箇所のハッシュを書き換えることで更新できます。

{
  "dependencies": {
      "jp.co.cyberagent.assetregulationmanager": {
      "version": "https://github.com/CyberAgentGameEntertainment/AssetRegulationManager.git?path=/Assets/AssetRegulationManager",
      "depth": 0,
      "source": "git",
      "dependencies": {},
      "hash": "..."
    }
  }
}

Note
No 'git' executable was found. Please install Git on your system and restart Unityのようなメッセージが出た場合、マシンにGitをセットアップする必要がある点にご注意ください。

テスト項目を設定・管理する

データを保存するためのアセットを作成する

アセットレギュレーションを設定するにはまず、Assets > Create > Asset Regulation Data からレギュレーションデータアセットを作成します。

Create Regulation Data Asset
Create Regulation Data Asset

アセットレギュレーションに関するデータはこのアセットに保存されます。

このアセットはプロジェクト内に複数作成可能です。
また任意の場所に配置可能ですが、StreamingAssets などの特殊フォルダには配置しないでください。

アセットレギュレーションを作成する

レギュレーションデータアセットをダブルクリックするか Inspector から Open Editor ボタンを押下すると、アセットレギュレーションエディタが開かれます。
このウィンドウの左上の + ボタンを押下することでアセットレギュレーションを新規作成することができます。

Create Asset Regulation
Create Asset Regulation

一つのアセットレギュレーションは以下の二つの要素から構成されます。

ターゲット

  • このレギュレーションの適用対象とするアセット群のこと
  • 「Character フォルダに入った Texture2D 型のアセット全て」のような形式で指定する

コンストレイント

  • ターゲットのアセットが守るべき制約のこと
  • 「テクスチャサイズが 1024x1024 以下」「テクスチャフォーマットが ASTC4x4」など

次からはこれらを設定していきます。

ターゲットを設定する

ターゲットを設定するにはまず、右側のパネルの Targets タブから Add Asset Group ボタンを押下します。
すると New Asset Group という名前のアセットグループが新規作成されることを確認できます。

Create Asset Group
Create Asset Group

このアセットグループに対してアセットフィルタを追加することで、対象のアセットを指定します。
例えば Characters フォルダ配下のアセットだけを対象にするには、アセットグループ名の右側の + ボタンを押下し、表示されたメニューから Object Filter を選択して追加します。
そして追加した Object Filter の Object プロパティに Characters フォルダをアサインします。

Create Object Filter
Create Object Filter

さらに Texture2D 型のアセットのみを対象にしてみます。
先程と同様に + ボタンを押下し、Type Filter を選択して追加します。
追加された Type Filter の Type プロパティに Texture2D を設定します。

Create Type Filter
Create Type Filter

これで、Characters フォルダ配下の全ての Texture2D をターゲットにすることができました。

なお、アセットグループは一つのアセットレギュレーションに対して複数設定することが可能です。
複数のアセットグループを設定した場合、各アセットグループが示すアセット全てがターゲットとなります。
下図は Characters フォルダ配下の Texture2D 全てと、CharactersHDR フォルダ配下の拡張子が exr のファイル全てをターゲットにしている例です。

Multiple Asset Groups
Multiple Asset Groups

コンストレイントを設定する

次にコンストレイントを設定していきます。
まずテクスチャサイズの最大値に関する制約を作成します。
右側のパネルの Constraints タブから、Add Constraint > Texture > Max Texture Size を選択します。

Max Texture Size
Max Texture Size

追加されたコンストレイントの Max Size プロパティにテクスチャの最大サイズを入力すれば設定完了です。

Max Size
Max Size

さらにテクスチャフォーマットに関する制約を加えていきます。
先程と同様に Add Constraint > Texture > Texture Format を選択し、コンストレイントを追加します。
今回は TargetiOS に、FormatASTC_6x6 に設定します。

Texture Format
Texture Format

以上でアセットに対する制約を設定できました。

アセットレギュレーションエディタの操作方法の詳細

アセットレギュレーションエディタでは、上記で紹介したもの以外にも、以下の操作をサポートしています。

  1. 検索対象のカラムを選択
  2. レギュレーションを検索・絞り込み
  3. 編集するレギュレーションデータアセットを選択
  4. アセットレギュレーションのリネーム
  5. 右クリックメニュー
    • アセットレギュレーションを新規作成
    • 選択中のアセットレギュレーションを削除
    • ターゲットの情報を文字列としてコピー
    • コンストレイントの情報を文字列としてコピー
  6. ドラッグしてアセットレギュレーションを並び替え

Editor Operations
Editor Operations

Targets タブにおいてアセットグループを右クリックすると以下の操作が行えます。

  1. アセットグループ名をリネーム
  2. アセットグループを削除
  3. アセットグループの順序を変更(一つ上へ/一つ下へ)
  4. コピー & ペースト
  5. アセットフィルタをペースト

Targets Operations
Targets Operations

また、アセットフィルタの右クリックメニューからは以下の操作を行うことができます。

  1. アセットフィルタを削除
  2. アセットフィルタの順序を変更(一つ上へ/一つ下へ)
  3. コピー & ペースト

Filters Operations
Filters Operations

Constraints タブについても右クリックメニューからの操作をサポートしています。

  1. アセットコンストレイントを削除
  2. アセットコンストレイントの順序を変更(一つ上へ/一つ下へ)
  3. コピー & ペースト

Constraints Operations
Constraints Operations

なお全ての操作は Ctrl (Command) + Z で Undo、Ctrl (Command) + Y で Redo できます。

アセットレギュレーションをテストする

ビューワで確認・テストする

アセットレギュレーションをGUIツールを使って確認・テストするには、 Window > Asset Regulation Viewer から アセットレギュレーションビューワ を開きます。

ウィンドウ上部の検索フィールドにアセット名を入れて検索を行います。
Project ビューの検索フィールドと同様に、タイプ検索やラベル検索、Glob 検索なども使用できます (例: 「t:Texture」)。

Search Assets
Search Assets

また検索結果として表示された各アセットのトグルを開くことで、そのアセットに設定されている制約を見ることができます。

Show Constraints
Show Constraints

アセットレギュレーションをテストするには対象の行をダブルクリックします。

また、Run All ボタンを押下すると表示中の全てのアセットのレギュレーションをテストします。
Run Selected を押下すると選択している全てのアセットのレギュレーションをテストします。

Run Tests
Run Tests

ビューワの操作方法の詳細

アセットレギュレーションビューワでは、上記で紹介した以外にも以下の操作をサポートしています。

  1. リロード
  2. メニューを開く
  3. アセットレギュレーションが設定されていないアセットを表示・非表示にする
  4. テスト結果をエクスポートする

Viewer Operations
Viewer Operations

コマンドラインインターフェース (CLI)でテストする

実行方法

コマンドラインから実行するにはAssetRegulationManager.Editor.Core.Tool.Test.AssetRegulationTestCLI.AssetRegulationTestCLI.ExecuteTestsを呼びます。

以下はMacでコマンドライン実行を行う例です。

/Applications/Unity/Hub/Editor/2019.4.33f1/Unity.app/Contents/MacOS/Unity -projectPath [Your Project Path Here] -executeMethod AssetRegulationManager.Editor.Core.Tool.Test.AssetRegulationTestCLI.AssetRegulationTestCLI.ExecuteTests

戻り値

コマンドラインの戻り値はエラーレベルに応じて以下の通り返却します。

戻り値 説明
0 全てのテストが成功。
1 失敗したテストが存在する。
ただし-failWhenWarningオプションをつけた場合には、警告が発生したテストが存在した場合にも1を返す。
2 実行自体が失敗。

結果の受け取り方

テストの結果はファイルに保存されます。
コマンドライン引数 -resultFilePath を使って任意のファイルパスを指定できます。

結果は以下のような形式で書き出されます。

Assets/Development/DevelopmentAssets/tex_dev_red_128.png
[Success] Texture Format: RGBA32 (iPhone) | Actual Value: RGBA32
[Success] Max Texture Size: 200 x 200 | Actual Value: 128 x 128

Assets/Development/DevelopmentAssets/tex_dev_red_256.png
[Failed] Texture Format: RGBA32 (iPhone) | Actual Value: ASTC_6x6
[Failed] Max Texture Size: 200 x 200 | Actual Value: 256 x 256

なおコマンドライン引数 -resultFormatJson を指定することで以下のようなJson形式で結果を書き出すことも可能です。

{"results":[{"assetPath":"Assets/Development/DevelopmentAssets/tex_dev_red_128.png","entries":[{"status":"Success","description":"Texture Format: RGBA32 (iPhone)","message":"Actual Value: ASTC_6x6"},{"status":"Success","description":"Max Texture Size: 200 x 200","message":"Actual Value: 256 x 256"}]},{"assetPath":"Assets/Development/DevelopmentAssets/tex_dev_red_256.png","entries":[{"status":"Failed","description":"Texture Format: RGBA32 (iPhone)","message":"Actual Value: ASTC_6x6"},{"status":"Failed","description":"Max Texture Size: 200 x 200","message":"Actual Value: 256 x 256"}]}]}

コマンドライン引数

コマンドライン引数の種類と説明は以下の通りです。

名前 説明
-resultFilePath <filePath> テスト結果の出力ファイルパスを指定します。
デフォルトはAssetRegulationManager/test_result.txt (or .json)
-resultFormat <formatName> テスト結果の出力形式を指定します。
・List: リスト形式 (default)
・Json: Json形式
-resultFilter <filterName> テスト結果をステータスに応じてフィルタリングします。
・All: すべての結果を出力 (default)
・Success: 成功したもののみを出力
・Warning: 警告があったもののみを出力
・Failed: 失敗したもののみを出力

””で囲った上でセミコロンで区切ることで複数指定できます。
例えば警告と失敗したものを出力するには以下のように指定します。

-resultFilter "Warning;Failed"
-assetFilter <assetPath> テスト対象とするアセットをフィルタリングします。
対象のアセットパスを指定します。
””で囲った上でセミコロンで区切ることで複数指定できます。
また、正規表現が使用できます。

例えばファイルパスに「mesh_」か「tex_」を含むファイルのみを対象とするには、以下のように指定します。

-assetFilter "mesh_;tex_"
-regulationFilter <regulationName> テストに使うレギュレーションをフィルタリングします。
対象のレギュレーション名を指定します。
””で囲った上でセミコロンで区切ることで複数指定できます。
また、正規表現が使用できます。

例えば「Character Prefabs」と「Character Textures」という名前のレギュレーションの対象だけをテストしたい場合には以下のように指定します。

-regulationFilter "^Character Prefabs$;^Character Textures$"

各アセットフィルタの説明

名前 概要と各プロパティの説明
Object Filter アセットを直接指定してフィルタリングします。
使用例: Characters フォルダ以下のアセットだけをレギュレーションの対象とする。

Folder Targeting Mode
フォルダを指定した時の扱いを指定します。
・Included Assets (Exclude Folders): フォルダ内のアセットのみ対象とする
・Self: フォルダ自身のみを対象とする
・Both: フォルダと中のアセットの両方を対象とする

Object
対象のアセット。
フォルダを指定した場合にはそのフォルダ以下の全てのアセットが対象となります。
右側のトグルを切り替えることで複数指定することができます。
Type Filter アセットの型を指定してフィルタリングします。
使用例: Texture2D 型のアセットだけをレギュレーションの対象とする。

Match With Derived Type
チェックをつけると派生型も対象とします。

Type
対象の型。
右側のトグルを切り替えることで複数指定することもできます。
Asset Path Filter アセットパスを指定してフィルタリングします。
使用例1: Assets/Sample[任意の3文字]/ というフォルダに含まれるアセットを対象とする
使用例2: ファイル名に「Dummy」を含むものを対象から除外する

Match With Folders
フォルダを対象とするか。

Asset Path (Regex)
対象のアセットパス。
これにパスが部分一致するアセットが対象となります。
正規表現を使用することもできます。
右側のトグルを切り替えることで複数指定することもできます。

Condition
Asset Pathを複数指定する場合の取り扱い方を指定できます。
・Contains Matched: いずれかのアセットパスがマッチしたら対象とする
・Match All: 全てのアセットパスがマッチしたら対象とする
・Contains Unmatched: マッチしないアセットパスが一つでもあれば対象とする
・Not Match All: 全てのアセットパスにマッチしなかったら対象とする
Extension Filter アセットの拡張子を指定してフィルタリングします。
使用例: png あるいは jpg ファイルだけをレギュレーションの対象にする

Extension
対象の拡張子。
右側のトグルを切り替えることで複数指定することもできます。
Dependent Object Filter 指定したアセットから参照されているアセットをフィルタリングします。
使用例: あるPrefabが参照するテクスチャを全て対象とする。

Only Direct Dependencies
直接参照しているアセットのみを対象とします。

Object
参照元のアセット。

各アセットコンストレイントの説明

名前 概要と各プロパティの説明
File/Asset Path アセットパスを制約します。

Asset Path (Regex)
対象のアセットパス。
正規表現を使用することもできます。
右側のトグルを切り替えることで複数指定することもできます。

Condition
Asset Pathを複数指定する場合の取り扱い方を指定できます。
Or: いずれかにマッチすることを条件とする
And: 全てにマッチすることを条件とする
File/File Size ファイルサイズを制約します。

Max Size
アセットの最大サイズ。

Unit
サイズの単位を表します。
B: バイト
KB: キロバイト(キビバイト)
MB: メガバイト(メビバイト)
File/Folder 所属するフォルダを制約します。

Folder
対象のフォルダ。
右側のトグルを切り替えることで複数指定することもできます。

Check Mode
Folderを複数指定する場合の取り扱い方を指定できます。
Contains: フォルダに含まれることを制約とする
Not Contains: フォルダに含まれないことを制約とする

Top Folder Only
チェックをつけるとフォルダ直下のみ判定対象となります。
File/Asset Type アセットの型を制約します。

Match With Derived Types
チェックすると指定した型の派生型も対象とします。

Type
型。
Texture/Max Texture Size テクスチャサイズを制約します。

Count Mode
サイズの計算方法を指定します。
Width And Height: テクスチャの横幅と縦幅を指定する
Texel Count: テクスチャのテクセル数を指定する

Max Size / Max Texel Count
テクスチャサイズ。
Texture/Texture Format テクスチャフォーマットを制約します。

Target
対象のプラットフォームを指定します。
右側のトグルを切り替えることで複数指定することもできます。

Format
フォーマットを指定します。
右側のトグルを切り替えることで複数指定することもできます。
Texture/Max Texel Count in Asset アセットが参照するテクスチャの総テクセル数を制約します。

Max Count
テクセル数の最大値。
Texture/Max Texel Count in GameObject GameObject が参照する Renderer が持つマテリアルが参照するテクスチャの総テクセル数を制約します。

Max Count
テクセル数の最大値。

Exclude Children
チェックをすると子 GameObject をチェック対象から除外します。

Exclude Inactive
チェックをすると非アクティブな GameObject をチェック対象から除外します。

Allow Duplicate Count
チェックすると、別の Renderer が同じテクスチャを参照している場合に重複してテクセル数をカウントします。
Texture/Max Texel Count in Scene シーンに存在する GameObject が参照する Renderer が持つマテリアルが参照するテクスチャの総テクセル数を制限します。

Max Count
テクセル数の最大値。

Exclude Inactive
チェックをすると非アクティブなGameObjectを対象から除外します。

Allow Duplicate Count
チェックすると、別の Renderer が同じテクスチャを参照している場合に重複してテクセル数をカウントします。
Texture/Max Texel Count in Folder フォルダ内に存在するテクスチャの総テクセル数を制約します。

Max Count
テクセル数の最大値。

Top Folders Only
チェックをするとフォルダ直下にあるテクスチャのみを対象とします。
Mesh/Max Vertex Count 頂点数の最大値を制約します。
Mesh と GameObject(PrefabやFBXなど)に対する制約として使用できます。

Max Count
頂点数の最大値。

Exclude Children
チェックをすると子 GameObject をチェック対象から除外します。
※ 対象のアセットが GameObject の場合のみ処理されます

Exclude Inactive
チェックをすると非アクティブな GameObject をチェック対象から除外します。
※ 対象のアセットが GameObject の場合のみ処理されます

Allow Duplicate Count
チェックすると、別の Renderer が同じメッシュを参照している場合に重複して頂点数をカウントします。
※ 対象のアセットが GameObject の場合のみ処理されます
Mesh/Max Vertex Count in Scene シーンに存在する全メッシュの合計頂点数の最大値を制約します。

Max Count
頂点数の最大値。

Exclude Inactive
チェックをすると非アクティブな GameObject をチェック対象から除外します。

Allow Duplicate Count
チェックすると、別の Renderer が同じメッシュを参照している場合に重複して頂点数をカウントします。
GameObject/Max GameObject Count in GameObject Prefab が持つ GameObject の数を制約します。

Max Count
GameObject の数の最大値。

Exclude Inactive
チェックをすると非アクティブな GameObject をチェック対象から除外します。
GameObject/Max GameObject Count in Scene シーンに存在する GameObject の数を制約します。

Max Count
GameObject の数の最大値。

Exclude Inactive
チェックをすると非アクティブな GameObject をチェック対象から除外します。
Particle System/Max ParticleSystem Count in GameObject Prefab が持つ ParticleSystem の数を制約します。

Max Count
ParticleSystem の数の最大値。

Exclude Inactive
チェックをすると非アクティブな GameObject をチェック対象から除外します。
Particle System/Max ParticleSystem Count in Scene シーンに存在する ParticleSystem の数を制約します。

Max Count
ParticleSystem の数の最大値。

Exclude Inactive
チェックをすると非アクティブな GameObject をチェック対象から除外します。
Material/Shader Keyword マテリアルで有効になっているシェーダキーワードを制約します。

Check Condition
設定されたキーワードの取り扱い方
・Enabled All: 全てが有効であることをチェックする
・Enabled Any: いずれかが有効であることをチェックする
・Disabled All: 全てが無効であることをチェックする
・Disabled Any: いずれかが無効であることをチェックする

Shader Keyword
対象のシェーダキーワード。

スクリプティング

スクリプトからレギュレーションデータアセットを操作する

スクリプトからレギュレーションデータアセットを操作するには以下のように行います。

using AssetRegulationManager.Editor.Core.Data;
using AssetRegulationManager.Editor.Core.Model.AssetRegulations;
using AssetRegulationManager.Editor.Core.Model.AssetRegulations.AssetConstraintImpl;
using AssetRegulationManager.Editor.Core.Model.AssetRegulations.AssetFilterImpl;
using UnityEditor;
using UnityEngine;

public static class AssetRegulationManagerScripting
{
    [MenuItem("Asset Regulation Manager/Samples/Create Data Asset")]
    private static void CreateDataAsset()
    {
        // Create data asset.
        var store = ScriptableObject.CreateInstance<AssetRegulationSetStore>();
        AssetDatabase.CreateAsset(store, "Assets/sample.asset");

        // Create and add a regulation.
        var regulation = new AssetRegulation();
        store.Set.Add(regulation);

        // Create targets.
        var assetGroup = regulation.AddAssetGroup();
        var extensionFilter = assetGroup.AddFilter<ExtensionBasedAssetFilter>();
        extensionFilter.Extension.IsListMode = true;
        extensionFilter.Extension.AddValue("png");
        extensionFilter.Extension.AddValue("jpg");

        // Create constraints.
        var fileSizeConstraint = regulation.AddConstraint<FileSizeConstraint>();
        fileSizeConstraint.Unit = FileSizeConstraint.SizeUnit.KB;
        fileSizeConstraint.MaxSize = 50;

        EditorUtility.SetDirty(store);
        AssetDatabase.SaveAssets();
    }
}

スクリプトからテストを実行する

スクリプトからテストを実行するには以下のように行います。

using System.Collections.Generic;
using AssetRegulationManager.Editor.Core.Data;
using AssetRegulationManager.Editor.Core.Model;
using AssetRegulationManager.Editor.Core.Model.Adapters;
using AssetRegulationManager.Editor.Core.Model.AssetRegulationTests;
using UnityEditor;

public static class AssetRegulationManagerScripting
{
    [MenuItem("Asset Regulation Manager/Samples/Execute Tests")]
    private static void ExecuteTests()
    {
        var repository = new AssetRegulationRepository();
        var testStore = new AssetRegulationTestStore();
        var assetDatabaseAdapter = new AssetDatabaseAdapter();
        var testGenerateService =
            new AssetRegulationTestGenerateService(repository, testStore, assetDatabaseAdapter);
        var testExecuteService = new AssetRegulationTestExecuteService(testStore);

        // Create tests.
        // Enter a filter as you would when searching in the project view.
        testGenerateService.Run("t:Object");

        // Filter tests.
        testStore.FilterTests(AssetRegulationTestStoreFilter.ExcludeEmptyTests);

        // Execute tests.
        testExecuteService.RunAll();

        // Export test results (optional).
        var testResultExportService = new AssetRegulationTestResultExportService(testStore);
        var exportTargetStatuses = new List<AssetRegulationTestStatus>
        {
            AssetRegulationTestStatus.Warning,
            AssetRegulationTestStatus.Failed
        };
        testResultExportService.Run("filepath.txt", exportTargetStatuses);

        // If you want to analyze the test results yourself, do as follows.
        foreach (var test in testStore.FilteredTests)
        {
            var targetAssetPath = test.AssetPath;
            // This will be Success if the status of the all entries is Success.
            var testStatus = test.LatestStatus.Value;

            foreach (var entry in test.Entries.Values)
            {
                // e.g. Success
                var testEntryStatus = entry.Status.Value;
                // e.g. Max Texture Size: 200 x 200
                var testEntryDescription = entry.Description;
                // e.g. Actual Value: 128 x 128
                var message = entry.Message.Value;
            }
        }
    }
}

独自のアセットフィルタを作成する

独自のアセットフィルタを作成するには、Editorフォルダ内にAssetFilterBaseを継承したクラスを作成します。

using System;
using AssetRegulationManager.Editor.Core.Model.AssetRegulations;
using AssetRegulationManager.Editor.Core.Model.AssetRegulations.AssetFilterImpl;

[Serializable]
[AssetFilter("Custom Filter", "Custom Filter")] // Required for GUI.
public class CustomAssetFilter : AssetFilterBase
{
    public string AssetPathToMatch { get; set; }

    /// This will be called before and less often than IsMatch.
    /// And will be executed in the main thread, in contrast to IsMatch.
    /// So you should write heavy processes or processes that use Unity's API here.
    public override void SetupForMatching()
    {
    }

    // Return true if the asset passes this filter.
    // This may be executed outside the main thread.
    public override bool IsMatch(string assetPath, Type assetType)
    {
        return AssetPathToMatch == assetPath;
    }

    // A description of this asset filter.
    public override string GetDescription()
    {
        return string.IsNullOrEmpty(AssetPathToMatch) ? string.Empty : $"Asset Path: {AssetPathToMatch}";
    }
}

また GUI を描画するためにGUIDrawerを継承したクラスを作成します。

using AssetRegulationManager.Editor.Foundation.CustomDrawers;
using UnityEditor;

[CustomGUIDrawer(typeof(CustomAssetFilter))]
public sealed class CustomAssetFilterDrawer : GUIDrawer<CustomAssetFilter>
{
    public override void Setup(object target)
    {
        base.Setup(target);

        // If you want to setup this drawer, write here.
    }

    protected override void GUILayout(CustomAssetFilter target)
    {
        target.AssetPathToMatch = EditorGUILayout.TextField("Asset Path", target.AssetPathToMatch);
    }
}

以上で独自のアセットフィルタを作成できました。

Custom Filter
Custom Filter

独自のアセットコンストレイントを作成する

独自のアセットコンストレイントを作成するには、Editor フォルダ内にAssetConstraintを継承したクラスを作成します。

using System;
using System.IO;
using AssetRegulationManager.Editor.Core.Model.AssetRegulations;
using UnityEditor;
using UnityEngine;
using UnityEngine.Assertions;
using Object = UnityEngine.Object;

[Serializable]
[AssetConstraint("Custom/Custom Constraint", "Custom Constraint")] // Required for GUI.
public sealed class CustomAssetConstraint : AssetConstraint<Object>
{
    [SerializeField] private string _assetName;

    private string _latestValue;

    public string AssetName
    {
        get => _assetName;
        set => _assetName = value;
    }

    // Get a description of this constraint.
    public override string GetDescription()
    {
        return $"Asset Name: {_assetName}";
    }

    // Returns the most recently used value for the test as a string.
    public override string GetLatestValueAsText()
    {
        return string.IsNullOrEmpty(_latestValue) ? "None" : _latestValue;
    }

    // Returns true if the asset is within constraints.
    protected override bool CheckInternal(Object asset)
    {
        Assert.IsNotNull(asset);

        var assetPath = AssetDatabase.GetAssetPath(asset);
        var assetName = Path.GetFileNameWithoutExtension(assetPath);
        _latestValue = assetName;

        return _assetName == assetName;
    }
}

また GUI を描画するためにGUIDrawerを継承したクラスを作成します。

using AssetRegulationManager.Editor.Foundation.CustomDrawers;
using UnityEditor;

[CustomGUIDrawer(typeof(CustomAssetConstraint))]
public sealed class CustomAssetConstraintDrawer : GUIDrawer<CustomAssetConstraint>
{
    public override void Setup(object target)
    {
        base.Setup(target);

        // If you want to setup this drawer, write here.
    }

    protected override void GUILayout(CustomAssetConstraint target)
    {
        target.AssetName = EditorGUILayout.TextField("Asset Name", target.AssetName);
    }
}

以上で独自のアセットコンストレイントを作成できました。

Custom Constraint
Custom Constraint

ライセンス

本ソフトウェアはMITライセンスで公開しています。
ライセンスの範囲内で自由に使っていただけますが、使用の際は以下の著作権表示とライセンス表示が必須となります。

また、本ドキュメントの目次は以下のソフトウェアを使用して作成されています。

toc-generatorのライセンスの詳細は Third Party Notices.md を参照してください。