前言
首先,對於編輯器中的GUI系統,我們可以分爲四大類:
1、UnityEngine.GUI
2、UnityEngine.GUILayout
3、UnityEditor.EditorGUI
4、UnityEditor.EditorGUILayout
GUI系統
這是運用最廣泛的GUI系統,所屬命名空間UnityEngine,用其繪製的所有控件不帶有自動佈局效果,需要手動指定每個控件的繪製位置和大小,自適應性較弱,但開發自由度較高。
注意:GUI系統可以在發佈後使用,也可以在編輯器中使用。
GUI系統的控件使用例子
private void OnGUI()
{
GUI.Button(new Rect(0, 0, 100, 30), "Button");
GUI.Label(new Rect(100, 0, 100, 30), "Label");
GUI.PasswordField(new Rect(0, 30, 100, 30), "Password", '$');
GUI.Toggle(new Rect(100, 30, 100, 30), true, "Toggle");
}
GUILayout系統
帶自動佈局的GUI系統,所屬命名空間UnityEngine,用其繪製的所有控件都帶有自動佈局效果,自適應性較強,但開發自由度較低。
注意:GUILayout系統可以在發佈後使用,也可以在編輯器中使用。
GUILayout系統的控件使用例子
水平佈局
private void OnGUI()
{
GUILayout.BeginHorizontal("Box"); //開始一個水平佈局
GUILayout.Button("Button");
GUILayout.Label("Label");
GUILayout.PasswordField("Password", '$');
GUILayout.Toggle(true, "");
GUILayout.EndHorizontal(); //結束一個水平佈局
GUILayout.BeginHorizontal("Box"); //開始一個水平佈局
GUILayout.Button("Button");
GUILayout.Label("Label");
GUILayout.PasswordField("Password", '$');
GUILayout.Toggle(true, "");
GUILayout.FlexibleSpace(); //創建一個自適應的空白區域,也即是填滿本次佈局中的這部分空間
GUILayout.EndHorizontal(); //結束一個水平佈局
GUILayout.BeginHorizontal("Box"); //開始一個水平佈局
GUILayout.FlexibleSpace(); //創建一個自適應的空白區域,也即是填滿本次佈局中的這部分空間
GUILayout.Button("Button");
GUILayout.Label("Label");
GUILayout.PasswordField("Password", '$');
GUILayout.Toggle(true, "");
GUILayout.EndHorizontal(); //結束一個水平佈局
}
垂直佈局
private void OnGUI()
{
GUILayout.BeginVertical("Box"); //開始一個垂直佈局
GUILayout.Button("Button");
GUILayout.Label("Label");
GUILayout.PasswordField("Password", '$');
GUILayout.Toggle(true, "");
GUILayout.EndVertical(); //結束一個垂直佈局
}
private void OnGUI()
{
GUILayout.BeginVertical("Box"); //開始一個垂直佈局
GUILayout.FlexibleSpace(); //創建一個自適應的空白區域,也即是填滿本次佈局中的這部分空間
GUILayout.Button("Button");
GUILayout.Label("Label");
GUILayout.PasswordField("Password", '$');
GUILayout.Toggle(true, "");
GUILayout.EndVertical(); //結束一個垂直佈局
}
滾動視野
private Vector2 _scroll;
private void OnGUI()
{
_scroll = GUILayout.BeginScrollView(_scroll);//開始一個滾動視野
GUILayout.BeginVertical("Box"); //開始一個垂直佈局
for (int i = 0; i < 20; i++)
{
GUILayout.Button("Button" + (i + 1));
}
GUILayout.EndVertical(); //結束一個垂直佈局
GUILayout.EndScrollView(); //結束一個滾動視野
}
EditorGUI系統
適用於編輯器的GUI系統,所屬命名空間UnityEditor,用其繪製的所有控件不帶有佈局效果,需要手動指定每個控件的繪製位置和大小,跟GUI系統的差別是其擁有部分編輯器專用控件,且其只能運行在編輯器內,自適應性較弱,但開發自由度較高。
注意:EditorGUI系統不可以在發佈後使用,只能在編輯器中使用。
###EditorGUI系統的控件使用例子
private void OnGUI()
{
EditorGUI.ColorField(new Rect(0, 0, 100, 30), Color.red);
EditorGUI.DoubleField(new Rect(0, 30, 100, 30), 10);
EditorGUI.ProgressBar(new Rect(0, 60, 100, 30), 0.5f, "ProgressBar");
}
1
2
3
4
5
6
EditorGUILayout系統
帶自動佈局的EditorGUI系統,所屬命名空間UnityEditor,用其繪製的所有控件都帶有自動佈局效果,跟GUILayout系統的差別是其擁有部分編輯器專用控件,且其只能運行在編輯器內,自適應性較強,但開發自由度較低。
注意:EditorGUILayout系統不可以在發佈後使用,只能在編輯器中使用。
###EditorGUILayout系統的控件使用例子
private void OnGUI()
{
EditorGUILayout.BeginHorizontal("Box"); //開始一個水平佈局
EditorGUILayout.LabelField("LabelField");
EditorGUILayout.PasswordField("PasswordField");
EditorGUILayout.RectField(Rect.zero);
EditorGUILayout.EndHorizontal(); //結束一個水平佈局
}
以上四個GUI系統可以混用,EditorGUI和EditorGUILayout系統中的控件多是帶Field,可見其用意主要是用來展示字段的值,GUI系統由於不帶佈局,所以在編輯器開發中使用的較少,除非有時候需要創建高自由度的界面時會首選他,GUILayout系統開發編輯器工具是使用得最多的。