Unity Odin从入门到精通(九):验证器详解

前言:Odin验证器主要用来检测项目当中不符合指定规则的成员,并且将检测结果呈现出来。它不仅可以让团队新同学更加容易的熟悉项目;而且还可以让项目不断迭代时一直保持稳定。

自定义全局类型验证器:如下所示:
1.全局类型验证器的类型为ValueValidator<TValue>。具有以下特性:
1.1.包含泛型参数:如下所示:
1.1.1.TValue:该泛型参数表示需要验证的数值类型。
1.2.主要作用:首先在检视面板当中对泛型参数修饰的检视面板属性按照指定的规则进行验证;然后当存在不符合规则的检视面板属性时,就会在该检视面板属性身上呈现出自定义的错误或者警告信息。
1.3.包含属性:如下所示:
1.3.1.Property:泛型参数修饰的检视面板属性。
1.3.2.RevalidationCriteria:重新调用Validate函数的时机。可以从RevalidationCriteria枚举中获取以下时机:
1.3.2.1.Always:当检视面板获取到焦点时就会调用Validate函数。
1.3.2.2.OnValueChange:当泛型参数修饰的检视面板属性的数值发生改变时就会调用Validate函数。
1.3.2.3.OnValueChangeOrChildValueChange:当泛型参数修饰的检视面板属性或者子属性的数值发生改变时就会调用Validate函数。
1.3.3.ValueEntry:泛型参数修饰的检视面板属性关联的数值实例。可以通过该数值实例调用SmartValue属性来获取数值。
1.4.包含函数:如下所示:
1.4.1.CanValidateProperty(InspectorProperty):该函数主要用来判定是否可以对泛型参数修饰的检视面板属性进行验证。
1.4.2.Initialize:该函数主要用来初始化验证器。注意:只有当泛型参数修饰的检视面板属性可以被验证时,该函数才会被调用。
1.4.3.Validate(ValidationResult):该函数主要用来检测泛型参数修饰的检视面板属性是否符合指定的规则。当不符合指定规则时,Odin就会将警告或者错误消息同步给ValidationResult类型的参数变量并呈现在该检视面板属性身上。注意:只有当泛型参数修饰的检视面板属性可以被验证时,该函数才会被调用。
1.5.自定义全局类型验证器的流程如下所示:
1.5.1.首先在编辑器环境下创建一个继承自ValueValidator类型的全局类型验证器类型;然后在泛型参数中指定该全局类型验证器类型需要验证的数值类型。参考代码如下所示:

#if UNITY_EDITOR
// 需要验证的数值类型为string
public class EmptyStringValidator : ValueValidator<string>
{
    
    
}
#endif

1.5.2.重写全局类型验证器类型中的RevalidationCriteria属性来设置只有当泛型参数修饰的检视面板属性的数值发生改变时才进行重新调用Validate函数。参考代码如下所示:

public override RevalidationCriteria RevalidationCriteria
{
    
    
	get
	{
    
    
		return RevalidationCriteria.OnValueChange;
	}
}

1.5.3.重写全局类型验证器类型中的CanValidateProperty函数来判定指定参数代表的泛型参数修饰的检视面板属性是否可以被验证。参考代码如下所示:

public override bool CanValidateProperty(InspectorProperty property)
{
    
    
	if (property.Name == "emptyStr1")
	{
    
    
		return true;
	}
	else if (property.Name == "emptyStr2")
	{
    
    
		return false;
	}
	else
	{
    
    
		return base.CanValidateProperty(property);
	}
}

1.5.4.当泛型参数修饰的检视面板属性可以被验证时,就重写全局类型验证器类型中的Initialize函数来初始化验证器。参考代码如下所示:

protected override void Initialize()
{
    
    
	base.Initialize();
}

1.5.5.当泛型参数修饰的检视面板属性可以被验证时,就重写全局类型验证器类型中的Validate函数来检测该检视面板属性是否符合指定规则。当该检视面板属性不符合规则时,就将警告或者错误信息同步给参数变量并显示到该检视面板属性身上。参考代码如下所示:

