游戏蛮牛吧 关注:296贴子:504
  • 4回复贴,共1

Unity自定义编辑器界面(Inspector)强迫症患者的福利

只看楼主收藏回复

好吧,我承认自己是个强迫症患者,在做项目的时候 发现脚本的Inspector面板上暴露的密密麻麻的变量头皮一阵发麻~~~
举个例子 比如我要写 一个 Enemy的类,我希望这个Enemy里面包括了所有的 敌人类型,比如 飞机 坦克等等。
但是由于类型不同,他们的一直变量类型也不同,比如 坦克的 变量类型可能有 移动速度,子弹类型,或者其他的,飞机的变量类型有飞行速度,等等。
如果不加整理 那么在Inspector 面板就会暴露出密密麻麻的 变量 不仅头晕,而且不利于调试。
其实就是我强迫症发作了,我只想面板显示我想要的东西。
好吧 下面开始
首先 我新建一个 test1 脚本 C#

我们的目标是通过枚举类型来定义当前物体的类型。如果m_type是 player,那么就显示 playerlife;如果是 enemy 就显示enemylife。
下面我们需要写一个脚本去重写Inspector界面。
新建一个文件夹 命名为 Editor 因为我们需要 using unityEditor 而是用这个的脚本必须在名字为Editor 的文件下。
在Editor 文件下创建一个C#新脚本 名字随意 我的叫 Inspector_test1

首先 头部 加入 using UnityEditor
[CunstomEditor(typeof(test1))]
继承改为 Editor
首先我们要序列化一个物体 就是说脚本会附在一个Object上 还有脚本的变量
在OnEnable() 里面 初始化 Objcet对象 抓取脚本里面的属性
然后 再重写 OnInspectorGUI()
首先是更新脚本的信息
test.Update();
然后显示枚举类型变量 m_type 这个变量是一定要暴露出来的 因为通过它来定义这个物体的属性 是player 还是 enemy
EditorGUILayout.propertyField(m_type);
然后 我们来判断这个m_type是哪个值 是player 还是enemy.
我们通过 SerializedProperty.enumValueIndex 枚举值索引 来检索当前枚举类型的变量值是哪个 例如在 type 枚举类型里面 player 的枚举值索引下标为 0 enemy 的枚举值索引下标为 1
这样 我们通过判断 m_type 的 枚举下标的值就可以推断出 当前值的哪一个,进而进行相关的操作了。
最后,通过
SerializedObject.ApplyModifiedProperties 应用修改的属性
效果


1楼2014-11-25 13:59回复
    你要么就不写 要写就写完 脚本贴一半出来装B吗?


    IP属地:重庆2楼2017-06-04 14:06
    收起回复
      写完吧,写的很好哦~


      IP属地:广东3楼2017-09-09 10:41
      回复
        这不是已经阐述完了吗?难道我段位不够?


        IP属地:湖北4楼2018-06-01 18:09
        回复