Unity Odin从入门到精通(五):自定义处理器

注意事项:如下所示:
1.检视面板根属性为检视面板属性类型创建的字段或者属性,名称默认为$ROOT。
2.检视面板子属性为检视面板根属性的下层属性。
3.检视面板父属性为检视面板子属性的上层属性。
4.检视面板属性包含检视面板根属性和检视面板子属性列表。
5.可以通过PropertyTree类型来使用Odin绘制系统中的所有功能。

定制特性处理器:如下所示:
1.定制特性处理器可以让Odin扩展绘制检视面板属性。如:往检视面板属性上动态添加、修改、删除定制特性等。
2.使用定制特性处理器来扩展绘制检视面板属性时,Odin会自动过滤掉序列化相关的定制特性。
3.定制特性处理器类型有通用版本OdinAttributeProcessor和泛型版本OdinAttributeProcessor<T>两种。其中泛型版本可以约束定制特性处理器类型关联的检视面板属性类型。
4.Odin提供了AttributeListExtension类型来对List<Attribute>对象提供通用辅助函数。
5.定制特性处理器类型中的CanProcessSelfAttributes函数具有以下特性:
5.1.该函数的参数表示检视面板根属性。
5.2.该函数主要用来判定是否可以扩展绘制检视面板根属性。
6.定制特性处理器类型中的ProcessSelfAttributes函数具有以下特性:
6.1.该函数的第一个参数表示检视面板根属性,第二个参数表示定制特性列表。
6.2.该函数主要用来对检视面板根属性使用定制特性列表进行扩展绘制。
7.定制特性处理器类型中的CanProcessChildMemberAttributes函数具有以下特性:
7.1.该函数的第一个参数表示检视面板父属性,第二个参数表示检视面板子属性。
7.2.该函数主要用来判定是否可以扩展绘制检视面板父属性下面的检视面板子属性。
8.定制特性处理器类型中的ProcessChildMemberAttributes函数具有以下特性:
8.1.该函数的第一个参数表示检视面板父属性,第二个参数表示检视面板子属性,第三个参数表示定制特性列表。
8.2.该函数主要用来对检视面板父属性下面的检视面板子属性使用定制特性列表进行扩展绘制。
9.自定义定制特性处理器的流程如下所示:
9.1.首先定义一个检视面板属性类型;然后使用该检视面板属性类型创建一个字段或者属性。参考代码如下所示:

// 自定义检视面板属性类型
[Serializable]
public class MyInspectorPropertyClass
{
	// 以下字段为检视面板子属性
    public ScaleMode Model;
    public float Size;
}

public class CustomAttributeProcessorExample : MonoBehaviour
{
	// 通过自定义检视面板属性类型来创建一个字段,该字段就是检视面板根属性
    public MyInspectorPropertyClass Processor1;
	// 通过自定义检视面板属性类型来创建一个属性,该属性就是检视面板根属性
    [ShowInInspector]
    public MyInspectorPropertyClass Processor2
    {
        get;
        set;
    }
}

9.2.首先创建一个继承自OdinAttributeProcessor<T>类型的自定义定制特性处理器类型,并且将泛型参数设置为自定义检视面板属性类型。此时该自定义定制特性处理器类型就只能处理关联的自定义检视面板属性类型。参考代码如下所示:

public class MyAttributeProcessor : OdinAttributeProcessor<MyInspectorPropertyClass>
{
}

9.3.首先重写CanProcessSelfAttributes函数来判定是否可以扩展绘制检视面板根属性;然后重写ProcessSelfAttributes函数来对可以扩展绘制的检视面板根属性使用定制特性列表进行扩展绘制。参考代码如下所示:

public override bool CanProcessSelfAttributes(InspectorProperty property)
{
	// 判定检视面板根属性是否可以使用Odin进行扩展绘制
	return property.Name == "Processor1";
}

public override void ProcessSelfAttributes(InspectorProperty property, List<Attribute> attributes)
{
	// 使用定制特性列表来扩展绘制检视面板根属性
	attributes.Add(new InfoBoxAttribute("Dynamically added attributes!"));
    attributes.Add(new InlinePropertyAttribute());
}