protected override void Validate(ValidationResult result)
{
    
    
	// 当泛型参数修饰的检视面板属性关联的数值实例保存的数值为空时,Odin就将验证信息上报给已注册的验证器
	if (string.IsNullOrEmpty(this.ValueEntry.SmartValue))
	{
    
    
		result.ResultType = ValidationResultType.Error;
		result.Message = this.ValueEntry.Property.Name + " is empty! Are you sure that's correct?";
	}
}

1.5.6.首先在文件的开头部分使用[assembly:]来引用Sirenix.OdinInspector.Editor.Validation程序集中的RegisterValidatorAttribute注册验证器类型;然后将自定义的全局类型验证器类型作为参数传递给注册验证器类型,进而让该自定义的全局类型验证器类型生效。参考代码如下所示:

[assembly: Sirenix.OdinInspector.Editor.Validation.RegisterValidator(typeof(EmptyStringValidator))]

1.5.7.首先编写测试用例类型并在内部创建一系列的字段;然后遍历检视面板属性列表中的每一个检视面板属性;最后对泛型参数修饰的检视面板属性进行验证操作。参考代码如下所示:

public class SampleValueValidator : MonoBehaviour
{
    
    
    // 泛型参数修饰的检视面板属性,会参与验证
    public string emptyStr1 = null;
    public string emptyStr2 = "";
    // 该字段不显示在检视面板上面,不会参与验证
    protected string emptyStr3 = null;
    private string emptyStr4 = "";
    // 该字段的泛型参数TValue不为string类型,不会参与验证
    public int emptyInt;
}

自定义定制特性验证器:如下所示:
1.定制特性验证器的类型为AttributeValidator<TAttribute, TValue>。具有以下特性:
1.1.包含泛型参数:如下所示:
1.1.1.TAttribute:该泛型参数表示需要验证的定制特性类型。
1.1.2.TValue:该泛型参数表示需要验证的数值类型。
1.2.主要作用:首先在检视面板当中对泛型参数修饰的检视面板属性按照指定的规则进行验证;然后当存在不符合规则的检视面板属性时,就会在该检视面板属性身上呈现出自定义的错误或者警告信息。
1.3.包含属性:如下所示:
1.3.1.Property:泛型参数修饰的检视面板属性。
1.3.2.RevalidationCriteria:重新调用Validate函数的时机。可以从RevalidationCriteria枚举中获取以下时机:
1.3.2.1.Always:当检视面板获取到焦点时就会调用Validate函数。
1.3.2.2.OnValueChange:当泛型参数修饰的检视面板属性的数值发生改变时就会调用Validate函数。
1.3.2.3.OnValueChangeOrChildValueChange:当泛型参数修饰的检视面板属性或者子属性的数值发生改变时就会调用Validate函数。
1.3.3.Attribute:泛型参数修饰的检视面板属性关联的定制特性实例。
1.3.4.ValueEntry:泛型参数修饰的检视面板属性关联的数值实例。可以通过该数值实例调用SmartValue属性来获取数值。
1.4.包含函数:如下所示:
1.4.1.CanValidateProperty(InspectorProperty):该函数主要用来判定是否可以对泛型参数修饰的检视面板属性进行验证。
1.4.2.Initialize:该函数主要用来初始化验证器。注意:只有当泛型参数修饰的检视面板属性可以被验证时,该函数才会被调用。
1.4.3.Validate(ValidationResult):该函数主要用来检测泛型参数修饰的检视面板属性是否符合指定的规则。当不符合指定规则时,Odin就会将警告或者错误消息同步给ValidationResult类型的参数变量并呈现在该检视面板属性身上。注意:只有当泛型参数修饰的检视面板属性可以被验证时,该函数才会被调用。
1.5.自定义定制特性验证器的流程如下所示:
1.5.1.首先创建一个继承自Attribute类型并且应用范围为字段或者属性的定制特性类型;然后将该定制特性类型应用到想要进行自定义验证的字段或者属性上面。参考代码如下所示:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
public class NotOneAttribute : Attribute
{
    
    
}

public class SampleAttributeValidator : MonoBehaviour
{
    
    
	// 泛型参数修饰的检视面板属性,会参与验证
    [NotOne]
    public int NotOneInt1;
    // 该字段的泛型参数TAttribute不为NotOneAttribute,不会参与验证
    public int NotOneInt2;
    // 该字段的泛型参数TValue不为int类型,不会参与验证
    [NotOne]
    public string NotOneString;
    // 该字段不显示在检视面板上面,不会参与验证
    [NotOne]
    private int NotOneInt3;
}

