Unity---Odin バリデーター

オーディンバリデーター

记录 2312


1. Odin Validatorの使用

Odin Validator (バージョン: 3.1.6) は、Odin プラグインのサブ機能であり、その主な機能は、プロジェクト内の問題をリアルタイムで検証し、カスタマイズされたニーズに従って問題を見つけ、問題を自動的に検出することです。

2. すぐに使える

1. テスト結果インターフェース

現在のインターフェイスには、現在のプロジェクトの検出結果が表示されます。ロケーションは、表示するシーン、スクリプト、およびバリデーターメッセージを選択できます。メッセージには、すべてのプロンプトメッセージが表示されます。同時に、メッセージの横にある「レンチ」アイコンは、右下隅にある変更および変更が可能です。
画像の説明を追加してください

2. フィルターインターフェイス

それらのシーンとフォルダーを選択して検証できます
画像の説明を追加してください

3. ルール選択インターフェイス

カスタマイズされた登録検証ルールと Odin 独自の検証ルールがここに表示されます。現在のルールを使用するかどうかを選択できます。同時に、ルールの後の設定矢印をクリックして、選択したルールのオプションのパラメータを再定義します。
画像の説明を追加してください

4. バッチ修復インターフェース

バッチ修復インターフェースは、問題プロンプトを均一に修復できます。たとえば、下の図には最大値を超えるエラーが 2 つあります。それぞれに設定された最大値は異なりますが、修復ボタンをクリックすると、次のように修復されます。一律に同じ値ですが、同じ値に変更されています明らかに値に問題がありますが、カスタム修復インターフェースを通じて修復内容をカスタマイズできます。
画像の説明を追加してください

2. 一般的なカスタム検証方法

1. バリデータと検証ルールの違い

コード編集に関しては、両者の記述方法は同じですが、登録インターフェースが異なります。Validator は RegisterValidator を使用して登録し、Validatiron Rule は RegisterValidationRule を使用して登録します。プログラムを使用すると、Validator の登録が有効になり、手動での登録はできません。無効にすると、ValidatorRule がルール選択パネルに表示されます。このインターフェイスを通じてオンまたはオフを選択できます。

2. 値の型バリデータ、

単なるテンプレートであり、実際にはすべてのカスタムバリデーターテンプレートは似ています

//这里注册的是RegisterValidationRule
[assembly: RegisterValidationRule(typeof(MyValueValidator), Name = "MyValueValidator", Description = "Some description text.")]
public class MyValueValidator : ValueValidator<string>
{
    
    
    private List<string> forbiddenWords = new List<string>
    {
    
    
        "A",
        "B",
        "C",
    };
    [EnumToggleButtons]  //自定义可选提示方式
    public ValidatorSeverity Severity = ValidatorSeverity.Error;
    protected override void Validate(ValidationResult result)
    {
    
    
        var value = this.ValueEntry.SmartValue;
        if (forbiddenWords.Contains(value)) 
        {
    
    
            result.Add(Severity,$"值不能为'{
      
      value}'").WithFix(() => this.ValueEntry.SmartValue = "errorvalue");
        }
    }
}

3. カスタム機能バリデーター

これは、機能を登録し、その後、機能の使用規則を記述するものであり、この例は、機能 MaxValue の実装に相当します。

[assembly: RegisterValidator(typeof(MaxAttributeValidator))]
[AttributeUsage(AttributeTargets.Field)]
public class TestMaxAttribute : Attribute
{
    
    
    public int maxValue;
    public TestMaxAttribute(int value)
    {
    
    
        this.maxValue = value;
    }
}
public class MaxAttributeValidator : AttributeValidator<TestMaxAttribute,int>
{
    
    
    protected override void Validate(ValidationResult result)
    {
    
    
        var value = this.ValueEntry.SmartValue;
        var maxValue = this.Attribute.maxValue;
        if (value > maxValue)
        {
    
    
            result.AddError($"超过最大值 '{
      
      maxValue} '了").WithFix(() => this.ValueEntry.SmartValue = maxValue);
        }
    }
}

3. カスタムオブジェクトバリデーター

これを使用して、現在のインスタンスなどのクラスを検出し、すべての TestObject スクリプトの Go が空かどうかを検出できます。空の場合は、その種類に応じて修復できます。

[assembly: RegisterValidationRule(typeof(MyRootObjectValidator), Name = "MyRootObjectValidator", Description = "Some description text.")]
public class MyRootObjectValidator : RootObjectValidator<TestObject>
{
    
    
    [EnumToggleButtons]
    public ValidatorSeverity Severity = ValidatorSeverity.Error;
    protected override void Validate(ValidationResult result)
    {
    
    
        var obj = this.Object;
        if (obj.go == null )
        {
    
    
            result.Add(Severity,"不能为空,需要对象").WithFix(FixEmptyObjects);
        }
    }
    public void FixEmptyObjects()
    {
    
    
        if (this.Object.objType == 1)
        {
    
    
            var go = GameObject.CreatePrimitive(PrimitiveType.Plane);
            this.Object.go = go;
        }
    }
}
public class TestObject : MonoBehaviour
{
    
    
    //自定义类型
    public int objType = 1;
    public GameObject go;
}

4. カスタムシーンの検出

シーンを検出するためのものです

[assembly: RegisterValidationRule(typeof(MyScenceValidator))]
public class MyScenceValidator : SceneValidator
{
    
    
    protected override void Validate(ValidationResult result)
    {
    
    
        var name = SceneManager.GetActiveScene().name;
        if (name == "1001")
        {
    
    
            var gos = GameObject.FindObjectsOfType(typeof(GameObject));
            if (gos.Length > 1000)
            {
    
    
                result.AddWarning($"'场景{
      
      name}' 对象超过了1000个");
            }
        }
    }
}

5. 独自の検出をカスタマイズする

これは異なります。登録する必要はありません。必要なのは ISelfValidator インターフェイスを継承し、次に Validat メソッドを実装する必要があります。

public class MySelfValidator : MonoBehaviour , ISelfValidator
{
    
    
    public int value;
    public GameObject go;
    public void Validate(SelfValidationResult result)
    {
    
    
        if (value == 0)
        {
    
    
            result.AddError("MySelfValidator  Value字段为0");
        }
        if (go == null)
        {
    
    
            result.AddError("MySelfValidator go字段为空");
        }
    }
}

3. まとめ

使用感は良好です。基本的に、定義された検出スキームを実装できます。これは、プロジェクト内の隠れたバグを排除するのに非常に役立ちます。ただし、検出クラスを定義するときは注意が必要です。結局のところ、実際のプロジェクトは比較的大規模であり、プロジェクト全体をテストする場合や、プロジェクトの種類が多い場合は、実際のテストや修復が面倒になる可能性があるので注意してください。

おすすめ

転載: blog.csdn.net/qq_43096697/article/details/133388421