0
点赞
收藏
分享

微信扫一扫

【解决】Unity 编辑器内打开场景出现引擎崩溃问题

在Assets文件夹路径下任意位置创建Editor文件夹,将扩展编辑器的代码放在Editor文件夹下


生成编辑器窗口

代码中首先引用命名空间

using UnityEditor;

然后将创建的类继承自EditorWindow

public class MenuEditor : EditorWindow

然后通过扩展编辑器菜单功能调用创建窗口的方法

[MenuItem("MainMenu/ShowWindows")]
static void ShowWindow()
{
    GetWindow<MenuEditor>();
}

要注意方法中泛型参数需要传入的是自己代码的类,这个功能是根据后面OnGUI方法中的具体逻辑生成一个窗口,如果没有OnGUI函数或者OnGUI函数是空,只会打开一个空白窗口。


OnGUI函数编辑窗口内容

全部的编辑窗口的内容全部都需要写在OnGUI事件函数中,生成窗口时会根据OnGUI函数中的具体逻辑来生成窗口中的内容,以下全部内容均需要卸载OnGUI函数中

public void OnGUI(){ }

GUILayoutOption 窗体大小参数

编辑窗口内容的时候大部分都会遇到一个params GUILayoutOption[] options的参数,这个参数中需要传入的GUILayoutOption类型,通常情况为

GUILayout.Width(100), GUILayout.Height(100)

也就是设置窗体的长度与高度,Width为长度,Height为高度 


EditorGUILayout类


BeginFoldoutHeaderGroup 创建折叠标签页

public static bool BeginFoldoutHeaderGroup(bool foldout, string content)

第一个参数为默认状态下标签页是否折叠

第二个参数为标签页的名字

返回的参数是标签页的折叠状态

注意点有两个:

1.需要在标签页中显示的内容需要用if语句判断返回值,然后将标签页中的内容写在if语句中。

2.想要结束标签页时需要调用EditorGUILayout.EndFoldoutHeaderGroup()方法

示例代码:

    bool showGroup;
    public void OnGUI()
    {
        showGroup = EditorGUILayout.BeginFoldoutHeaderGroup(showGroup,"ShowGroup");
        if (showGroup)
        {
            GUILayout.Label("YourShowGroupNow");
        }
        EditorGUILayout.EndFoldoutHeaderGroup();
    }

Foldout 创建折叠标签页(功能同上)

public static bool Foldout(bool foldout, string content, GUIStyle style = EditorStyles.foldout);

第一个参数是初始状态是否折叠,需要和返回值变量相同,不能是常量

第二个参数是标签的文字内容

返回值为当前标签页是否为折叠状态,需要与第一个参数变量相同

注意点有两点:

1.需要在标签页中显示的内容需要用if语句判断返回值,然后将标签页中的内容写在if语句中。

2.与BeginFoldoutHeaderGroup功能的区别是不再需要使用End方法结束标签页,更为智能化。

示例代码:

    bool showFoldout;
    public void OnGUI()
    {
        showFoldout = EditorGUILayout.Foldout(showFoldout, "展示折叠内容");
        if (showFoldout)
        {
            GUILayout.Label("折叠内容");
        }
    }

 


InspectorTitlebar展示属性折叠标签页

public static bool InspectorTitlebar(bool foldout, Object targetObj);

参数一为初始折叠状态,需要和返回值为变量相同,不能为常量

参数二为获取场景中任意物体的任意属性,并将属性显示在折叠框上

返回值为折叠页的折叠状态,需要和参数一为相同变量

注意点有两点:

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 创建滚动视图

public static Vector2 BeginScrollView(Vector2 scrollPosition, params GUILayoutOption[] options);

第一个参数为传入任意Vector2的值,传入的值必须是函数返回的值

第二个参数为GUILayoutOption类型,根据参数传入设置窗口大小

返回值必须要与参数一传入的变量相同,否则无法实现滚动,代码中不需要使用返回值

注意点有两个:

1.方法的第一个参数和返回值必须是同一个全局变量,不能是常量,不能是局部变量

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 创建可勾选激活区域

public static bool BeginToggleGroup(string label, bool toggle);

第一个参数为勾选框中的文字

第二个参数为勾选框的初始勾选状态

返回值为当前勾选框是否被勾选