1.5.2.首先在编辑器环境下创建一个继承自AttributeValidator类型的定制特性验证器类型;然后在泛型参数中指定该定制特性验证器类型关联的定制特性类型和该定制特性类型应用的字段或者属性的类型。参考代码如下所示:

#if UNITY_EDITOR
    public class NotOneAttributeValidator : AttributeValidator<NotOneAttribute, int>
    {
    
    
    }
#endif

1.5.3.重写定制特性验证器类型中的CanValidateProperty函数来判定指定参数代表的泛型参数修饰的检视面板属性是否可以被验证。参考代码如下所示:

public override bool CanValidateProperty(InspectorProperty property)
{
    
    
	if (property.Name == "NotOneInt1")
	{
    
    
		return true;
	}
	else
	{
    
    
		return base.CanValidateProperty(property);
	}
}

1.5.4.当泛型参数修饰的检视面板属性可以被验证时,就重写定制特性验证器类型中的Initialize函数来初始化验证器。参考代码如下所示:

protected override void Initialize()
{
    
    
	base.Initialize();
}

1.5.5.当泛型参数修饰的检视面板属性可以被验证时,就重写定制特性验证器类型中的Validate函数来检测该检视面板属性是否符合指定规则。当该检视面板属性不符合规则时,就将警告或者错误信息同步给参数变量并显示到该检视面板属性身上。参考代码如下所示:

protected override void Validate(ValidationResult result)
{
    
    
	// 当泛型参数修饰的检视面板属性关联的数值实例保存的数值为1时,Odin就将验证信息上报给已注册的验证器
	if (this.ValueEntry.SmartValue == 1)
	{
    
    
		result.Message = "1 is not a valid value.";
		result.ResultType = ValidationResultType.Error;
	}
}

1.5.6.首先在文件的开头部分使用[assembly:]来引用Sirenix.OdinInspector.Editor.Validation程序集中的RegisterValidatorAttribute注册验证器类型;然后将自定义的定制特性验证器类型作为参数传递给注册验证器类型,进而让该自定义的定制特性验证器类型生效。参考代码如下所示:

[assembly: Sirenix.OdinInspector.Editor.Validation.RegisterValidator(typeof(NotOneAttributeValidator))]

2.Odin内置的定制特性验证器类型如下所示:
2.1.RequireComponentValidator<T>:该验证器类型用来验证检视面板属性的数值是否为组件。其中,泛型参数TAttribute类型为RequireComponentAttribute;泛型参数TValue为T代表的Component类型。
2.2.AssetsOnlyValidator<T>:该验证器类型用来验证检视面板属性的数值是否只为资源。其中,泛型参数TAttribute类型为AssetsOnlyAttribute;泛型参数TValue为T代表的Object类型。
2.3.FilePathValidator:该验证器类型用来验证检视面板属性的数值是否为文件路径。其中,泛型参数TAttribute类型为FilePathAttribute;泛型参数TValue为string类型。
2.4.FolderPathValidator:该验证器类型用来验证检视面板属性的数值是否为目录路径。其中,泛型参数TAttribute类型为FolderPathAttribute;泛型参数TValue为string类型。
2.5.ChildGameObjectsOnlyValidator<T>:该验证器类型用来验证检视面板属性的数值是否只为子游戏对象。其中,泛型参数TAttribute类型为ChildGameObjectsOnlyAttribute;泛型参数TValue为T代表的Object类型。
2.6.SceneObjectsOnlyValidator<T>:该验证器类型用来验证检视面板属性的数值是否只为场景对象。其中,泛型参数TAttribute类型为SceneObjectsOnlyAttribute;泛型参数TValue为T代表的Object类型。
2.7.DetailedInfoBoxValidator:该验证器类型用来验证检视面板属性是否存在错误。其中,泛型参数TAttribute类型为DetailedInfoBoxAttribute。
2.8.InfoBoxValidator:该验证器类型用来验证检视面板属性是否存在错误。其中,泛型参数TAttribute类型为InfoBoxAttribute。
2.9.RequiredValidator<T>:该验证器类型用来验证检视面板属性是否存在缺失。其中,泛型参数TAttribute类型为RequiredAttribute;泛型参数TValue为T代表的class类型。
2.10.ValidateInputAttributeValidator<T>:该验证器类型用来验证检视面板属性的数值是否满足要求。其中,泛型参数TAttribute类型为ValidateInputAttribute;泛型参数TValue为T代表的类型。
2.11.MinValueValidator<T>:该验证器类型用来验证检视面板属性的数值是否为最小值。其中,泛型参数TAttribute类型为MinValueAttribute;泛型参数TValue为T代表的struct类型。
2.12.MaxValueValidator<T>:该验证器类型用来验证检视面板属性的数值是否为最大值。其中,泛型参数TAttribute类型为MaxValueAttribute;泛型参数TValue为T代表的struct类型。
2.13.RangeValidator<T>:该验证器类型用来验证检视面板属性的数值是否为区间值。其中,泛型参数TAttribute类型为RangeAttribute;泛型参数TValue为T代表的struct类型。
2.14.PropertyRangeValidator<T>:该验证器类型用来验证检视面板属性的数值是否为区间值。其中,泛型参数TAttribute类型为PropertyRangeAttribute;泛型参数TValue为T代表的struct类型。
2.15.MinMaxSliderValidator<T>:该验证器类型用来验证检视面板属性的数值是否为滑块区间值。其中,泛型参数TAttribute类型为MinMaxSliderAttribute;泛型参数TValue为T代表的struct类型。

