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多出的幾個控制元件如下:
-
Make a small space between the previous control and the following.
在上一個控制元件和跟隨的控制元件之間,製作一個小的空距。 -
Begin a vertical group with a toggle to enable or disable all the controls within at once.
開始帶有開關按鈕的一個垂直組,在這裡立即啟用或禁用控制元件。 -
Close a group started with BeginToggleGroup
關閉BeginToggleGroup開始的組。 -
Begin a horizontal group and get its rect back.
開始一個水平組並獲取返回矩形。 -
Close a group started with BeginHorizontal
關閉一個BeginHorizontal開始的組。 -
Begin a vertical group and get its rect back.
開始一個垂直組並獲取它的返回矩形。 -
Close a group started with BeginVertical
結束一個由BeginVertical開始的組。 -
Begin an automatically layouted scrollview.
開始一個自動佈局滾動檢視。 -
Ends a scrollview started with a call to BeginScrollView.
結束一個由BeginScrollView開始的滾動檢視。
現在我們使用EditorGUILayout和EditorGUI在視窗中新增幾個輸入框如下:
你會發現EditorGUILayout這個佈局類控制元件將自動水平拉伸佈滿整個視窗的寬度,每個控制元件佔一大行。這是這個UI佈局類的特點。如果不想佈滿整個寬度,或者一行有多個控制元件,我們可以使用EditorGUILayout佈局方法或者使用絕對位置佈局類EditorGUI來達到我們的要求。
2.編輯器介面佈局。
EditorGUILayout的水平和垂直佈局混合使用
-
Begin a horizontal group and get its rect back.
開始一個水平組並獲取返回矩形。 -
Close a group started with BeginHorizontal
關閉一個BeginHorizontal開始的組。 -
Begin a vertical group and get its rect back.
開始一個垂直組並獲取它的返回矩形。
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");
}
}
效果