注意点有两个:

1.通过勾选框判断是否需要激活的内容需要用if语句判断返回的bool值,然后将可激活内容写在if语句中。

2.想结束区域时需要调用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);

第一个参数为标签的名字

第二个参数为设置初始的颜色,需要和返回值的变量相同

第三个参数为设置标签的长度高度数值,可以不传入

返回值为设置好的颜色,需要与第二个参数的变量相同

注意点有一个:

1.颜色值设置完后不会保存,每次重新打开后颜色会重置,需要在打开颜色窗口前先获取场景中对应位置的颜色给参数二变量赋予颜色初始值,才能拥有初始颜色

示例代码:

    Color color;
    public void OnGUI()
    {
        color = EditorGUILayout.ColorField("设置颜色", color);
    }

FloatField 输入Float类型标签

public static float FloatField(string label, float value, params GUILayoutOption[] options);

第一个参数标签的名字

第二个参数输入float的初始值,需要和返回值变量相同,不能是常量

第三个参数设置标签的长度和高度,可以不传入

返回值输入的float类型数据,需要和第二个参数变量相同

注意点有一个:

1.float值输入完后不会储存,需要打开窗口前先获取场景中需要的float值

示例代码:

    float mainfloat;
    public void OnGUI()
    {
        mainfloat = EditorGUILayout.FloatField("输入浮点数", mainfloat);
    }

IntField 输入Int类型标签

public static int IntField(string label, int value, params GUILayoutOption[] options);

第一个参数标签的名字

第二个参数输入int的初始值,需要和返回值变量相同,不能是常量

第三个参数设置标签的长度和高度,可以不传入

返回值输入的int类型数据,需要和第二个参数变量相同

注意点有一个:

1.int值输入完后不会储存,需要打开窗口前先获取场景中需要的int值

示例代码:

    int mainInt;
    public void OnGUI()
    {
        mainInt = EditorGUILayout.IntField("输入整数", mainInt);
    }

TextField 输入String类型标签

public static string TextField(string label, string text, params GUILayoutOption[] options);

第一个参数为标签的名字

第二个参数为输入框中初始的文字,需要和返回值变量相同,不能是常量

第三个参数为设置标签的长度和高度,可以不传入

返回值为输入框中的文本内容,需要和第二个参数的变量相同

注意点有一个:

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

第一个参数为标签的文本内容

第二个参数为默认选择的选项,需要和返回值变量相同,不能是常数

第三个参数为字符串数组,数组中字符串的内容为下拉框中显示的的内容

返回值为下拉框选择的选项,需要和第二个参数变量相同

注意点有一个:

返回值的类型为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);

第一个参数为标签的名字

第二个参数为设置枚举的初始值,需要和返回值为相同变量,不能是常量

第三个参数为设置标签的长度和高度,可以不传

返回值为标签设置的枚举值,返回值需要强制转换

注意点有两个:

1.函数的返回值为通用枚举的Enum类型,需要在函数前添加强制转换符号,将返回值强制转换为需要的枚举值类型,然后保存到参数二变量的返回值中。

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

第一个参数为提示框中需要提示的内容

第二个参数为提示的类型,关系到提示框前面的图标

示例代码:

    public void OnGUI()
    {
        EditorGUILayout.HelpBox("None", MessageType.None);
        EditorGUILayout.HelpBox("Info", MessageType.Info);
        EditorGUILayout.HelpBox("Warning", MessageType.Warning);
        EditorGUILayout.HelpBox("Error", MessageType.Error);
    }

IntSlider 滑动条设置整数

public static int IntSlider(string label, int value, int leftValue, int rightValue, params GUILayoutOption[] options);

第一个参数为标签展示的文字

第二个参数为滑动条的初始值,需要和返回值变量相同,不能是常量

第三个参数为滑动条的最小值

第四个参数为滑动条的最大值

返回值为滑动条设置的整数值,需要和参数二的变量相同

注意点有一个:

1.int值设置完后不会储存,需要打开窗口前先获取场景中需要的int值

示例代码:

    int mainInt;
    public void OnGUI()
    {
        mainInt = EditorGUILayout.IntSlider("滑动条设置整数",mainInt,0,10);
    }

 


Slider滑动条设置浮点数

