Unity---Odin Validator

Odin验证器

记录 2312


一、Odin Validator用处

Odin Validator(Version:3.1.6)是Odin插件下的子功能,它主要功能为实时验证项目中的问题,按照我们自定义需求查找问题,自动检测问题。

二、快速使用

1、检测结果界面

当前界面显示当前项目的检测结果。Locations可以选择显示哪些场景、脚本和验证器的消息,Message显示所有提示消息,同时消息旁边的”扳手“图标可以选择修正,在右下角进行修改处理。
请添加图片描述

2、过滤界面

可以选择那些场景、文件夹进行验证
请添加图片描述

3、规则选择界面

自定义注册的验证规则和Odin自带的验证规则,都会显示在这里,可以选择是否使用当前规则,同时点击规则后的设置箭头,可对所选规则的可选参数进行重新定义。
请添加图片描述

4、批量修复界面

批量修复界面可以对问题提示进行统一修复,比如现在下图有两个超过最大值的错误,他俩设置的最大值虽然不同,但是点击修复按钮后会统一修复为相同的值,不过修改为相同的值很明显有问题,不过我们可以通过自定义修复接口自定义修复内容
请添加图片描述

二、常见自定义验证方式

1、Validator 和 Validation Rules区别

在代码编辑上这俩写法是一样的,只是注册的接口不同,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字段为空");
        }
    }
}

三、总结

使用来看还是不错的,基本相定义的检测方案都可实现,对于排除项目中的隐形bug非常有帮助,不过定义的检测类要小心点,毕竟实际项目比较大,东西比较多,稍有不慎,检测了个整个项目或者项目类型繁多,实际检测修复可能会有麻烦。

猜你喜欢

转载自blog.csdn.net/qq_43096697/article/details/133388421