9.4.首先重写CanProcessChildMemberAttributes函数来判定是否可以扩展绘制检视面板父属性下面的检视面板子属性;然后重写ProcessChildMemberAttributes函数来对可以扩展绘制的检视面板父属性下面的检视面板子属性使用定制特性列表进行扩展绘制。参考代码如下所示:

public override bool CanProcessChildMemberAttributes(InspectorProperty parentProperty, MemberInfo member)
{
	// 判定检视面板父属性下面的检视面板子属性是否可以使用Odin进行扩展绘制
	return parentProperty.Name == "Processor2";
}

public override void ProcessChildMemberAttributes(InspectorProperty parentProperty, MemberInfo member, List<Attribute> attributes)
{
	// 使用定制特性列表来扩展绘制检视面板父属性下面的检视面板子属性
	attributes.Add(new HideLabelAttribute());
   	attributes.Add(new BoxGroupAttribute("Box", showLabel: false));
	if (member.Name == "Mode")
	{
		attributes.Add(new EnumToggleButtonsAttribute());
	}
	else if (member.Name == "Size")
	{
		attributes.Add(new RangeAttribute(0, 5));
	}
}

10.当自定义定制特性处理器类型应用OdinDontRegisterAttribute定制特性时,虽然该自定义定制特性处理器类型不能直接处理关联的检视面板属性类型,但是可以使用定制特性处理器定位器类型来处理检视面板属性类型。参考代码如下所示:

[OdinDontRegister]
public class MyAttributeProcessor : OdinAttributeProcessor<MyInspectorPropertyClass>
{
}

属性处理器:如下所示:
1.属性处理器可以让Odin扩展绘制检视面板根属性。如:往检视面板根属性上动态添加、修改、删除检视面板子属性等。
2.属性处理器类型有通用版本OdinPropertyProcessor和泛型版本OdinPropertyProcessor<T>两种。其中泛型版本可以约束属性处理器类型关联的检视面板属性类型。
3.Odin提供了ProcessedMemberPropertyResolverExtensions类型来对List<InspectorPropertyInfo>对象提供通用辅助函数。
4.属性处理器类型中的CanProcessForProperty函数具有以下特性:
4.1.该函数的参数表示检视面板根属性。
4.2.该函数主要用来判定是否可以扩展绘制检视面板根属性。
5.属性处理器类型中的ProcessMemberProperties函数具有以下特性:
5.1.该函数的参数表示检视面板根属性下面的检视面板子属性列表。
5.2.该函数主要用来对检视面板根属性下面的检视面板子属性列表进行扩展绘制。
6.自定义属性处理器的流程如下所示:
6.1.首先定义一个检视面板属性类型;然后使用该检视面板属性类型创建一个字段或者属性。参考代码如下所示:

// 自定义检视面板属性类型
[Serializable]
public class MyInspectorPropertyClass
{
	// 以下字段为检视面板子属性
    public string Top;
    public string Middle;
    public string Bottom;
    public int Value1;
    public int Value2;
    public int Value3;
}

public class CustomPropertyProcessorExample : MonoBehaviour
{
	// 通过自定义检视面板属性类型来创建一个字段,该字段就是检视面板根属性
    public MyInspectorPropertyClass Processor1;
	// 通过自定义检视面板属性类型来创建一个属性,该属性就是检视面板根属性
    [ShowInInspector]
    public MyInspectorPropertyClass Processor2
    {
        get;
        set;
    }
}

6.2.创建一个继承自OdinPropertyProcessor<T>类型的自定义属性处理器类型,并且将泛型参数设置为自定义检视面板属性类型。此时该自定义属性处理器类型就只能处理关联的自定义检视面板属性类型。参考代码如下所示:

public class MyPropertyProcessor : OdinPropertyProcessor<MyInspectorPropertyClass>
{
}

