2-11 Writing Custom Editors
大家是否有發現新版的CameraRaycaster有神奇的功能呢?在Inspector視窗中,會看見如下圖一樣有下拉式選單可以選擇不同的Layer,明明在程式碼中他就只是一個int型別的陣列呀!
這是因為Unity可以自製編輯器,有興趣學習Editor的人,可以看官網的教學手冊,或是自行上網找更多的教學文章。
https://docs.unity3d.com/Manual/AdvancedEditor.html
大家可以開啟先前匯入到Editor/CameraRaycasterEditor.cs檔案看看,以下都替大家寫好註解了!
這是因為Unity可以自製編輯器,有興趣學習Editor的人,可以看官網的教學手冊,或是自行上網找更多的教學文章。
https://docs.unity3d.com/Manual/AdvancedEditor.html
大家可以開啟先前匯入到Editor/CameraRaycasterEditor.cs檔案看看,以下都替大家寫好註解了!
using UnityEditor;
// TODO consider changing to a property drawer
[CustomEditor(typeof(CameraRaycaster))]
public class CameraRaycasterEditor : Editor
{
bool isLayerPrioritiesUnfolded = true; // store the UI state
public override void OnInspectorGUI()
{
// serializedObject物件繼承自Editor,呼叫Update更新CameraRaycaster實體
serializedObject.Update();
// 產生Foldout功能,長得像下拉式抽屜可以開合的功能
isLayerPrioritiesUnfolded = EditorGUILayout.Foldout(isLayerPrioritiesUnfolded, "Layer Priorities");
if (isLayerPrioritiesUnfolded)
{
// 字段標籤的縮進級別,級別增加後新增的組件都會往後縮
EditorGUI.indentLevel++;
{
BindArraySize();
BindArrayElements();
}
// 上述組件新增完後再將縮進級別調整回來
EditorGUI.indentLevel--;
}
// 將Inspector的任何變更寫入到變數中
serializedObject.ApplyModifiedProperties();
}
void BindArraySize()
{
// 取得layerPriorities變數的值
int currentArraySize = serializedObject.FindProperty("layerPriorities.Array.size").intValue;
// 產生整數欄位,標籤名稱為Size,並會實時回傳該欄位任何的變化
int requiredArraySize = EditorGUILayout.IntField("Size", currentArraySize);
// 若欄位有變化,則將新增值更新到layerPriorities變數
if (requiredArraySize != currentArraySize)
{
serializedObject.FindProperty("layerPriorities.Array.size").intValue = requiredArraySize;
}
}
void BindArrayElements()
{
int currentArraySize = serializedObject.FindProperty("layerPriorities.Array.size").intValue;
for (int i = 0; i < currentArraySize; i++)
{
// 取得Array的值,並產生下拉式選單
var prop = serializedObject.FindProperty(string.Format("layerPriorities.Array.data[{0}]", i));
prop.intValue = EditorGUILayout.LayerField(string.Format("Layer {0}:", i), prop.intValue);
}
}
}


留言
張貼留言