Unity編輯器

新博客:https://yinl.fun
歡迎關注,同步更新html

Unity編輯器

這篇文章主要總結一下最近工做時寫的一些編輯器,總結了三種經常使用的編輯器編寫方式:編輯器

Inspector Editor

利用CustomEditor特性掛接Script來實現Inspector界面顯示ide

InspectorEditorImage

首先咱們給出對應的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();
    }
}

EditorWindow

建立一個編輯器視窗,視窗能夠內嵌到Unity編輯器中code

EditorWindowImage

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();
    }
}

ScriptableWizard

建立一個編輯器導航視窗htm

ScriptableWizardImage

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("點擊另外一個按鈕");
    }
}
相關文章
相關標籤/搜索