1. 程式人生 > >unity 編輯器----編輯器視窗控制元件建立和UI佈局

unity 編輯器----編輯器視窗控制元件建立和UI佈局

unity編輯器視窗控制元件通過EditorGUILayout、EditorGUI、GUILayout和GUI來建立控制元件和實現佈局。

EditorGUILayout、EditorGUI這兩個是unity編輯器使用。

而GUILayout和GUI執行時遊戲中和編輯器中都可以使用,但是這兩個類就是服務於執行時,Monobehaviour的OnGUI()方法大家都知道吧,這兩個類就是為OnGUI()的UIhuizhi服務的。

一.各類比較與對應關係

EditorGUILayout和執行時的GUILayout相對應,因為他們的佈局方式是一樣的,自動水平拉伸佈滿整個視窗的寬度,每個控制元件佔一大行。這種方式我稱它為自動佈局

吧。

EditorGUI和執行時的GUI相對應,必須設定固定大小和位置。這種方法我稱它為手動佈局

下面比較一下效果:

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class WinTest : EditorWindow
{
    public GameObject go;
    SerializedProperty serializedProperty;
    SerializedObject serializedObject;
    [MenuItem("test/win")]
    static void show()
    {
        EditorWindow.GetWindow<WinTest>().Show();
    }
    string tagStr = "dd";
    string tagStr1 = "dd1";
    Object source;
    void OnGUI()
    {
        //自動佈局
        EditorGUILayout.TextField("自動佈局-->EditorGUILayout");        //編輯器使用
        GUILayout.TextField("自動佈局-->GUILayout");                    //執行時使用(編輯器下正常使用)

        //手動佈局
        EditorGUI.TextField(new Rect(0,60,200,20), "手動佈局-->EditorGUI"); //編輯器使用
        GUI.TextField(new Rect(0, 80, 200, 20), "手動佈局-->GUI");           //執行時使用(編輯器下正常使用)
    }
}

執行效果:

 

這裡就有點煩蒙了。既然對應的類是一樣的,那為什麼還定義這麼多類,搞的都不知道使用那個了呢。。。

其實unity官方估計是為了把編輯器和執行時的UI分開才定義了這幾個相對應的類。看了有些帖子不去區分到底使用哪個類,以至於亂使用。雖說混亂使用不影響功能,但是我還是建議區分開來。下面講解只說明編輯器類EditorGUILayout和EditorGUI。不再使用執行時的類。

 

 

 

1.EditorGUILayout和EditorGUI

EditorGUILayout包含EditorGUI全部元件。多出了幾個佈局控制元件

EditorGUILayout多出的幾個控制元件如下:

  • Space

    Make a small space between the previous control and the following.
    在上一個控制元件和跟隨的控制元件之間,製作一個小的空距。

  • BeginToggleGroup

    Begin a vertical group with a toggle to enable or disable all the controls within at once.
    開始帶有開關按鈕的一個垂直組,在這裡立即啟用或禁用控制元件。

  • EndToggleGroup

    Close a group started with BeginToggleGroup
    關閉BeginToggleGroup開始的組。

  • BeginHorizontal

    Begin a horizontal group and get its rect back.
    開始一個水平組並獲取返回矩形。

  • EndHorizontal

    Close a group started with BeginHorizontal
    關閉一個BeginHorizontal開始的組。

  • BeginVertical

    Begin a vertical group and get its rect back.
    開始一個垂直組並獲取它的返回矩形。

  • EndVertical

    Close a group started with BeginVertical
    結束一個由BeginVertical開始的組。

  • BeginScrollView

    Begin an automatically layouted scrollview.
    開始一個自動佈局滾動檢視。

  • EndScrollView

    Ends a scrollview started with a call to BeginScrollView.
    結束一個由BeginScrollView開始的滾動檢視。

 

 

現在我們使用EditorGUILayout和EditorGUI在視窗中新增幾個輸入框如下:

 你會發現EditorGUILayout這個佈局類控制元件將自動水平拉伸佈滿整個視窗的寬度,每個控制元件佔一大行。這是這個UI佈局類的特點。如果不想佈滿整個寬度,或者一行有多個控制元件,我們可以使用EditorGUILayout佈局方法或者使用絕對位置佈局類EditorGUI來達到我們的要求。

 

2.編輯器介面佈局。

