在我之前的文章里,有介绍到怎么用自定义的Inspector(检视窗口)
在这篇文章里,我会介绍用PropertyAttribute加上PropertyDrawer在Inspector中显示 特定(自已定义) 的字段
PropertyAttribute 基础知识
- 创建这个类时不要在Editor 文件夹下。
- 继承于 UnityEngine.PropertyAttribute
- 类构造函数里可以有多个参数,当你引用时可以传递这些参数。
PropertyDrawer 基础知识
- 创建这个类时必须在Editor文件夹下。
- 继承于 PropertyDrawer
- 类头有 [CustomPropertyDrawer(typeof(XXXX))] 声明
- 重写OnGUI函数,来进行成员绘制
废话就不多说,之前有朋友问过说 想查看一个字段,而不允许开发者去编辑它 应该怎么办,当时没有完美的办法,现在应该有了。
直接上图,工程目录、文件目录、及Inspector效果图:
脚本1:DesableEdit.cs:
1 2 3 |
public class DisableEdit : UnityEngine.PropertyAttribute { } |
脚本2:DrawerTestAttribute.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using UnityEngine; using UnityEditor; [CustomPropertyDrawer(typeof(DisableEdit))] public class DrawerDisableEditAttribute : PropertyDrawer { public override void OnGUI (Rect position, SerializedProperty property, GUIContent label) { GUI.enabled = false; EditorGUI.PropertyField (position, property); } } |
测试脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using UnityEngine; using System.Collections; public class TestBehaviourScript : MonoBehaviour { [Range(0,2)] public int timeScale = 1; [DisableEdit] public float time; [SerializeField][DisableEdit][Tooltip("time += Time.deltaTime")] private string tip = "<--- Stay with 'Tip' !"; void Update() { time += Time.deltaTime; if (Time.timeScale != timeScale) { Time.timeScale = timeScale; } } } |
附工程文件地址下载:https://github.com/pingzi1066/Unity_DisableEdit
其它备注-Unity自带的:
1 |
[Range(0,2)] |
1 |
[SerializeField] |
1 |
[Tooltip("time += Time.deltaTime")] |
上文中private 修饰的字段直接加[DisableEdit]无法显示,需要多加[SerializeField]才行。
类似的还有[HideInInspector],主要用于公有字段。
Unity几个学习视频:
- https://www.youtube.com/watch?v=itkm-emb5tg
- https://www.youtube.com/watch?v=t-wShOv8c1E
- https://www.youtube.com/watch?v=s1o0gZwJS-4
写在最后:PropertyDrawer 的扩展性极其好,如果想在编辑器上写更好的工具,我认为这个东西是必须的。