工程验证器窗口:该窗口可以按照指定的验证配置文件中的规则来扫描项目中的对象,并且将不符合规则的扫描对象呈现出来。具有以下特性:
1.打开工程验证器窗口:在Unity的菜单栏中选择【Tools -> Odin Project Validator】菜单项来打开工程验证器窗口。该窗口由验证配置文件列表(Validation Profiles)、自动验证按钮(Automate Validator)、管理验证配置文件按钮(Manage Profiles)三部分组成。如下图所示:
在这里插入图片描述
2.验证配置文件是一种可编写脚本对象(Scriptable Object)。具有以下特性:
2.1.验证配置文件默认存储在Assets/Plugins/Sirenix/Odin Validator/Editor/Config/目录里面。
2.2.编辑验证配置文件的方式存在以下三种:
2.2.1.点击验证配置文件列表中指定验证配置文件条目上的编辑按钮,进而打开验证配置文件编辑窗口。如下图所示:
在这里插入图片描述
2.2.2.首先点击验证配置文件列表中指定验证配置文件条目来进入到验证配置文件运行界面;然后在验证配置文件运行界面中点击验证配置文件来在右侧显示验证配置文件编辑界面。如下图所示:
在这里插入图片描述
2.2.3.首先进入到验证配置文件存放目录;然后点击指定验证配置文件就可以在检视面板上显示该验证配置文件编辑界面。如下图所示:
在这里插入图片描述
2.3.验证配置文件的内置类型存在以下三种:
2.3.1.Asset Validation Profile:资源验证配置文件类型。具有以下特性:
2.3.1.1.包含的成员:如下所示:
2.3.1.1.1.Name:资源验证配置文件的名称。
2.3.1.1.2.Description:资源验证配置文件的描述。
2.3.1.1.3.Search Filters:资源验证配置文件扫描的文件类型。如:t:ScriptableObject(可编写脚本对象)、t:Prefab(预制体)、t:Material(材质)等。
2.3.1.1.4.Asset Paths:资源验证配置文件扫描的文件路径。
2.3.1.1.5.Asset References:资源验证配置文件扫描的指定文件,该文件可以不在Asset Paths成员包含的文件路径里面。
2.3.1.1.6.Exclude Asset Paths:资源验证配置文件不扫描的文件路径。
2.3.1.1.7.Exclude Asset References:资源验证配置文件不扫描的指定文件。
2.3.1.2.默认的资源验证配置文件有以下几种:
2.3.1.2.1.Scan All Assets:扫描Assets目录里面所有的预制体和可编写脚本对象。成员设置如下图所示:
在这里插入图片描述
2.3.1.3.创建资源验证配置文件的流程如下所示:
2.3.1.3.1.首先在工程验证器窗口中点击管理验证配置文件按钮(Manage Profiles)或者在验证配置文件存放目录里面点击OdinValidationConfig.asset资产文件来打开管理验证配置文件界面。如下图所示:
在这里插入图片描述
2.3.1.3.2.首先点击管理验证配置文件界面中的创建新验证配置文件按钮(Create New Profile)来展开下拉列表;然后在下拉列表中双击Asset Validation Profile Asset条目来弹出创建文件窗口;最后在创建文件窗口里面命名好文件名称即可创建一个场景验证配置文件。如下图所示:
在这里插入图片描述
2.3.1.3.3.首先管理验证配置文件界面中的主验证配置文件列表(Main Validation Profiles)会自动添加新创建的资源验证配置文件;然后工程验证器窗口的验证配置文件列表(Validation Profiles)会自动同步管理验证配置文件界面中的主验证配置文件列表。如下图所示:
在这里插入图片描述
在这里插入图片描述
2.3.2.Scene Validation Profile:场景验证配置文件类型。具有以下特性:
2.3.2.1.包含的成员:如下所示:
2.3.2.1.1.Name:场景验证配置文件的名称。
2.3.2.1.2.Description:场景验证配置文件的描述。
2.3.2.1.3.Scene Paths:场景验证配置文件扫描的场景文件路径或者指定场景文件。
2.3.2.1.4.Exclude Scene Paths:场景验证配置文件不扫描的场景文件路径或者指定场景文件。
2.3.2.1.5.Include Scenes From Build Options:场景验证配置文件扫描当前构建选项中列出的所有活动场景。如下图所示:
在这里插入图片描述
2.3.2.1.6.Include Open Scenes:场景验证配置文件扫描Hierarchy视图里面所有的场景。如下图所示:
在这里插入图片描述
2.3.2.1.7.Include Asset Dependencies:场景验证配置文件会验证扫描场景的所有依赖资源。
2.3.2.2.默认的场景验证配置文件有以下几种:
2.3.2.2.1.Scan All Scenes:扫描Assets目录里面所有的场景。成员设置如下图所示:
在这里插入图片描述
2.3.2.2.2.Scan Open Scenes:扫描Hierarchy视图里面所有的场景。成员设置如下图所示:
在这里插入图片描述
2.3.2.2.3.Scan Scenes From Build Options:扫描构建选项里面所有的活动场景以及验证扫描场景的所有依赖资源。成员设置如下图所示:
在这里插入图片描述
2.3.2.3.创建场景验证配置文件的流程如下所示:
2.3.2.3.1.首先在工程验证器窗口中点击管理验证配置文件按钮(Manage Profiles)或者在验证配置文件存放目录里面点击OdinValidationConfig.asset资产文件来打开管理验证配置文件界面。
2.3.2.3.2.首先点击管理验证配置文件界面中的创建新验证配置文件按钮(Create New Profile)来展开下拉列表;然后在下拉列表中双击Scene Validation Profile Asset条目来弹出创建文件窗口;最后在创建文件窗口里面命名好文件名称即可创建一个场景验证配置文件。如下图所示:
在这里插入图片描述
2.3.2.3.3.首先管理验证配置文件界面中的主验证配置文件列表(Main Validation Profiles)会自动添加新创建的场景验证配置文件;然后工程验证器窗口的验证配置文件列表(Validation Profiles)会自动同步管理验证配置文件界面中的主验证配置文件列表。如下图所示:
在这里插入图片描述
在这里插入图片描述
2.3.3.Validation Collection Profile:集合验证配置文件类型。具有以下特性:
2.3.3.1.包含的成员:如下所示:
2.3.3.1.1.Name:集合验证配置文件的名称。
2.3.3.1.2.Description:集合验证配置文件的描述。
2.3.3.1.3.Profiles:集合验证配置文件运行的验证配置文件列表。
2.3.3.2.默认的集合验证配置文件有以下几种:
2.3.3.2.1.Scan Entire Project:内部包含Scan All Assets和Scan All Scenes验证配置文件,也就是扫描Assets目录里面所有的预制体、可编写脚本对象、场景。成员设置如下图所示:
在这里插入图片描述
2.3.3.3.创建集合验证配置文件的流程如下所示:
2.3.3.3.1.首先在工程验证器窗口中点击管理验证配置文件按钮(Manage Profiles)或者在验证配置文件存放目录里面点击OdinValidationConfig.asset资产文件来打开管理验证配置文件界面。
2.3.3.3.2.首先点击管理验证配置文件界面中的创建新验证配置文件按钮(Create New Profile)来展开下拉列表;然后在下拉列表中双击Validation Collection Profile Asset条目来弹出创建文件窗口;最后在创建文件窗口里面命名好文件名称即可创建一个集合验证配置文件。如下图所示:
在这里插入图片描述
2.3.3.3.3.首先管理验证配置文件界面中的主验证配置文件列表(Main Validation Profiles)会自动添加新创建的集合验证配置文件;然后工程验证器窗口的验证配置文件列表(Validation Profiles)会自动同步管理验证配置文件界面中的主验证配置文件列表。如下图所示:
在这里插入图片描述
在这里插入图片描述
2.4.重置默认验证配置文件的流程如下所示:
2.4.1.在工程验证器窗口中点击管理验证配置文件按钮(Manage Profiles)或者在验证配置文件存放目录里面点击OdinValidationConfig.asset资产文件来打开管理验证配置文件界面。
2.4.2.在管理验证配置文件界面里面点击重置默认验证配置文件按钮(Reset Default Profiles)来将主验证配置文件列表设置成由Scan All Assets、Scan All Scenes、Scan Entire Project、Scan Open Scenes、Scan Scenes From Build Options五个默认验证配置文件组成的列表。如下图所示:
在这里插入图片描述
2.4.3.工程验证器窗口的验证配置文件列表(Validation Profiles)会自动同步管理验证配置文件界面中的主验证配置文件列表。
2.5.当内置验证配置文件类型不满足业务需求时,就需要自定义验证配置文件类型。具有以下特性:
2.5.1.自定义验证配置文件类型不仅最好是纯C#类型,而且还必须实现IValidationProfile接口。具有以下特性:
2.5.1.1.包含属性:如下所示:
2.5.1.1.1.Name:验证配置文件的名称。
2.5.1.1.2.Description:验证配置文件的描述。
2.5.1.2.包含函数:如下所示:
2.5.1.2.1.GetProfileIcon:获取验证配置文件的图标贴图对象。
2.5.1.2.2.GetNestedValidationProfiles:获取嵌套的验证配置文件列表。
2.5.1.2.3.GetSource:获取验证配置文件扫描的对象。
2.5.1.2.4.Validate:首先获取扫描对象;然后验证扫描对象;最后返回验证结果。
2.5.2.创建自定义验证配置文件类型的流程如下所示:
2.5.2.1.首先创建一个实现自IValidationProfile接口的自定义验证配置文件类型;然后在将该自定义验证配置文件类型设置成可序列化,进而可以在检视面板上操作该自定义验证配置文件类型中的可序列化成员。参考代码如下所示:

