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非常有帮助,不过定义的检测类要小心点,毕竟实际项目比较大,东西比较多,稍有不慎,检测了个整个项目或者项目类型繁多,实际检测修复可能会有麻烦。