在Assets文件夾路徑下任意位置創(chuàng)建Editor文件夾,將擴展編輯器的代碼放在Editor文件夾下
生成編輯器窗口
代碼中首先引用命名空間
using UnityEditor;
然后將創(chuàng)建的類繼承自EditorWindow
public class MenuEditor : EditorWindow
然后通過擴展編輯器菜單功能調用創(chuàng)建窗口的方法
[MenuItem("MainMenu/ShowWindows")]
static void ShowWindow()
{
GetWindow<MenuEditor>();
}
要注意方法中泛型參數(shù)需要傳入的是自己代碼的類,這個功能是根據(jù)后面OnGUI方法中的具體邏輯生成一個窗口,如果沒有OnGUI函數(shù)或者OnGUI函數(shù)是空,只會打開一個空白窗口。
OnGUI函數(shù)編輯窗口內容
全部的編輯窗口的內容全部都需要寫在OnGUI事件函數(shù)中,生成窗口時會根據(jù)OnGUI函數(shù)中的具體邏輯來生成窗口中的內容,以下全部內容均需要卸載OnGUI函數(shù)中
public void OnGUI(){ }
GUILayoutOption 窗體大小參數(shù)
編輯窗口內容的時候大部分都會遇到一個params GUILayoutOption[]?options的參數(shù),這個參數(shù)中需要傳入的GUILayoutOption類型,通常情況為
GUILayout.Width(100), GUILayout.Height(100)
也就是設置窗體的長度與高度,Width為長度,Height為高度?
EditorGUILayout類
BeginFoldoutHeaderGroup 創(chuàng)建折疊標簽頁
public static bool?BeginFoldoutHeaderGroup(bool?foldout, string?content)
第一個參數(shù)為默認狀態(tài)下標簽頁是否折疊
第二個參數(shù)為標簽頁的名字
返回的參數(shù)是標簽頁的折疊狀態(tài)
注意點有兩個:
1.需要在標簽頁中顯示的內容需要用if語句判斷返回值,然后將標簽頁中的內容寫在if語句中。
2.想要結束標簽頁時需要調用EditorGUILayout.EndFoldoutHeaderGroup()方法
示例代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-859923.html
bool showGroup;
public void OnGUI()
{
showGroup = EditorGUILayout.BeginFoldoutHeaderGroup(showGroup,"ShowGroup");
if (showGroup)
{
GUILayout.Label("YourShowGroupNow");
}
EditorGUILayout.EndFoldoutHeaderGroup();
}
Foldout 創(chuàng)建折疊標簽頁(功能同上)
public static bool?Foldout(bool?foldout, string?content,?GUIStyle?style?= EditorStyles.foldout);
第一個參數(shù)是初始狀態(tài)是否折疊,需要和返回值變量相同,不能是常量
第二個參數(shù)是標簽的文字內容
返回值為當前標簽頁是否為折疊狀態(tài),需要與第一個參數(shù)變量相同
注意點有兩點:
1.需要在標簽頁中顯示的內容需要用if語句判斷返回值,然后將標簽頁中的內容寫在if語句中。
2.與BeginFoldoutHeaderGroup功能的區(qū)別是不再需要使用End方法結束標簽頁,更為智能化。
示例代碼:
bool showFoldout;
public void OnGUI()
{
showFoldout = EditorGUILayout.Foldout(showFoldout, "展示折疊內容");
if (showFoldout)
{
GUILayout.Label("折疊內容");
}
}
?
InspectorTitlebar展示屬性折疊標簽頁
public static bool?InspectorTitlebar(bool?foldout,?Object?targetObj);
參數(shù)一為初始折疊狀態(tài),需要和返回值為變量相同,不能為常量
參數(shù)二為獲取場景中任意物體的任意屬性,并將屬性顯示在折疊框上
返回值為折疊頁的折疊狀態(tài),需要和參數(shù)一為相同變量
注意點有兩點:
1.需要在標簽頁中顯示的內容需要用if語句判斷返回值,然后將標簽頁中的內容寫在if語句中。
2.折疊頁雖然獲取了屬性,但是不會顯示屬性的任何內容,如需要在折疊頁中顯示任何內容,均需要自己在if語句判斷返回值并手動添加標簽
示例代碼:
bool showMenu = true;
public void OnGUI()
{
Transform cube = GameObject.Find("Cube").transform;
showMenu = EditorGUILayout.InspectorTitlebar(showMenu,cube);
if (showMenu)
{
GUILayout.Label("展折疊內容");
}
}
BeginScrollView 創(chuàng)建滾動視圖
public static Vector2 BeginScrollView(Vector2 scrollPosition, params GUILayoutOption[] options);
第一個參數(shù)為傳入任意Vector2的值,傳入的值必須是函數(shù)返回的值
第二個參數(shù)為GUILayoutOption類型,根據(jù)參數(shù)傳入設置窗口大小
返回值必須要與參數(shù)一傳入的變量相同,否則無法實現(xiàn)滾動,代碼中不需要使用返回值
注意點有兩個:
1.方法的第一個參數(shù)和返回值必須是同一個全局變量,不能是常量,不能是局部變量
2.想要結束滾動視圖時需要調用EditorGUILayout.EndScrollView()方法
示例代碼:
Vector2 scrollViewPos;
public void OnGUI()
{
scrollViewPos = EditorGUILayout.BeginScrollView(scrollViewPos, GUILayout.Width(500),GUILayout.Height(100));
GUILayout.Label("This is a ScrollView !\nThis is a ScrollView !\nThis is a ScrollView !\nThis is a ScrollView !");
GUILayout.Label("This is a ScrollView !\nThis is a ScrollView !\nThis is a ScrollView !\nThis is a ScrollView !");
EditorGUILayout.EndScrollView();
}
BeginToggleGroup 創(chuàng)建可勾選激活區(qū)域
public static bool?BeginToggleGroup(string?label, bool?toggle);
第一個參數(shù)為勾選框中的文字
第二個參數(shù)為勾選框的初始勾選狀態(tài)
返回值為當前勾選框是否被勾選
注意點有兩個:
1.通過勾選框判斷是否需要激活的內容需要用if語句判斷返回的bool值,然后將可激活內容寫在if語句中。
2.想結束區(qū)域時需要調用EditorGUILayout.EndFoldoutHeaderGroup()方法
示例代碼:
bool showGroup;
public void OnGUI()
{
showGroup = EditorGUILayout.BeginFoldoutHeaderGroup(showGroup, "ShowGroup");
if (showGroup)
{
GUILayout.Label("YourShowGroupNow");
}
EditorGUILayout.EndFoldoutHeaderGroup();
}
ColorField 編輯顏色標簽
public static Color ColorField(string label, Color value, params GUILayoutOption[] options);
第一個參數(shù)為標簽的名字
第二個參數(shù)為設置初始的顏色,需要和返回值的變量相同
第三個參數(shù)為設置標簽的長度高度數(shù)值,可以不傳入
返回值為設置好的顏色,需要與第二個參數(shù)的變量相同
注意點有一個:
1.顏色值設置完后不會保存,每次重新打開后顏色會重置,需要在打開顏色窗口前先獲取場景中對應位置的顏色給參數(shù)二變量賦予顏色初始值,才能擁有初始顏色
示例代碼:
Color color;
public void OnGUI()
{
color = EditorGUILayout.ColorField("設置顏色", color);
}
FloatField 輸入Float類型標簽
public static float FloatField(string label, float value, params GUILayoutOption[] options);
第一個參數(shù)為標簽的名字
第二個參數(shù)為輸入float的初始值,需要和返回值變量相同,不能是常量
第三個參數(shù)為設置標簽的長度和高度,可以不傳入
返回值為輸入的float類型數(shù)據(jù),需要和第二個參數(shù)變量相同
注意點有一個:
1.float值輸入完后不會儲存,需要打開窗口前先獲取場景中需要的float值
示例代碼:
float mainfloat;
public void OnGUI()
{
mainfloat = EditorGUILayout.FloatField("輸入浮點數(shù)", mainfloat);
}
IntField 輸入Int類型標簽
public static int IntField(string?label, int?value, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的名字
第二個參數(shù)為輸入int的初始值,需要和返回值變量相同,不能是常量
第三個參數(shù)為設置標簽的長度和高度,可以不傳入
返回值為輸入的int類型數(shù)據(jù),需要和第二個參數(shù)變量相同
注意點有一個:
1.int值輸入完后不會儲存,需要打開窗口前先獲取場景中需要的int值
示例代碼:
int mainInt;
public void OnGUI()
{
mainInt = EditorGUILayout.IntField("輸入整數(shù)", mainInt);
}
TextField 輸入String類型標簽
public static string TextField(string label, string text, params GUILayoutOption[] options);
第一個參數(shù)為標簽的名字
第二個參數(shù)為輸入框中初始的文字,需要和返回值變量相同,不能是常量
第三個參數(shù)為設置標簽的長度和高度,可以不傳入
返回值為輸入框中的文本內容,需要和第二個參數(shù)的變量相同
注意點有一個:
1.string值輸入完后不會儲存,需要打開窗口前先獲取場景中需要的string值
示例代碼:
string mainString;
public void OnGUI()
{
mainString = EditorGUILayout.TextField("輸入字符串", mainString);
}
Popup 下拉框標簽
public static int Popup(string label, int selectedIndex, string[] displayedOptions, params GUILayoutOption[] options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為默認選擇的選項,需要和返回值變量相同,不能是常數(shù)
第三個參數(shù)為字符串數(shù)組,數(shù)組中字符串的內容為下拉框中顯示的的內容
返回值為下拉框選擇的選項,需要和第二個參數(shù)變量相同
注意點有一個:
返回值的類型為int,選中第一個選項時返回值為0,選擇第二個選項時返回值為1,選擇第三個選項時返回值為2,以此類推
示例代碼:
int mainInt;
public void OnGUI()
{
mainInt = EditorGUILayout.Popup("下拉框選擇",mainInt,new string[] { "A","B","C","D" });
}
EnumPopup 枚舉下拉框標簽
public static Enum?EnumPopup(string?label, Enum?selected, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的名字
第二個參數(shù)為設置枚舉的初始值,需要和返回值為相同變量,不能是常量
第三個參數(shù)為設置標簽的長度和高度,可以不傳
返回值為標簽設置的枚舉值,返回值需要強制轉換
注意點有兩個:
1.函數(shù)的返回值為通用枚舉的Enum類型,需要在函數(shù)前添加強制轉換符號,將返回值強制轉換為需要的枚舉值類型,然后保存到參數(shù)二變量的返回值中。
2.枚舉值設置完后不會儲存,需要打開窗口前先獲取場景中需要的枚舉值
示例代碼:
enum TestEnum
{
A, B, C, D
}
TestEnum testEnum = TestEnum.A;
public void OnGUI()
{
testEnum = (TestEnum)EditorGUILayout.EnumPopup("設置枚舉", testEnum);
}
HelpBox提示框
public static void HelpBox(string message, MessageType type);
第一個參數(shù)為提示框中需要提示的內容
第二個參數(shù)為提示的類型,關系到提示框前面的圖標
示例代碼:
public void OnGUI()
{
EditorGUILayout.HelpBox("None", MessageType.None);
EditorGUILayout.HelpBox("Info", MessageType.Info);
EditorGUILayout.HelpBox("Warning", MessageType.Warning);
EditorGUILayout.HelpBox("Error", MessageType.Error);
}
IntSlider 滑動條設置整數(shù)
public static int?IntSlider(string?label, int?value, int?leftValue, int?rightValue, params GUILayoutOption[]?options);
第一個參數(shù)為標簽展示的文字
第二個參數(shù)為滑動條的初始值,需要和返回值變量相同,不能是常量
第三個參數(shù)為滑動條的最小值
第四個參數(shù)為滑動條的最大值
返回值為滑動條設置的整數(shù)值,需要和參數(shù)二的變量相同
注意點有一個:
1.int值設置完后不會儲存,需要打開窗口前先獲取場景中需要的int值
示例代碼:
int mainInt;
public void OnGUI()
{
mainInt = EditorGUILayout.IntSlider("滑動條設置整數(shù)",mainInt,0,10);
}
?
Slider滑動條設置浮點數(shù)
public static float?Slider(string?label, float?value, float?leftValue, float?rightValue, params GUILayoutOption[]?options);
第一個參數(shù)是標簽的文本內容
第二個參數(shù)是標簽的初始值,需要和返回值的變量相同,不能是常量
第三個參數(shù)為滑動條的最小值
第四個參數(shù)為滑動條的最大值
第五個參數(shù)為設置標簽的長度與高度,可以不傳入
注意點有一個:
1.ifloat值設置完后不會儲存,需要打開窗口前先獲取場景中需要的float值
示例代碼:
float mainFloat;
public void OnGUI()
{
mainFloat = EditorGUILayout.Slider("滑動條",mainFloat,0,100);
}
LabelField顯示字段標簽
public static void?LabelField(string?label, params GUILayoutOption[]?options);
public static void?LabelField(string?label, string?label2, params GUILayoutOption[]?options);
第一個參數(shù)為需要顯示的字段
第二個參數(shù)可傳入第二個需要顯示的字段
第三個參數(shù)可以設置標簽的長度與高度,可以不傳
示例代碼:
public void OnGUI()
{
EditorGUILayout.LabelField("獲取當前時間");
EditorGUILayout.LabelField("當前時間", DateTime.Now.ToString());
}
LayerField設置圖層標簽
public static int?LayerField(string?label, int?layer, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為默認選擇的圖層,需要和返回值變量相同,不能是常量
第三個參數(shù)為設置標簽的長度和高度,可以不傳
返回值為選擇的圖層,需要和第二個參數(shù)變量相同
示例代碼:
int getLayer;
public void OnGUI()
{
getLayer = EditorGUILayout.LayerField("選擇圖層", getLayer);
}
LinkButton外置鏈接字段
public static bool?LinkButton(string?label, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為標簽的長度和高度,可以不傳入
返回值為是否點擊該鏈接,點擊后僅點擊的一幀返回true,其余時間返回false
注意點有一個:
1.需要在if中判斷返回值并在邏輯中打開鏈接,返回值僅在點擊時執(zhí)行一次
示例代碼:
bool openUrl;
public void OnGUI()
{
openUrl = EditorGUILayout.LinkButton("打開百度鏈接");
if (openUrl)
{
Application.OpenURL("www.baidu.com");
}
}
MaskField 復選框標簽
public static int?MaskField(string?label, int?mask, string[]?displayedOptions, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為默認選擇的選項,必須和返回值的變量相同,不能為常量
第三個參數(shù)為需要復選的全部選項
第四個參數(shù)為設置標簽框的長度和高度,可以不傳入
返回值為復選框中選擇的選項,通過圖層公式計算獲得的值
注意點有一個:
1.返回值并不是選擇字符串的數(shù)組,而是一個int值,這個int值計算的方式和Unity中圖層的復選框計算方式相同,第一個選項的值為1,第二個選項值為2,第三個選項值為4,第四個選項值為8,同時選擇AB的值為1+2=3,同時選擇ABC的值為1+2+4=7,同時選擇ACD的值為1+4+8 = 15?
示例代碼:
int mainMask;
public void OnGUI()
{
mainMask = EditorGUILayout.MaskField("設置遮罩",mainMask,new string[] { "A","B","C","D" });
}
MinMaxSlider 滑塊設置最大最小值
public static void?MinMaxSlider(string?label, ref float?minValue, ref float?maxValue, float?minLimit, float?maxLimit, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為標簽最小值的初始值,需要使用ref并被函數(shù)改變
第三個參數(shù)為標簽最大值的初始值,需要使用ref并被函數(shù)改變
第四個參數(shù)為標簽最小值的限制值
第五個參數(shù)為標簽最大值的限制值
第六個參數(shù)為設置標簽的長度和高度,可以不傳入
不是很好用,不推薦使用,這里僅作科普
示例代碼:
float minValue, maxValue;
public void OnGUI()
{
EditorGUILayout.LabelField("MinValue",minValue.ToString());
EditorGUILayout.LabelField("MaxValue",maxValue.ToString());
EditorGUILayout.MinMaxSlider("設置滑塊",ref minValue,ref maxValue,-100.0f,100.0f);
}
ObjectField 獲取場景資源標簽
public static Object?ObjectField(string?label,?Object?obj, Type?objType, bool?allowSceneObjects, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為場景資源的值,資源的類型需要與第三個參數(shù)指定的類型相同
第三個參數(shù)為指定資源的類型,如果想要指定只能傳入Transform屬性,就可以在第三個參數(shù)中傳入typeof(Transform),如果只能傳入BoxCollider,那么就在第三個參數(shù)中傳入typeof(BoxCollider)
第四個參數(shù)為是否可以指定場景中的資源,如果設置為false則只能指定Asstes文件夾中的文件資源,設置為true則可以指定Scene中的場景資源
注意點有五個:
1.雖然方法中參數(shù)和返回值均為Object類型,不過使用中均不使用Object類型的變量
2.傳入的第二個參數(shù)的類型需要和第三個參數(shù)中指定的類型一致
3.返回值的類型需要和第三個參數(shù)中指定的類型一致
4.返回值賦值給變量前需要先進行強制轉換,強制轉換的類型需要和第三個參數(shù)的類型相同
5.方法不僅能獲取Scene場景中的資源,也可以獲取Assets中的文件資源
示例代碼:
Transform mainTransform;
public void OnGUI()
{
mainTransform = (Transform)EditorGUILayout.ObjectField("選擇場景資源", mainTransform, typeof(Transform), true);
}
PasswordField密碼輸入框
public static string?PasswordField(string?label, string?password, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為初始出入的字符,需要和返回值變量相同,不能是常量
第三個參數(shù)為設置標簽的長度和高度,可以不傳入
返回值為密碼框輸入的內容,需要和第二個參數(shù)變量相同
示例代碼:
string password;
public void OnGUI()
{
password = EditorGUILayout.PasswordField("輸入密碼", password);
}
SelectableLabel 可選中字段標簽
public static void?SelectableLabel(string?text, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為標簽的長度和高度,可以不傳入
注意點有一個:
1.功能與LabelField相同,均為顯示字段,但是與LabelField的區(qū)別是SelectableLabel顯示的字段可以被選中,可以被復制,但是LabelField顯示的字段不行
示例代碼:
public void OnGUI()
{
EditorGUILayout.LabelField("顯示標簽");
EditorGUILayout.SelectableLabel("顯示標簽");
}
Space 添加標簽間的間隔
public static void?Space(float?width);
第一個參數(shù)為間隔的長度,可以不傳入默認為10
示例代碼:
public void OnGUI()
{
EditorGUILayout.LabelField("標簽一");
EditorGUILayout.LabelField("標簽二");
EditorGUILayout.Space();
EditorGUILayout.LabelField("標簽三");
EditorGUILayout.Space(20);
EditorGUILayout.LabelField("標簽四");
}
TagField 設置Tag屬性標簽
public static string TagField(string label, string tag, params GUILayoutOption[] options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為默認選擇的標簽,需要與返回值變量相同,不能是常量
返回值為選擇的標簽,需要與第二個參數(shù)相同
注意點有一個:
1.選擇的標簽不會保存,每次使用的時候需要先獲取目標物體的標簽并賦值
示例代碼:
string selectTag;
public void OnGUI()
{
selectTag = EditorGUILayout.TagField("選擇標簽", selectTag);
}
TextArea可編輯文字區(qū)域
public static string?TextArea(string?text, params GUILayoutOption[]?options);
第一個參數(shù)為文本區(qū)域中顯示的內容,如果內容需要編輯則需要與返回值的變量相同,如果內容僅提供復制功能不需要編輯則使用常量參數(shù)或者不獲取返回值(僅復制推薦使用SelectableLabel)
第二個參數(shù)為設置標簽的長度和高度,可以不傳入
注意點有一個:
1.返回值與第一個參數(shù)相等時,編輯的文本將會僅當時保存,再次打開窗口時文本將重置,返回值與第一個參數(shù)不相等時,編輯的文本將永遠無法保存。
示例代碼:
string showText = "這是一段文本內容\n你可以隨意編輯這段話\n同時也可以復制這段話\n或者其他地方的內容粘貼到這里";
public void OnGUI()
{
showText = EditorGUILayout.TextArea(showText);
}
Toggle勾選框(右側)
public static bool?Toggle(string?label, bool?value, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為當前標簽是否為選中狀態(tài),需要和返回值變量相同,不能是常量
第三個參數(shù)為當前標簽的長度與高度,可以不傳入
注意點有一個:
1.勾選框的內容不會保存,每次使用之前需要先獲取場景中對應的bool值
示例代碼:
bool isSelect;
public void OnGUI()
{
isSelect = EditorGUILayout.Toggle("勾選框",isSelect);
}
ToggleLeft 勾選框(左側)
public static bool?ToggleLeft(string?label, bool?value, params GUILayoutOption[]?options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為當前標簽是否為選中狀態(tài),需要和返回值變量相同,不能是常量
第三個參數(shù)為標簽的長度與高度,可以不傳入
注意點有兩個:
1.勾選框的內容不會保存,每次使用之前需要先獲取場景中對應的bool值
2.與Toggle的用法和功能完全相同,唯一的區(qū)別就是勾選框在左側
示例代碼:
bool isSelect;
public void OnGUI()
{
isSelect = EditorGUILayout.ToggleLeft("勾選框",isSelect);
}
Vector2Field輸入Vector2數(shù)值標簽
public static Vector2 Vector2Field(string label, Vector2 value, params GUILayoutOption[] options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為Vector2的初始值,需要和返回值相同,不能是常量
第三個參數(shù)為標簽的長度和高度,可以不傳入
注意點有一個:
1.輸入Vector2的內容不會保存,每次使用之前需要先獲取場景中對應的Vector2的數(shù)值
示例代碼:
Vector2 mainVector;
public void OnGUI()
{
mainVector = EditorGUILayout.Vector2Field("輸入Vector2值", mainVector);
}
Vector3Field輸入Vector3數(shù)值標簽
public static Vector3 Vector3Field(string label, Vector3 value, params GUILayoutOption[] options);
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為Vector3的初始值,需要和返回值相同,不能是常量
第三個參數(shù)為標簽的長度和高度,可以不傳入
注意點有一個:
1.輸入Vector3的內容不會保存,每次使用之前需要先獲取場景中對應的Vector3的數(shù)值
示例代碼:
Vector3 mainVector;
public void OnGUI()
{
mainVector = EditorGUILayout.Vector3Field("輸入Vector3值", mainVector);
}
Vector4Field輸入Vector4數(shù)值標簽
第一個參數(shù)為標簽的文本內容
第二個參數(shù)為Vector4的初始值,需要和返回值相同,不能是常量
第三個參數(shù)為標簽的長度和高度,可以不傳入
注意點有一個:
1.輸入Vector4的內容不會保存,每次使用之前需要先獲取場景中對應的Vector4的數(shù)值文章來源:http://www.zghlxwxcb.cn/news/detail-859923.html
示例代碼:
Vector4 mainVector;
public void OnGUI()
{
mainVector = EditorGUILayout.Vector4Field("輸入Vector4值", mainVector);
}
到了這里,關于Unity 擴展自定義編輯器窗口的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!