[Serializable]
public class DatabaseValidatorProfile : IValidationProfile
{
    
    
}

2.5.2.2.实现IValidationProfile接口中的属性和函数来指定最终的验证操作。参考代码如下所示:

string IValidationProfile.Name {
    
     get => this.Name; set => this.Name = value; }
string IValidationProfile.Description {
    
     get => this.Description; set => this.Description = value; }
Texture IValidationProfile.GetProfileIcon() => Sirenix.Utilities.Editor.EditorIcons.FileCabinet.Active;
object IValidationProfile.GetSource(ValidationProfileResult entry) => entry.Source;
IEnumerable<IValidationProfile> IValidationProfile.GetNestedValidationProfiles() {
    
     yield break; }

public IEnumerable<ValidationProfileResult> Validate(ValidationRunner runner)
{
    
    
	var imaginaryDatabase = new ImaginaryDatabase();
	var items = imaginaryDatabase.GetAndDeserializeAllImaginaryItems();

	for (int i = 0; i < items.Length; i++)
	{
    
    
		// 获取扫描对象
		var item = items[i];
		// 验证扫描对象并填充验证结果
		var results = new ValidationProfileResult();
		results.Name = item.Name;
		results.Profile = this;
		results.Progress = (float)i / items.Length;
		results.Source = item;
		results.Results = new List<ValidationResult>();
		runner.ValidateUnityObjectRecursively(item, ref results.Results);
		// 返回验证结果
		yield return results;
	}
}

