zoukankan      html  css  js  c++  java
  • 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();
        }
    }

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

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

  • 相关阅读:
    常见总结
    手机号中间四位替换为****
    写给30岁之前的我
    顺序栈ADT简单的实现
    快速排序
    关于存储类的例子总结
    非有序的静态查找表的查找某个元素的算法
    有序的静态查找表的折半(二分)查找算法
    【项目】项目125
    【项目】项目132
  • 原文地址:https://www.cnblogs.com/xiaoyulong/p/10143989.html
Copyright © 2011-2022 走看看