新博客:https://yinl.fun
歡迎關注,同步更新html
這篇文章主要總結一下最近工做時寫的一些編輯器,總結了三種經常使用的編輯器編寫方式:編輯器
利用CustomEditor特性掛接Script來實現Inspector界面顯示ide
首先咱們給出對應的Script代碼,主要是爲了提供Inspector面板的參數而用函數
public class SampleEditorScript : MonoBehaviour { public int sliderNum = 0; public int intNum = 0; public float floatNum = 0f; public string str = ""; public Vector2 pos = Vector2.zero; }
以後寫對應的Editor文件3d
// 腳本爲前面編寫的數據腳本 [CustomEditor(typeof(SampleEditorScript))] // [CanEditMultipleObjects] 多對象編輯 public class SampleEditor : Editor { SerializedProperty sliderNum; SerializedProperty intNum; SerializedProperty floatNum; SerializedProperty str; SerializedProperty pos; void OnEnable() { // 將值傳給對應的SerializedProperty sliderNum = serializedObject.FindProperty("sliderNum"); intNum = serializedObject.FindProperty("intNum"); floatNum = serializedObject.FindProperty("floatNum"); str = serializedObject.FindProperty("str"); pos = serializedObject.FindProperty("pos"); } /// <summary> /// 繪製Inspector窗口 /// </summary> public override void OnInspectorGUI() { // 每次繪製insperctor面板的時候都應該更新一下serializedObjectd的數據 serializedObject.Update(); // 除PropertyField函數外,正常函數也封裝了傳入SerializedProperty的用法 EditorGUILayout.IntSlider(sliderNum, 0, 100, new GUIContent("Slider")); ProgressBar(sliderNum.intValue / 100.0f, "Slider Num"); // PropertyField好處爲自動識別類型 EditorGUILayout.PropertyField(intNum, new GUIContent("Int Num")); EditorGUILayout.PropertyField(floatNum, new GUIContent("Float Num")); EditorGUILayout.PropertyField(str, new GUIContent("string")); EditorGUILayout.PropertyField(pos, new GUIContent("Vector2")); // 將數據更改應用於serializedObject serializedObject.ApplyModifiedProperties(); } /// <summary> /// 繪製Scene窗口 /// </summary> void OnSceneGUI() { // 繪製的線爲紅色 Handles.color = Color.red; // 在點(0,0,0)到(1,1,1)畫一條紅線 Handles.DrawLine(Vector3.zero, Vector3.one); } /// <summary> /// 自定義進度條 /// </summary> /// <param name="value">進度條值</param> /// <param name="label">進度條名字</param> void ProgressBar(float value, string label) { // 爲文本框繪製一個進度條 Rect rect = GUILayoutUtility.GetRect(18, 18, "TextField"); EditorGUI.ProgressBar(rect, value, label); EditorGUILayout.Space(); } }
建立一個編輯器視窗,視窗能夠內嵌到Unity編輯器中code
public class SampleEditorWindow : EditorWindow { private int intNum = 0; private float floatNum = 0f; private string str = ""; private Vector2 SVPos; /// <summary> /// 菜單欄響應函數 /// </summary> [MenuItem("EditorTools/SampleEditorWindow")] static void Init() { // 初始化窗口並顯示 SampleEditorWindow window = (SampleEditorWindow)GetWindow(typeof(SampleEditorWindow)); window.Show(); } /// <summary> /// 界面繪製函數 /// </summary> void OnGUI() { // 繪製可用EditorGUILayout、GUILayout所提供的函數等 // 豎直排版 EditorGUILayout.BeginHorizontal(); // 滑動組件 SVPos = EditorGUILayout.BeginScrollView(SVPos); // int輸入框 intNum = EditorGUILayout.IntField("Int Num", intNum); // float輸入框 floatNum = EditorGUILayout.FloatField("Float Num", floatNum); // string輸入框 str = EditorGUILayout.TextField("string", str); // 等等... EditorGUILayout.EndScrollView(); EditorGUILayout.EndHorizontal(); } }
建立一個編輯器導航視窗htm
public class SampleScriptableWizard : ScriptableWizard { public int intNum = 0; public float floatNum = 0f; public string str = ""; [MenuItem("EditorTools/SampleScriptableWizard")] static void Init() { ScriptableWizard.DisplayWizard<SampleScriptableWizard>("Wizard界面", "Wizard按鈕", "Wizard另外一個按鈕"); } /// <summary> /// 界面的刷新 /// </summary> void OnWizardUpdate() { helpString = "這是一條提示語句"; } /// <summary> /// 按鈕執行功能 /// </summary> void OnWizardCreate() { Debug.Log("點擊按鈕"); } void OnWizardOtherButton() { Debug.Log("點擊另外一個按鈕"); } }