public static float Slider(string label, float value, float leftValue, float rightValue, params GUILayoutOption[] options);

第一个参数是标签的文本内容

第二个参数是标签的初始值,需要和返回值的变量相同,不能是常量

第三个参数为滑动条的最小值

第四个参数为滑动条的最大值

第五个参数为设置标签的长度与高度,可以不传入

注意点有一个:

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

第一个参数为需要显示的字段

第二个参数可传入第二个需要显示的字段

第三个参数可以设置标签的长度与高度,可以不传

示例代码:

    public void OnGUI()
    {
        EditorGUILayout.LabelField("获取当前时间");
        EditorGUILayout.LabelField("当前时间", DateTime.Now.ToString());
    }

LayerField设置图层标签

public static int LayerField(string label, int layer, params GUILayoutOption[] options);

第一个参数为标签的文本内容

第二个参数为默认选择的图层,需要和返回值变量相同,不能是常量

第三个参数为设置标签的长度和高度,可以不传

返回值为选择的图层,需要和第二个参数变量相同

示例代码:

    int getLayer;
    public void OnGUI()
    {
        getLayer = EditorGUILayout.LayerField("选择图层", getLayer);
    }

LinkButton外置链接字段

public static bool LinkButton(string label, params GUILayoutOption[] options);

第一个参数为标签的文本内容

第二个参数为标签的长度和高度,可以不传入

返回值为是否点击该链接,点击后仅点击的一帧返回true,其余时间返回false

注意点有一个:

1.需要在if中判断返回值并在逻辑中打开链接,返回值仅在点击时执行一次

示例代码:

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

第一个参数为标签的文本内容

第二个参数为默认选择的选项,必须和返回值的变量相同,不能为常量

第三个参数为需要复选的全部选项

第四个参数为设置标签框的长度和高度,可以不传入

返回值为复选框中选择的选项,通过图层公式计算获得的值

注意点有一个:

1.返回值并不是选择字符串的数组,而是一个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);

第一个参数为标签的文本内容

第二个参数为标签最小值的初始值,需要使用ref并被函数改变

第三个参数为标签最大值的初始值,需要使用ref并被函数改变

第四个参数为标签最小值的限制值

第五个参数为标签最大值的限制值

第六个参数为设置标签的长度和高度,可以不传入

不是很好用,不推荐使用,这里仅作科普

示例代码:

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

第一个参数为标签的文本内容

第二个参数为场景资源的值,资源的类型需要与第三个参数指定的类型相同

第三个参数为指定资源的类型,如果想要指定只能传入Transform属性,就可以在第三个参数中传入typeof(Transform),如果只能传入BoxCollider,那么就在第三个参数中传入typeof(BoxCollider)

第四个参数为是否可以指定场景中的资源,如果设置为false则只能指定Asstes文件夹中的文件资源,设置为true则可以指定Scene中的场景资源

注意点有五个:

1.虽然方法中参数和返回值均为Object类型,不过使用中均不使用Object类型的变量

2.传入的第二个参数的类型需要和第三个参数中指定的类型一致

3.返回值的类型需要和第三个参数中指定的类型一致

4.返回值赋值给变量前需要先进行强制转换,强制转换的类型需要和第三个参数的类型相同

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

第一个参数为标签的文本内容

第二个参数为初始出入的字符,需要和返回值变量相同,不能是常量

第三个参数为设置标签的长度和高度,可以不传入

返回值为密码框输入的内容,需要和第二个参数变量相同

示例代码:

    string password;
    public void OnGUI()
    {
        password = EditorGUILayout.PasswordField("输入密码", password);
    }

SelectableLabel 可选中字段标签

public static void SelectableLabel(string text, params GUILayoutOption[] options);

第一个参数为标签的文本内容

第二个参数为标签的长度和高度,可以不传入

注意点有一个:

1.功能与LabelField相同,均为显示字段,但是与LabelField的区别是SelectableLabel显示的字段可以被选中,可以被复制,但是LabelField显示的字段不行

示例代码:

    public void OnGUI()
    {
        EditorGUILayout.LabelField("显示标签");
        EditorGUILayout.SelectableLabel("显示标签");
    }

Space 添加标签间的间隔

public static void Space(float width);

第一个参数为间隔的长度,可以不传入默认为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);