6.3.首先重写CanProcessForProperty函数来判定是否可以扩展绘制检视面板根属性;然后重写ProcessMemberProperties函数来对可以扩展绘制的检视面板根属性下面的检视面板子属性列表进行扩展绘制。参考代码如下所示:

public override bool CanProcessForProperty(InspectorProperty property)
{
	// 判定检视面板根属性是否可以使用Odin进行扩展绘制
	return property.Name == "Processor1";
}

public override void ProcessMemberProperties(List<InspectorPropertyInfo> propertyInfos)
{
	// 将检视面板子属性Bottom移动到检视面板根属性下面的检视面板子属性列表的开头位置
    for (int i = 0; i < propertyInfos.Count; i++)
    {
		var propertyInfo = propertyInfos[i];
		if (propertyInfo.PropertyName == "Bottom")
		{
			propertyInfos.Insert(0, propertyInfo);
			propertyInfos.RemoveAt(i + 1);
			break;
		}
	}
        
	// 往检视面板根属性下面的检视面板子属性列表中添加一个名称为HelloFunc且类型为委托的检视面板子属性
	propertyInfos.AddDelegate("HelloFunc", () => { Debug.Log("Hello");}, new BoxGroupAttribute("Inject"));
	// 往检视面板根属性下面的检视面板子属性列表中添加一个名称为Sum且类型为int的检视面板子属性
	propertyInfos.AddValue("Sum",
	(ref MyInspectorPropertyClass instance) => instance.Value1 + instance.Value2 + instance.Value3,
	(ref MyInspectorPropertyClass instance, int sum) => { },
	new BoxGroupAttribute("Inject"));
	// 往检视面板根属性下面的检视面板子属性列表中添加一个名称为Enum且类型为MyEnum的检视面板子属性
	propertyInfos.AddValue("Enum",
	(ref MyInspectorPropertyClass instance) => (MyEnum)instance.Value1,
	((ref MyInspectorPropertyClass instance, MyEnum value) => { instance.Value1 = (int)value;}),
	new EnumToggleButtonsAttribute(),
	new BoxGroupAttribute("Inject"));
	// 从检视面板根属性下面的检视面板子属性列表中删除一个名称为Value1的检视面板子属性
	propertyInfos.Remove("Value1");
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D是一款非常流行的游戏引擎,它广泛应用于游戏开发、虚拟现实、增强现实等领域。对于初学者来说,学习Unity3D需要了解其基本概念、操作技巧和流程。为了从入门精通,需要掌握以下三个阶段: 第一阶段是入门阶段。这个阶段的关键是掌握Unity3D的基本概念和操作方法。首先,需要了解Unity3D的界面结构和菜单命令,熟悉不同面板的功能,包括场景窗口、资源窗口、控制台、层次结构等。其次,需要掌握Unity3D中的对象、组件和预制件的概念。通过学习Object和Component的类结构,了解它们的特性和作用,明白游戏对象的层级关系、物理模拟和碰撞检测等原理。最后,需要掌握脚本编写的基础语法,理解脚本与其他组件的交互方式和生命周期。 第二阶段是中级阶段。在入门阶段的基础上,需要进一步深入了解Unity3D引擎的高级技术和实际应用。主要包括:游戏设计模式、界面布局和UI设计、动画控制和剪辑编辑、材质和着色器的使用、粒子系统和特效处理等。此外,需要了解Unity3D的性能优化和调试方法,运用Profiler、Frame Debugger等工具分析游戏引擎的内部运行机制,减少游戏卡顿和崩溃的情况。 第三阶段是精通阶段。这个阶段的关键是掌握Unity3D引擎的高级特性和复杂游戏的开发流程。主要涉及:脚本优化和高级算法的实现、网络游戏开发和多人游戏场景同步、人工智能和路径规划等。此外,需要了解Unity3D的插件开发和资产管理、持续集成和版本控制、移动平台和AR/VR领域的开发规范等。最终,达到像Unity3D官方开发者一样的能力水平,能够独立完成复杂游戏的开发和运营,或参与到较大规模的团队开发项目中,成为一名优秀的Unity3D开发者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值