Unity3D编辑器扩展(四)——扩展自己的组件

前面已经写了三篇:

Unity3D编辑器扩展(一)——定义自己的菜单按钮

Unity3D编辑器扩展(二)——定义自己的窗口

Unity3D编辑器扩展(三)——使用GUI绘制窗口

今天写第四篇,扩展自己的自定义组件。

通常我们使用继承自 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();
    }
}

这种方法和第一种方法效果是一样的,就不上图了。

 扩展自定义组件我们除了写编辑器类以外,还会用到很多特性,特性的使用在下一节。

原文地址:https://www.cnblogs.com/xiaoyulong/p/10143989.html