前面已经写了三篇:
今天写第四篇,扩展自己的自定义组件。
通常我们使用继承自 Editor 的自定义编辑器类,来扩展自己的组件的检视面板和编辑器,并配合 CustomEditor 特性语法,附加该编辑器到一个自定义组件。
首先我们先定义一个组件 Player:
1 using UnityEngine; 2 3 public class Player : MonoBehaviour 4 { 5 public int armor = 80; //护甲 6 public int attack = 100; //攻击力 7 }
一个简单的 Player 组件,有护甲和攻击力两个属性,挂载后,效果如下:
接下来我们对 Player 进行扩展,代码如下:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(Player))] public class EditorTest : Editor { public override void OnInspectorGUI() { var _target = (Player)(serializedObject.targetObject); _target.armor = EditorGUILayout.IntSlider("护甲", _target.armor, 0, 100); ProgressBar(_target.armor / 100f, "护甲"); _target.attack = EditorGUILayout.IntSlider("攻击力", _target.attack, 0, 100); ProgressBar(_target.attack / 100f, "攻击力"); } private void ProgressBar(float value, string label) { Rect rect = GUILayoutUtility.GetRect(18, 18); EditorGUI.ProgressBar(rect, value, label); EditorGUILayout.Space(); } }
效果图:
是不是感觉漂亮了很多,直观了很多。这样我们就可以把很多UI控件扩展到我们的组件上,显得高大上。
实效上面这种效果,还有另外一种方法:
using UnityEngine; using UnityEditor; [CustomEditor(typeof(Player))] public class EditorTest : Editor { private SerializedProperty attack; private SerializedProperty armor; void OnEnable() { attack = serializedObject.FindProperty("attack"); armor = serializedObject.FindProperty("armor"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.IntSlider(armor, 0, 100, new GUIContent("护甲")); ProgressBar(armor.intValue / 100f, "护甲"); EditorGUILayout.IntSlider(attack, 0, 100, new GUIContent("攻击力")); ProgressBar(attack.intValue / 100f, "攻击力"); serializedObject.ApplyModifiedProperties(); } private void ProgressBar(float value, string label) { Rect rect = GUILayoutUtility.GetRect(18, 18); EditorGUI.ProgressBar(rect, value, label); EditorGUILayout.Space(); } }
这种方法和第一种方法效果是一样的,就不上图了。
扩展自定义组件我们除了写编辑器类以外,还会用到很多特性,特性的使用在下一节。