前面已经写了三篇:
今天写第四篇,扩展自己的自定义组件。
通常我们使用继承自 Editor 的自定义编辑器类,来扩展自己的组件的检视面板和编辑器,并配合 CustomEditor 特性语法,附加该编辑器到一个自定义组件。
首先我们先定义一个组件 Player:
using UnityEngine; public class Player : MonoBehaviour
{
public int armor = ; //护甲
public int attack = ; //攻击力
}
一个简单的 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, , );
ProgressBar(_target.armor / 100f, "护甲");
_target.attack = EditorGUILayout.IntSlider("攻击力", _target.attack, , );
ProgressBar(_target.attack / 100f, "攻击力");
}
private void ProgressBar(float value, string label)
{
Rect rect = GUILayoutUtility.GetRect(, );
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, , , new GUIContent("护甲"));
ProgressBar(armor.intValue / 100f, "护甲");
EditorGUILayout.IntSlider(attack, , , new GUIContent("攻击力"));
ProgressBar(attack.intValue / 100f, "攻击力");
serializedObject.ApplyModifiedProperties();
}
private void ProgressBar(float value, string label)
{
Rect rect = GUILayoutUtility.GetRect(, );
EditorGUI.ProgressBar(rect, value, label);
EditorGUILayout.Space();
}
}
这种方法和第一种方法效果是一样的,就不上图了。
扩展自定义组件我们除了写编辑器类以外,还会用到很多特性,特性的使用在下一节。