Unity 编辑器篇|(十三)自定义属性绘制器(PropertyDrawer ,PropertyAttribute) (全面总结 | 建议收藏)

本文详细介绍了Unity中的PropertyDrawer和PropertyAttribute,用于自定义属性的显示和行为。PropertyDrawer负责在编辑器中渲染属性的外观,而PropertyAttribute提供额外的元数据或改变属性的默认编辑行为。两者结合使用,可以创建高度定制的编辑器界面,包括自定义可序列化类的显示、添加提示信息和范围限制等功能。文章通过代码样例展示了如何为Inspector面板的string属性添加文件选择功能,并介绍了如何针对部分特定类型属性进行自定义。

1. 前言

  • 在Unity中,PropertyDrawerPropertyAttribute是两个重要的工具,它们主要用于自定义属性的显示和行为。
  • PropertyDrawer是一个类,它定义了如何在编辑器中渲染属性的外观。你可以通过继承PropertyDrawer类并重写其方法来自定义属性的显示方式。PropertyDrawer主要关注的是在编辑器中如何显示属性,提供了一种灵活的方式来控制属性的外观和交互方式。
  • PropertyAttribute是一个标记特性,它可以应用于C#类中的字段或属性上,提供额外的元数据或改变默认的编辑行为。通过使用PropertyAttribute,你可以为属性添加各种功能,例如限制值的范围、添加提示信息等。PropertyAttribute主要关注的是在代码中提供更多关于属性的信息和行为,以便在编辑器中更好地处理和呈现这些属性。
### 创建和使用自定义属性Unity 中,通过继承 `PropertyAttribute` 类并应用 `[AttributeUsage]` 特性来创建自定义属性。这允许开发者指定新特性可应用于哪些程序元素。 对于字段级别的自定义属性,代码如下所示: ```csharp using System; using UnityEngine; [AttributeUsage(AttributeTargets.Field)] public class SceneName : PropertyAttribute { } ``` 此段代码声明了一个名为 `SceneName` 的简单自定义属性[^2]。然而,在这个阶段,它仅作为标记存在,并不会影响 Inspector 行为或提供额外功能。 为了使自定义属性生效,还需要编写相应的编辑器脚本来处理带有特定属性的字段。通常涉及实现 `CustomPropertyDrawer` 或者直接操作 `SerializedObject` 和 `SerializedProperty` API 来控制显示逻辑。 下面是一个简单的例子展示如何绘制带有所述 `SceneName` 属性的字符串字段: ```csharp using UnityEditor; using UnityEngine; [CustomPropertyDrawer(typeof(SceneName))] public class SceneNameDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { // 只针对 string 类型有效 if (property.propertyType != SerializedPropertyType.String) { EditorGUI.LabelField(position, label.text, "Only works on strings!"); return; } // 获取当前场景名称列表 var scenes = EditorBuildSettings.scenes; string[] options = new string[scenes.Length]; for(int i=0;i<scenes.Length;++i){ options[i]=System.IO.Path.GetFileNameWithoutExtension(scenes[i].path); } // 绘制下拉框控件 int selectedIndex = Mathf.Max(0,System.Array.IndexOf(options, property.stringValue)); selectedIndex = EditorGUI.Popup(position,label.text,options,selectedIndex); // 更新目标对象上的值 property.stringValue = options[selectedIndex]; } } ``` 这段代码实现了对具有 `SceneName` 自定义特性的字段进行特殊渲染的功能——即从项目设置中的构建配置读取可用场景名,并呈现成一个方便的选择界面给用户交互。 当把以上两个组件结合起来时,便可以在 Unity 编辑器内看到更加友好直观的操作体验;同时保持了 C# 语法糖带来的灵活性与简洁度。
评论 167
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游戏开发小Y

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值