Skip to content

MakingRuleSet

Kozu edited this page Sep 7, 2019 · 41 revisions

ルールセットの作成

VitDeckでは検証したいルールの組み合わせとその設定をルールセットと呼ばれる単位で管理します。ツールの管理者は独自のルールセットをC#のクラスとして追加した上で作業者に配布することになります。ルールセットは複数作成でき、チェック時に選んで実行することができます。

ルールセットの構成

独自のルールセットを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 errorShaderRule = new ErrorShaderRule("[B04]エラーシェーダールール");
        [Validation]
        public IRule noneMeshRule = new NoneMeshRule("[B05]None meshルール");
        [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 コンポーネントのブラックリスト検証
B04 ErrorShaderRule エラーシェーダーの検出
B05 NoneMeshRule Noneになっているメッシュの検出
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/vitdeck/VitDeck/wiki"));
        }
    }
}

作成したクラスに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を使用し、例外は使用しないでください。