2.6.为了将自定义验证配置文件类型交给管理验证配置文件界面进行统一管理,此时就需要将自定义验证配置文件类型包装成自定义验证配置文件资产类型(ValidationProfileAsset<T>)。具有以下特性:
2.6.1.泛型参数必须为IValidationProfile接口类型。
2.6.2.包含字段:如下所示:
2.6.2.1.Profile:泛型参数代表类型创建的验证配置文件。
2.6.3.包含属性:如下所示:
2.6.3.1.Name:操作Profile字段代表的验证配置文件的Name属性。
2.6.3.2.Description:操作Profile字段代表的验证配置文件的Description属性。
2.6.4.包含函数:如下所示:
2.6.4.1.GetProfileIcon:操作Profile字段代表的验证配置文件的GetProfileIcon函数。
2.6.4.2.GetNestedValidationProfiles:操作Profile字段代表的验证配置文件的GetNestedValidationProfiles函数。
2.6.4.3.GetSource:操作Profile字段代表的验证配置文件的GetSource函数。
2.6.4.4.Validate:操作Profile字段代表的验证配置文件的Validate函数。
2.6.4.5.GetWrappedProfile:获取Profile字段代表的验证配置文件。
2.6.5.创建自定义验证配置文件资产类型的流程如下所示:
2.6.5.1.首先创建一个继承自ValidationProfileAsset<T>类型的自定义验证配置文件资产类型;然后将泛型参数T指定为具体需要操作的自定义验证配置文件类型。参考代码如下所示:

