Unityでアセットレギュレーション(テクスチャサイズ、頂点数など)のテストを作成、実行、自動化するためのツールです。
詳細
Unityゲーム開発において「アセットレギュレーション」を厳密に管理することは重要です。
アセットレギュレーションの代表的な例としては以下のような項目が挙げられます。
- テクスチャのサイズ
- メッシュの頂点数
- ファイル名
もしこれらのアセットレギュレーションが守られていなかったり、あるいは明確に定められていなかったりすると、以下のような問題が起こり得ます。
- アセットの容量が増大してダウンロードに掛かる時間が長くなる
- アセットの容量が増大してロードに掛かる時間が長くなる
- メモリ使用量が増大してアプリがクラッシュする
- 頂点数とともにシェーダの処理負荷が増大しフレームレートが低下する
- ファイル名が間違えていて読み込めない
Asset Regulation Manager を使うと、このようなアセットのレギュレーションをテストすることできます。
下図のような直感的なインターフェースにより、誰でも(エンジニア以外でも)簡単にインポートしたアセットをテストできます。
また、コマンドラインインターフェース(CLI)を用意しているため、定期的に自動テストして結果を通知するといったことも実現できます。
テストするアセットレギュレーションは下図のようなGUIツールを使って設定します。
このツールにより誰でも簡単にアセットレギュレーションを管理することができます。
本ツールは以下の環境に対応しています。
- Unity 2019.4 以上
インストールは以下の手順で行います。
- Window > Package Manager を選択
- 「+」ボタン > Add package from git URL を選択
- 以下を入力してインストール
あるいは 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 からレギュレーションデータアセットを作成します。
アセットレギュレーションに関するデータはこのアセットに保存されます。
このアセットはプロジェクト内に複数作成可能です。
また任意の場所に配置可能ですが、StreamingAssets などの特殊フォルダには配置しないでください。
レギュレーションデータアセットをダブルクリックするか Inspector から Open Editor ボタンを押下すると、アセットレギュレーションエディタが開かれます。
このウィンドウの左上の + ボタンを押下することでアセットレギュレーションを新規作成することができます。
一つのアセットレギュレーションは以下の二つの要素から構成されます。
ターゲット
- このレギュレーションの適用対象とするアセット群のこと
- 「Character フォルダに入った Texture2D 型のアセット全て」のような形式で指定する
コンストレイント
- ターゲットのアセットが守るべき制約のこと
- 「テクスチャサイズが 1024x1024 以下」「テクスチャフォーマットが ASTC4x4」など
次からはこれらを設定していきます。
ターゲットを設定するにはまず、右側のパネルの Targets タブから Add Asset Group ボタンを押下します。
すると New Asset Group という名前のアセットグループが新規作成されることを確認できます。
このアセットグループに対してアセットフィルタを追加することで、対象のアセットを指定します。
例えば Characters フォルダ配下のアセットだけを対象にするには、アセットグループ名の右側の + ボタンを押下し、表示されたメニューから Object Filter を選択して追加します。
そして追加した Object Filter の Object プロパティに Characters フォルダをアサインします。
さらに Texture2D 型のアセットのみを対象にしてみます。
先程と同様に + ボタンを押下し、Type Filter を選択して追加します。
追加された Type Filter の Type プロパティに Texture2D を設定します。
これで、Characters フォルダ配下の全ての Texture2D をターゲットにすることができました。
なお、アセットグループは一つのアセットレギュレーションに対して複数設定することが可能です。
複数のアセットグループを設定した場合、各アセットグループが示すアセット全てがターゲットとなります。
下図は Characters フォルダ配下の Texture2D 全てと、CharactersHDR フォルダ配下の拡張子が exr のファイル全てをターゲットにしている例です。
次にコンストレイントを設定していきます。
まずテクスチャサイズの最大値に関する制約を作成します。
右側のパネルの Constraints タブから、Add Constraint > Texture > Max Texture Size を選択します。
追加されたコンストレイントの Max Size プロパティにテクスチャの最大サイズを入力すれば設定完了です。
さらにテクスチャフォーマットに関する制約を加えていきます。
先程と同様に Add Constraint > Texture > Texture Format を選択し、コンストレイントを追加します。
今回は Target を iOS に、Format を ASTC_6x6 に設定します。
以上でアセットに対する制約を設定できました。
アセットレギュレーションエディタでは、上記で紹介したもの以外にも、以下の操作をサポートしています。
- 検索対象のカラムを選択
- レギュレーションを検索・絞り込み
- 編集するレギュレーションデータアセットを選択
- アセットレギュレーションのリネーム
- 右クリックメニュー
- アセットレギュレーションを新規作成
- 選択中のアセットレギュレーションを削除
- ターゲットの情報を文字列としてコピー
- コンストレイントの情報を文字列としてコピー
- ドラッグしてアセットレギュレーションを並び替え
Targets タブにおいてアセットグループを右クリックすると以下の操作が行えます。
- アセットグループ名をリネーム
- アセットグループを削除
- アセットグループの順序を変更(一つ上へ/一つ下へ)
- コピー & ペースト
- アセットフィルタをペースト
また、アセットフィルタの右クリックメニューからは以下の操作を行うことができます。
- アセットフィルタを削除
- アセットフィルタの順序を変更(一つ上へ/一つ下へ)
- コピー & ペースト
Constraints タブについても右クリックメニューからの操作をサポートしています。
- アセットコンストレイントを削除
- アセットコンストレイントの順序を変更(一つ上へ/一つ下へ)
- コピー & ペースト
なお全ての操作は Ctrl (Command) + Z で Undo、Ctrl (Command) + Y で Redo できます。
アセットレギュレーションをGUIツールを使って確認・テストするには、 Window > Asset Regulation Viewer から アセットレギュレーションビューワ を開きます。
ウィンドウ上部の検索フィールドにアセット名を入れて検索を行います。
Project ビューの検索フィールドと同様に、タイプ検索やラベル検索、Glob 検索なども使用できます (例: 「t:Texture」)。
また検索結果として表示された各アセットのトグルを開くことで、そのアセットに設定されている制約を見ることができます。
アセットレギュレーションをテストするには対象の行をダブルクリックします。
また、Run All ボタンを押下すると表示中の全てのアセットのレギュレーションをテストします。
Run Selected を押下すると選択している全てのアセットのレギュレーションをテストします。
アセットレギュレーションビューワでは、上記で紹介した以外にも以下の操作をサポートしています。
- リロード
- メニューを開く
- アセットレギュレーションが設定されていないアセットを表示・非表示にする
- テスト結果をエクスポートする
コマンドラインから実行するには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
なおコマンドライン引数 -resultFormat
に Json
を指定することで以下のような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);
}
}
以上で独自のアセットフィルタを作成できました。
独自のアセットコンストレイントを作成するには、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);
}
}
以上で独自のアセットコンストレイントを作成できました。
本ソフトウェアはMITライセンスで公開しています。
ライセンスの範囲内で自由に使っていただけますが、使用の際は以下の著作権表示とライセンス表示が必須となります。
また、本ドキュメントの目次は以下のソフトウェアを使用して作成されています。
toc-generatorのライセンスの詳細は Third Party Notices.md を参照してください。