定制特性处理器定位器:如下所示:
1.定制特性处理器定位器首先会查找和创建定制特性处理器实例;然后会通过定制特性处理器实例来使用定制特性列表扩展绘制检视面板属性。
2.定制特性处理器定位器类型为OdinAttributeProcessorLocator。
3.定制特性处理器定位器类型中的GetSelfProcessors函数具有以下特性:
3.1.该函数的参数表示检视面板属性。
3.2.该函数的返回值表示定制特性处理器实例列表。
3.3.该函数首先会依次遍历定制特性处理器实例列表;然后通过定制特性处理器实例来调用ProcessSelfAttributes函数对检视面板属性使用定制特性列表进行扩展绘制。
4.定制特性处理器定位器类型中的GetChildProcessors函数具有以下特性:
4.1.该函数的第一个参数表示检视面板父属性,第二个参数表示检视面板子属性。
4.2.该函数的返回值表示定制特性处理器实例列表。
4.3.该函数首先会依次遍历定制特性处理器实例列表;然后通过定制特性处理器实例来调用ProcessChildMemberAttributes函数对检视面板父属性下面的检视面板子属性使用定制特性列表进行扩展绘制。
5.自定义定制特性处理器定位器的流程如下所示:
5.1.首先定义两个检视面板属性类型;然后将其中一个检视面板属性类型嵌套在另一个检视面板属性类型里面。参考代码如下所示:
// 自定义检视面板属性类型
[Serializable]
public class MyChildClass
{
// 以下字段为检视面板子属性
public int ChildIntData;
public string ChildStringData;
}
// 自定义检视面板属性类型
[Serializable]
public class MyRootClass
{
// 以下字段为检视面板子属性
public int RootIntData;
public string RootStringData;
public MyChildClass RootClassData;
}
5.2.首先创建一个继承自OdinAttributeProcessor<T>类型的自定义定制特性处理器类型;然后将该自定义定制特性处理器类型的泛型参数设置为关联的自定义检视面板属性类型;最后将该自定义定制特性处理器类型应用OdinDontRegisterAttribute定制特性。参考代码如下所示:
[OdinDontRegister]
public class MyRootClassAttributeProcessor : OdinAttributeProcessor<MyRootClass>
{
}
5.3.首先重写自定义定制特性处理器类型的ProcessSelfAttributes函数来对检视面板属性使用定制特性列表进行扩展绘制;然后重写自定义定制特性处理器类型的ProcessChildMemberAttributes函数来对检视面板父属性下面的检视面板子属性使用定制特性列表进行扩展绘制。参考代码如下所示:
public override void ProcessSelfAttributes(InspectorProperty property, List<Attribute> attributes)
{
// 使用定制特性列表来扩展绘制检视面板属性
attributes.Add(new InlinePropertyAttribute());
}
public override void ProcessChildMemberAttributes(InspectorProperty parentProperty, MemberInfo member, List<Attribute> attributes)
{
// 使用定制特性列表来扩展绘制检视面板父属性下面的检视面板子属性
attributes.Add(new HideLabelAttribute());
if (member.Name == "RootIntData")
{
attributes.Add(new RangeAttribute(0, 20));
}
else if (member.Name == "ChildIntData")
{
attributes.Add(new RangeAttribute(0, 100));
}
}
5.4.首先创建一个继承自OdinAttributeProcessorLocator类型的自定义定制特性处理器定位器类型;然后在该自定义定制特性处理器定位器类型中创建一些自定义定制特性处理器实例。参考代码如下所示:
public class MyOdinAttributeProcessorLocator : OdinAttributeProcessorLocator
{
// 创建一些自定义定制特性处理器实例
private static readonly MyRootClassAttributeProcessor Processor = new MyRootClassAttributeProcessor();
}
5.5.重写自定义定制特性处理器定位器类型的GetSelfProcessors函数来对使用该自定义定制特性处理器定位器类型的检视面板属性进行扩展绘制。参考代码如下所示:
// 首先依次遍历定制特性处理器实例列表;然后通过定制特性处理器实例来调用ProcessSelfAttributes函数对检视面板属性使用定制特性列表进行扩展绘制。
public override List<OdinAttributeProcessor> GetSelfProcessors(InspectorProperty property)
{
return new List<OdinAttributeProcessor>() {
Processor};
}
5.6.重写自定义定制特性处理器定位器类型的GetChildProcessors函数来对使用该自定义定制特性处理器定位器类型的检视面板父属性下面的检视面板子属性进行扩展绘制。参考代码如下所示:
// 首先依次遍历定制特性处理器实例列表;然后通过定制特性处理器实例来调用ProcessChildMemberAttributes函数对检视面板父属性下面的检视面板子属性使用定制特性列表进行扩展绘制。
public override List<OdinAttributeProcessor> GetChildProcessors(InspectorProperty parentProperty, MemberInfo member)
{
return new List<OdinAttributeProcessor>() {
Processor};
}
5.7.首先使用检视面板属性类型创建一个实例;接着调用PropertyTree.Create函数来为该检视面板属性实例创建一个PropertyTree实例;然后将自定义定制特性处理器定位器实例赋值给PropertyTree实例的AttributeProcessorLocator属性;最后调用PropertyTree实例的Draw函数来绘制关联的检视面板属性实例。参考代码如下所示:
public class SampleAttributeProcessorLocator : MonoBehaviour
{
private PropertyTree tree = null;
[OnInspectorGUI]
public void OnInspectorGUI()
{
if (tree == null)
{
// 创建检视面板属性实例
MyRootClass instance = new MyRootClass();
// 为检视面板属性实例创建关联的PropertyTree实例
tree = PropertyTree.Create(instance);
// 将自定义定制特性处理器定位器实例赋值给PropertyTree实例的AttributeProcessorLocator属性
tree.AttributeProcessorLocator = new MyOdinAttributeProcessorLocator();
}
// 使用PropertyTree实例来绘制关联的检视面板属性实例
tree.Draw(false);
}
}