1. 程式人生 > >Unity自定義Inspector視窗——根據列舉型別顯示指定內容

Unity自定義Inspector視窗——根據列舉型別顯示指定內容

本文參考了這篇文章

我們直接進入主題,假設我們現在有下面這樣一個類:

public class Test
{
    public enum Type
    { 
        Enemy,
        Player
    }

    public Type type;

    public float enemyHP;
    public float playerHP;
}

我們隨便為場景中的一個物件新增該指令碼,發現該指令碼在 Inspector 面板中顯示如下:

這裡寫圖片描述

現在我們有了新的需求,我們希望面板顯示會隨著 Type 這個列舉型別的改變而改變:

  • 當 type = Enemy 時, 只顯示 enemyHP;
  • 當 type = Player 時, 只顯示 playerHP;

想要實現這些東西我們就需要自定義 Inspector 視窗,操作步驟寫如下:

  1. 在 Assets 下新建一個名為 Editor 的資料夾。
  2. 在 Editor 資料夾下建立一個指令碼,名為 TestInspectorEditor.cs。
  3. 在 TestInspectorEditor.cs 指令碼中新增如下程式碼:
using UnityEngine;
using System.Collections;
using UnityEditor;

// 確定我們需要自定義編輯器的元件
[CustomEditor(typeof(Test))]
public
class TestInspectorEditor : Editor { // 序列化物件 private SerializedObject test; // 序列化屬性 private SerializedProperty type; private SerializedProperty enemyHP; private SerializedProperty playerHP; void OnEnable() { // 獲取當前的序列化物件(target:當前檢視面板中顯示的物件) test = new
SerializedObject(target); // 抓取對應的序列化屬性 type = test.FindProperty("type"); enemyHP = test.FindProperty("enemyHP"); playerHP = test.FindProperty("playerHP"); } public override void OnInspectorGUI() { // 從物體上抓取最新的資訊 test.Update(); EditorGUILayout.PropertyField(type); if (type.enumValueIndex == 0) { EditorGUILayout.PropertyField(enemyHP); } else { EditorGUILayout.PropertyField(playerHP); } test.ApplyModifiedProperties(); } }

最終效果如下圖所示:

這裡寫圖片描述

解釋:
1. 為什麼要將 TestInspectorEditor.cs 指令碼放在 Editor 資料夾下呢?
以 Editor 命名的資料夾允許其中的指令碼訪問 Unity Editor 的 API。如果指令碼中使用了在UnityEditor 名稱空間中的類或方法,它必須被放在名為Editor的資料夾中。Editor資料夾中的指令碼不會在 build 時被包含。
由於這個類要繼承 Editor 類,所以需要將其放在 Editor 資料夾下。