第一个参数为标签的文本内容

第二个参数为默认选择的标签,需要与返回值变量相同,不能是常量

返回值为选择的标签,需要与第二个参数相同

注意点有一个:

1.选择的标签不会保存,每次使用的时候需要先获取目标物体的标签并赋值

示例代码:

    string selectTag;
    public void OnGUI()
    {
        selectTag = EditorGUILayout.TagField("选择标签", selectTag);
    }

TextArea可编辑文字区域

public static string TextArea(string text, params GUILayoutOption[] options);

第一个参数为文本区域中显示的内容,如果内容需要编辑则需要与返回值的变量相同,如果内容仅提供复制功能不需要编辑则使用常量参数或者不获取返回值(仅复制推荐使用SelectableLabel)

第二个参数为设置标签的长度和高度,可以不传入

注意点有一个:

1.返回值与第一个参数相等时,编辑的文本将会仅当时保存,再次打开窗口时文本将重置,返回值与第一个参数不相等时,编辑的文本将永远无法保存。

示例代码:

    string showText = "这是一段文本内容\n你可以随意编辑这段话\n同时也可以复制这段话\n或者其他地方的内容粘贴到这里";
    public void OnGUI()
    {
        showText = EditorGUILayout.TextArea(showText);
    }

Toggle勾选框(右侧)

public static bool Toggle(string label, bool value, params GUILayoutOption[] options);

第一个参数为标签的文本内容

第二个参数为当前标签是否为选中状态,需要和返回值变量相同,不能是常量

第三个参数为当前标签的长度与高度,可以不传入

注意点有一个:

1.勾选框的内容不会保存,每次使用之前需要先获取场景中对应的bool值

示例代码:

    bool isSelect;
    public void OnGUI()
    {
        isSelect = EditorGUILayout.Toggle("勾选框",isSelect);
    }

ToggleLeft 勾选框(左侧)

public static bool ToggleLeft(string label, bool value, params GUILayoutOption[] options);

第一个参数为标签的文本内容

第二个参数为当前标签是否为选中状态,需要和返回值变量相同,不能是常量

第三个参数为标签的长度与高度,可以不传入

注意点有两个:

1.勾选框的内容不会保存,每次使用之前需要先获取场景中对应的bool值

2.与Toggle的用法和功能完全相同,唯一的区别就是勾选框在左侧

示例代码:

    bool isSelect;
    public void OnGUI()
    {
        isSelect = EditorGUILayout.ToggleLeft("勾选框",isSelect);
    }

Vector2Field输入Vector2数值标签

public static Vector2 Vector2Field(string label, Vector2 value, params GUILayoutOption[] options);

第一个参数为标签的文本内容

第二个参数为Vector2的初始值,需要和返回值相同,不能是常量

第三个参数为标签的长度和高度,可以不传入

注意点有一个:

1.输入Vector2的内容不会保存,每次使用之前需要先获取场景中对应的Vector2的数值

示例代码:

    Vector2 mainVector;
    public void OnGUI()
    {
        mainVector = EditorGUILayout.Vector2Field("输入Vector2值", mainVector);
    }

Vector3Field输入Vector3数值标签

public static Vector3 Vector3Field(string label, Vector3 value, params GUILayoutOption[] options);

第一个参数为标签的文本内容

第二个参数为Vector3的初始值,需要和返回值相同,不能是常量

第三个参数为标签的长度和高度,可以不传入

注意点有一个:

1.输入Vector3的内容不会保存,每次使用之前需要先获取场景中对应的Vector3的数值

示例代码:

    Vector3 mainVector;
    public void OnGUI()
    {
        mainVector = EditorGUILayout.Vector3Field("输入Vector3值", mainVector);
    }

Vector4Field输入Vector4数值标签

第一个参数为标签的文本内容

第二个参数为Vector4的初始值,需要和返回值相同,不能是常量

第三个参数为标签的长度和高度,可以不传入

注意点有一个:

1.输入Vector4的内容不会保存,每次使用之前需要先获取场景中对应的Vector4的数值

示例代码:

    Vector4 mainVector;
    public void OnGUI()
    {
        mainVector = EditorGUILayout.Vector4Field("输入Vector4值", mainVector);
    }
举报

相关推荐

0 条评论