EditorGUILayout的水平和垂直佈局混合使用

  • BeginHorizontal

    Begin a horizontal group and get its rect back.
    開始一個水平組並獲取返回矩形。

  • EndHorizontal

    Close a group started with BeginHorizontal
    關閉一個BeginHorizontal開始的組。

  • BeginVertical

    Begin a vertical group and get its rect back.
    開始一個垂直組並獲取它的返回矩形。

  • EndVertical

1)水平和垂直佈局

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class WinTest : EditorWindow
{
    public GameObject go;
    SerializedProperty serializedProperty;
    SerializedObject serializedObject;
    [MenuItem("test/win")]
    static void show()
    {
        EditorWindow.GetWindow<WinTest>().Show();
    }
    string tagStr = "dd";
    string tagStr1 = "dd1";
    Object source;
    void OnGUI()
    {
        //垂直佈局
        EditorGUILayout.BeginVertical("垂直佈局");
        {
            EditorGUILayout.TextField("1");
            EditorGUILayout.TextField("2");
        }
        //水平佈局
        EditorGUILayout.BeginHorizontal("3");
        {
            EditorGUILayout.TextField("4");
            EditorGUILayout.TextField("5");
        }
        EditorGUILayout.EndVertical();

        //巢狀佈局
        EditorGUILayout.BeginVertical("垂直佈局");
        {
            EditorGUILayout.BeginHorizontal("水平佈局");
            {
                EditorGUILayout.TextField("6");
                EditorGUILayout.TextField("7");
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.BeginHorizontal("水平佈局");
            {
                EditorGUILayout.TextField("8");
                EditorGUILayout.TextField("9");
                //EditorGUILayout.BeginVertical("垂直佈局");
                //{
                //    EditorGUILayout.TextField("10");
                //    EditorGUILayout.TextField("11");
                //}
            }
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.TextField("12");
            EditorGUILayout.TextField("13");
        }
        EditorGUILayout.EndVertical();

        EditorGUILayout.TextField("15");
        EditorGUILayout.TextField("16");
    }

}

2.EditorGUI

程式碼:

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class WinTest : EditorWindow
{
    public GameObject go;
    SerializedProperty serializedProperty;
    SerializedObject serializedObject;
    [MenuItem("test/win")]
    static void show()
    {
        EditorWindow.GetWindow<WinTest>().Show();
    }
    string tagStr = "dd";
    string tagStr1 = "dd1";
    Object source;
    void OnGUI()
    {
        EditorGUI.TextField(new Rect(0,20,200,20), "手動佈局-->EditorGUI"); //編輯器使用
        EditorGUI.TextField(new Rect(0, 60, 200, 20), "手動佈局-->EditorGUI"); //編輯器使用
    }
}

 

打組,控制是否可編輯

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class WinTest : EditorWindow
{
    public GameObject go;
    SerializedProperty serializedProperty;
    SerializedObject serializedObject;
    [MenuItem("test/win")]
    static void show()
    {
        EditorWindow.GetWindow<WinTest>().Show();
    }
    bool isClose;
    void OnGUI()
    {
        isClose = EditorGUILayout.BeginToggleGroup("打組", isClose);
        {
            EditorGUILayout.TextField("1");
            EditorGUILayout.TextField("2");
            EditorGUILayout.TextField("4");
            EditorGUILayout.TextField("5");
            EditorGUILayout.TextField("6");
            EditorGUILayout.TextField("7");
        }
        EditorGUILayout.EndFadeGroup();
    }
}

效果

 

滑動效果

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class WinTest : EditorWindow
{
    [MenuItem("test/win")]
    static void show()
    {
        EditorWindow.GetWindow<WinTest>().Show();
    }
    Vector2 pos;
    void OnGUI()
    {
        pos = EditorGUILayout.BeginScrollView(pos);
        {
            EditorGUILayout.TextField("1");
            EditorGUILayout.TextField("2");
            EditorGUILayout.TextField("4");
            EditorGUILayout.TextField("5");
            EditorGUILayout.TextField("6");
            EditorGUILayout.TextField("7");
            EditorGUILayout.TextField("8");
            EditorGUILayout.TextField("9");
            EditorGUILayout.TextField("10");
        }

        EditorGUILayout.EndScrollView();
    }
}

效果:

另外還有個空行方法

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

public class WinTest : EditorWindow
{
    [MenuItem("test/win")]
    static void show()
    {
        EditorWindow.GetWindow<WinTest>().Show();
    }
    Vector2 pos;
    void OnGUI()
    {
        EditorGUILayout.TextField("9");
        EditorGUILayout.Space();
        EditorGUILayout.TextField("10");
    }
}

 

效果