Unity自定義Inspector視窗——根據列舉型別顯示指定內容
阿新 • • 發佈:2019-02-04
本文參考了這篇文章
我們直接進入主題,假設我們現在有下面這樣一個類:
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 視窗,操作步驟寫如下:
- 在 Assets 下新建一個名為 Editor 的資料夾。
- 在 Editor 資料夾下建立一個指令碼,名為 TestInspectorEditor.cs。
- 在 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 資料夾下。