-
Notifications
You must be signed in to change notification settings - Fork 6
MakingRuleSet
Kozu edited this page Jun 23, 2019
·
41 revisions
VitDeckでは検証したいルールの組み合わせとその設定をルールセットと呼ばれる単位で管理します。ツールの管理者は独自のルールセットを作成したうえで作業者に配布することになります。ルールセットは複数作成でき、チェック時に選んで実行することができます。
独自のルールセットをBaseRuleSetクラスを継承して作成し、Assets/VitDeck/Validator/Rules
内に配置してください。
[サンプル]
namespace VitDeck.Validator
{
/// <summary>
/// サンプルルールセット
/// </summary>
public class SampleRuleSet : BaseRuleSet
{
/// <summary>
/// GUIに表示されるルール名
/// </summary>
public override string RuleSetName
{
get { return "サンプルルールセット"; }
}
/// <summary>
/// 検証対象検索オブジェクトを返す。
/// `ValidationTargetFinder`によるデフォルトの検索対象でよい場合はオーバーライド不要
/// </summary>
public override IValidationTargetFinder TargetFinder
{
get
{
return new SpecialValidationTargetFinder();
}
}
/// <summary>
/// 検証ルール
/// [Validation]をつけIRuleフィールドを追加する。
/// orderを指定した場合は値が小さいほど先に実行される。(デフォルトは0)
/// </summary>
[Validation(order = -1)]
public IRule rule1 = new SampleRule("サンプルメッセージ");
[Validation]
public IRule unityVersionRule = new UnityVersionRule("[U01]Unityバージョンルール", "2017.4.28f1");
[Validation]
public IRule assetNamingRule = new AssetNamingRule("[A01]アセット名の使用禁止文字ルール", @"[a-zA-Z0-9 _\.\-]+");
[Validation]
public IRule assetGuidBlacklistRule = new AssetGuidBlacklistRule("[A02]特定のGUIDを持つアセットの検出ルール",
new string[] { "740112f6e77ca914d9c26eef5d68accd", "ae68339621fb41b4f9905188526120ea" });
[Validation]
public IRule assetPathLengthRule = new AssetPathLengthRule("[A03]アセットパス長制限ルール", 184);
[Validation]
public IRule assetExtentionBlacklistRule = new AssetExtentionBlacklistRule("[A04]アセット拡張子ルール", new string[] { ".txt", ".md" });
[Validation]
public IRule boothBoundsRule = new BoothBoundsRule("[B01]ブースBounds超過検証ルール", new UnityEngine.Vector3(4.0f, 5.0f, 4.0f), 0.01f);
[Validation]
public IRule componentWhitelistRule = new ComponentWhitelistRule("[B02]コンポーネントホワイトリストルール",
new ComponentReference[] { new ComponentReference("ライティング", new string[] { "UnityEngine.Light" }, ValidationLevel.ALLOW),
new ComponentReference("カメラ", new string[] { "UnityEngine.Camera","UnityEngine.FlareLayer" }, ValidationLevel.ALLOW),
new ComponentReference("Mesh", new string[] { "UnityEngine.MeshFilter" ,"UnityEngine.MeshRenderer" }, ValidationLevel.ALLOW),
new ComponentReference("Animator", new string[] { "UnityEngine.Animator" }, ValidationLevel.NEGOTIABLE),
new ComponentReference("Suport Object", new string[] { "ScaleLimitVisualizer", "NotEditableComponent" }, ValidationLevel.ALLOW),
new ComponentReference("AudioListerner", new string[] { "UnityEngine.AudioListener" }, ValidationLevel.DISALLOW)});
[Validation]
public IRule componentBlacklistRule = new ComponentBlacklistRule("[B03]コンポーネントブラックリストルール",
new ComponentReference[] { new ComponentReference("AudioListerner", new string[] { "UnityEngine.AudioListener" }, ValidationLevel.DISALLOW),
new ComponentReference("Animator", new string[] { "UnityEngine.Animator" }, ValidationLevel.NEGOTIABLE)});
[Validation]
public IRule missingReferenceRule = new MissingReferenceRule("[B06]missing参照ルール");
作成したクラス内で以下を定義してください。
- ルールセットの名前を返す
RuleSetName
- 検証開始時に検証対象の検索を行う
TargetFinder
(省略可) - 各ルールを表す
IRule
フィールド- フィールドに検証ルールであることを表す
[Validation]
を付与して下さい。 - デフォルトではルールの実行順序は不定です。
- 事前チェックなどで順序を指定したい場合Validation属性の
order
値を指定することができます。デフォルトは0で値が小さいほど先に実行されます。
- フィールドに検証ルールであることを表す
以下のルールが汎用ルールとして定義されています。必要なルールをルールセットに追加してください。 (随時追記)
ID | クラス名 | ルール |
---|---|---|
U01 | UnityVersionRule | 指定のUnityバージョンで動作しているか検証 |
A01 | AssetNamingRule | アセット名の使用禁止文字の検出 |
A02 | AssetGuidBlacklistRule | 特定のGUIDを持つアセットの検出 |
A03 | AssetPathLengthRule | アセットの長すぎるパスの検出 |
A04 | AssetExtentionBlacklistRule | 特定の拡張子を持つアセットの検出 |
B01 | BoothBoundsRule | ブースがBounds内に収まっているかの検証 |
B02 | ComponentWhitelistRule | コンポーネントのホワイトリスト検証 |
B03 | ComponentBlacklistRule | コンポーネントのブラックリスト検証 |
B06 | MissingRule | missingになっている参照の検出 |
独自のルールを追加する場合はBaseRuleクラスを継承したクラスを作成し、Assets/VitDeck/Validator/Rules
内に配置してください。
[サンプル]
namespace VitDeck.Validator
{
/// <summary>
/// サンプルルール
/// </summary>
public class SampleRule : BaseRule
{
private string customSetting;
public SampleRule(string name, string custom = "デフォルト設定値") : base(name)
{
this.customSetting = custom;
}
protected override void Logic(ValidationTarget target)
{
//前提チェック
if (string.IsNullOrEmpty(target.GetBaseFolderPath()))
throw new FatalValidationErrorException("ベースフォルダが指定されていません。");
//チェック結果を設定
var baseFolder = AssetDatabase.LoadAssetAtPath<DefaultAsset>(target.GetBaseFolderPath());
AddIssue(new Issue(baseFolder, IssueLevel.Info, "これはtargetを設定したサンプルルールの検証結果です。target:" + baseFolder.name));
AddIssue(new Issue(null, IssueLevel.Info, "これはサンプルルールの解決策付き検証結果(情報)です。", "解決策テキスト", "https://github.com/vkettools/VitDeck/issues/57"));
}
}
}
作成したクラスにprotected override void Logic(ValidationTarget target)
を定義して検証ロジックを実装してください。
引数のValidationTarget
には検証対象の情報が格納されています。取得用の以下のメソッドがあります。
メソッド名 | 取得対象 |
---|---|
GetBaseFolderPath() | ベースフォルダパスを取得する |
GetAllAssetGuids() | 検証対象の全てのアセットのGUIDを取得する |
GetAllAssetPaths() | 検証対象の全てのアセットのパスを取得する |
GetAllAssets() | 検証対象の全てのアセットのオブジェクトを取得する |
GetScenes() | 検証対象のシーンファイルを取得する |
GetRootObjects() | 検証対象の全てのルートオブジェクトを取得する |
GetAllObjects() | ルートオブジェクト以下の全てのGameObjectを取得する |
BaseRule内で定義された以下のメソッドを使用できます。
-
void AddIssue(Issue issue)
- 発見された問題を結果に追加します。
- Issueオブジェクトは対象オブジェクト、メッセージレベル、メッセージ本文、[解決策メッセージ]、[ヘルプページへのリンク]を設定して生成します。
- Issueのメッセージレベルは
Error
,Warning
,info
から設定してください。
-
void AddResultLog(string logText)
- 検証中の問題に紐づかないログを結果に追加します。
FatalValidationErrorException
をthrowすることで検証を中断することができます。事前条件のチェックなどで使用できます。
引き続きほかのルールの検証を継続させたい場合はreturn
を使用し、例外は使用しないでください。
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。