public class DatabaseValidatorProfileAsset : ValidationProfileAsset<DatabaseValidatorProfile>
{
    
    
}

2.6.5.2.首先在管理验证配置文件界面中点击创建新验证配置文件按钮(Create New Profile)来弹出下拉菜单;然后从下拉菜单中选择自定义验证配置文件资产类型条目来创建一个关联的自定义验证配置文件。如图所示:
在这里插入图片描述
2.7.执行验证配置文件的方式存在以下三种:
2.7.1.点击验证配置文件运行界面中的运行验证配置文件按钮(Run X,其中X代表验证配置文件名称)就可以执行验证配置文件。如下图所示:
在这里插入图片描述
2.7.2.首先通过调用ValidationProfileManagerWindow类中的OpenProjectValidatorWithProfile函数来打开验证配置文件运行界面 ;然后通过第二个参数(scanProfileImmediately)来决定是否执行第一个参数(profile)代表的验证配置文件。参考代码如下所示:

[MenuItem("Tools/OpenValidatorWithProfile")]
public static void OpenValidatorWithProfile()
{
    
    
	// 获取本地验证配置文件MySceneValidationProfileAsset.asset
	string path = "Assets/Config/MySceneValidationProfileAsset.asset";
	IValidationProfile profileToRun = AssetDatabase.LoadAssetAtPath<SceneValidationProfileAsset>(path);
	// 首先打开验证配置文件运行界面;然后执行MySceneValidationProfileAsset.asset验证配置文件
    ValidationProfileManagerWindow.OpenProjectValidatorWithProfile(profileToRun, true);
}

2.7.3.首先创建或者加载一个验证配置文件实例(IValidationProfile类型实例);然后通过该验证配置文件实例调用Validate函数来执行验证并返回扫描结果实例(ValidationProfileResult类型实例);最后通过扫描结果实例中相关成员来获取具体扫描信息。参考代码如下所示:

