Unity提供了强大的Editor功能, 我们可以很轻易的在EditorGUI中绘制任意的属性。比如我之前写的文章 http://www.xuanyusong.com/archives/2202
那么问题就来了,如果我有多属性想共用同一段自定义控件,那么这种方法我就需要在多份代码里绘制控件了OnInspectorGUI 这一节中我们需要用到两个全新的自定义属性PropertyAttribute和PropertyDrawer。 可以理解为一个是数据,一个是渲染。
数据代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using UnityEngine; using System.Collections; public class MyTestAttribute : PropertyAttribute { public int max; public int min; public MyTestAttribute(int a, int b){ min =a; max =b; } } |
渲染代码,如果你想做一些复杂的结构,直接在OnGUI里面插入代码即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using UnityEditor; using System.Collections.Generic; using UnityEngine; [CustomPropertyDrawer(typeof(MyTestAttribute))] public class MyTestDrawer : PropertyDrawer { public override void OnGUI (UnityEngine.Rect position, SerializedProperty property, UnityEngine.GUIContent label) { MyTestAttribute attribute = (MyTestAttribute)base.attribute; property.intValue =Mathf.Min(Mathf.Max(EditorGUI.IntField(position,label.text,property.intValue),attribute.min),attribute.max); } } |
最后在需要用这个通用组件的代码上添加如下代码即可。
1 2 3 4 5 6 7 8 9 10 |
using UnityEngine; using System.Collections; public class Game : MonoBehaviour { [MyTestAttribute(0,100)] public int intValue = 0; } |
如下图所示,这个属性的渲染就已经完全独立出来了。
- 本文固定链接: https://www.xuanyusong.com/archives/3680
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
using UnityEngine;public class MyArrayAttribute : PropertyAttribute{ public string boolName; public bool isShowWithTrue; public MyArrayAttribute(string boolName, bool isShowWithTrue) { this.boolName = boolName; this.isShowWithTrue = isShowWithTrue; }}using UnityEngine;using UnityEditor;[CustomPropertyDrawer(typeof(MyArrayAttribute))]public class MyArrayDrawer : PropertyDrawer{ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { Debug.Log(property.propertyPath); }}using UnityEngine;public class Game : MonoBehaviour{ public bool show; [MyArray(“show”,true)] public int[] vals;}上面的代码,Debug.Log(property.propertyPath);打印出来的是数组的元素的propertyPath,而不是数组的propertyPath。这样是说数组不执行OnGUI()方法吗?
文章里是重新渲染int类型的值,怎么重新渲染数组类型呢?
数组类型只能重新渲染其所有元素, 数组变量本身是不支持重渲染的.
如果自定义属性占多行,怎么写才能使与下面的属性不重叠?
可以传参数进去的。。