[MenuItem("Tools/RunValidatorWithProfile")]
public static void RunValidatorWithProfile()
{
    
    
	// 创建一个验证配置文件实例
	IValidationProfile profileToRun = new SceneValidationProfile()
	{
    
    
		ScenePaths = new [] {
    
    "Assets"}
	};
    // 创建一个验证配置文件运行器实例
	ValidationRunner runner = new ValidationRunner();
	// 调用验证配置文件实例的Validate函数并由验证配置文件运行器实例来对扫描对象执行最终的验证操作并返回扫描结果实例
	foreach (ValidationProfileResult vpResult in profileToRun.Validate(runner))
	{
    
    
		// 输出扫描对象的名称以及扫描对象在扫描对象列表中的索引代表的进度值
		Debug.Log($"Progress: {
      
      (int)(vpResult.Progress * 100)}% | Scanning Asset: {
      
      vpResult.Name}");
		// 遍历扫描结果
		foreach (ValidationResult result in vpResult.Results)
		{
    
    
			// 忽略异常类别为忽略的扫描结果
			if (result.ResultType == ValidationResultType.IgnoreResult)
			{
    
    
				continue;
			}
            // 获取由异常信息、验证器名称、扫描对象实例和扫描对象所在路径组成的日志
			var log = result.Message;
			log += "\n   Validator:" + result.Setup.Validator.GetType().Name;
			log += "\n   Path:" + result.Path;
			log += "\n   Source:" + vpResult.Source;
			// 根据异常类别来输出日志
			if (result.ResultType == ValidationResultType.Error)
			{
    
    
				Debug.LogError(log);
			}
            else
            {
    
    
                Debug.LogWarning(log);
            }
        }
    }
}

3.自动验证:如下所示:
3.1.打开自动验证界面的方式存在以下两种:
3.1.1.在工程验证器窗口上点击自动验证按钮(Automate Validator),进而打开自动验证界面。如下图所示:
在这里插入图片描述
3.1.2.在管理验证配置文件界面上点击Hooks下拉列表,进而打开自动验证界面。如下图所示:
在这里插入图片描述
3.2.自动验证存在以下三种模式:
3.2.1.On Play:项目运行时进行自动验证。
3.2.2.On Build:项目构建时进行自动验证。
3.2.3.On Project StartUp:项目打开时进行自动验证。
3.3.自动验证模式存在以下成员:
3.3.1.Profiles To Run:需要执行的验证配置文件列表。
3.3.2.Actions:当通过验证配置文件进行自动验证时,如果出现错误或警告信息,那么就会调用对应的行为。其中,常用的行为如下所示:
3.3.2.1.Open Validator If Error:当遇到错误信息时,就打开验证配置文件运行界面来展示详细错误信息。
3.3.2.2.Open Validator If Warning:当遇到警告信息时,就打开验证配置文件运行界面来展示详细警告信息。
3.3.2.3.Stop Hook Event On Error:当遇到错误信息时,就停止项目运行或者构建。
3.3.2.4.Stop Hook Event On Warning:当遇到警告信息时,就停止项目运行或者构建。
3.3.2.5.Log Error:当遇到错误信息时,就打印错误信息。
3.3.2.6.Log Warning:当遇到警告信息时,就打印警告信息。
3.3.2.7.None:当遇到错误或者警告信息时,就什么都不做。
3.3.3.Finish Validation On Failures:当Actions不为None且被触发时,不勾选时就立即调用Actions对应的行为,勾选时就在自动验证流程全部完成时再调用Actions对应的行为。
4.验证配置文件运行界面:如下所示:
4.1.验证配置文件运行界面的左侧为扫描对象树形视图;右侧为扫描对象编辑视图;底部为扫描结果总览视图;如下图所示:
在这里插入图片描述
4.2.当验证配置文件节点下面没有任何验证不通过的扫描对象时,就会在验证配置文件节点上面显示绿色的信息数量0;否则就会在验证配置文件节点和验证不通过的扫描对象身上显示黄色的警告数量或者红色的错误数量。如下图所示:
在这里插入图片描述
4.3.在扫描对象编辑界面里面不仅可以编辑扫描对象的序列化成员;而且还可以通过Ping Object按钮在项目中定位到扫描对象并高亮显示以及通过Select Object按钮在检视面板上显示扫描对象。如下图所示:
在这里插入图片描述
4.4.扫描结果总览视图具有以下特性:
4.1.该视图可以将每一条扫描结果的数据按照异常类别(警告图标或者异常图标)、异常信息(Message)、扫描对象(Object)、扫描对象所在路径(Path)、扫描对象所在的场景(Scene)、扫描对象成员(Property Path)、验证器(Validator)进行分组。如图所示:
在这里插入图片描述
4.2.在搜索框中输入检索信息就可以在视图中显示符合检索条件的扫描结果。如下图所示:
在这里插入图片描述
4.3.扫描结果同时只能在一个分组上点击箭头按钮进行排序(升序或者降序)。如下图所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zjz520yy/article/details/125936680