汇总一些Unity Editor开发的常用方法和实现方式,会持续更新。

添加自定义菜单栏方法

using UnityEngine;
using UnityEditor;

public class EditorTools : EditorWindow
{
    [MenuItem("EditorTools/自定义的编辑器方法")]
    public static void CustomEditroFunction()
    {
        Debug.Log("Here is your code...");
    }
}

如图一,添加自定义的菜单栏需要使用UnityEditor的命名空间,我们自定义的EditorTools类需要继承EditorWindow类。然后就是定义菜单栏点击后所执行的具体函数CustomEditroFunction,这里需要注意的是函数需要是静态函数,需要增加static关键字。MenuItem方法则是定义菜单栏的路径,菜单栏路径可以采用中文。图二则是自定义菜单栏的效果。

EditorWindow类文档连接:https://docs.unity3d.com/cn/2022.2/ScriptReference/EditorWindow.html

添加Project自定义菜单栏方法

using UnityEngine;
using UnityEditor;

public class ProjectEditorTools : EditorWindow
{
    [MenuItem("Assets/自定义的编辑器方法", priority = 0)]
    public static void CustomEditroFunction()
    {
        Debug.Log("Here is your code...");
    }
}

在Project窗口添加自定义菜单栏需要MenuItem方法以Assets为起始,自定义的菜单栏也会在顶部菜单栏Assets页签下显示。

添加Hierarchy自定义菜单栏方法

using UnityEngine;
using UnityEditor;

public class HierarchyEditorTools : EditorWindow
{
    [MenuItem("GameObject/自定义的编辑器方法", priority = 0)]
    public static void CustomEditorFunction()
    {
        Debug.Log("Here is your code...");
    }
}

 在Hierarchy窗口右键菜单添加自定义菜单栏需要MenuItem方法的路径以GameObject起始,如上面示例代码。添加方法后除了Hierarchy会显示自定义的菜单栏,在顶部GameObject下也会显示自定义的菜单栏。

 MenuItem文档连接:https://docs.unity3d.com/cn/2022.2/ScriptReference/MenuItem.html

添加Inspector中脚本自定义方法

using UnityEngine;
using UnityEngine.UI;
using UnityEditor;

[CustomEditor(typeof(Text), true)]
public class TextEditor : Editor
{
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        CustomTextFunction();
    }

    private void CustomTextFunction()
    {
        if (GUILayout.Button("清空内容"))
        {
            Text text = (Text)target;
            text.text = string.Empty;
        }
    }
}

这里我们为Unity原有的Text脚本增加功能按钮,添加自定义功能。

如图一,首先还是需要使用UnityEditor命名空间,自定义类TextEditor继承自Editor。通过覆写OnInspectorGUI方法实现Inspector中脚本的绘制,DrawDefaultInspector为绘制默认视图。接下来CustomTextFunction则是我们自定义的部分,通过GUILayout.Button("清空内容")方法绘制自定义按钮,if语句中则是点击按钮后的自定义功能,这里示例的则是清除了Text内容。实际效果如图二。

在示例代码中需要注意的是,[CustomEditor(typeof(Text), true)]指定了Inspector自定义脚本的类型,会为指定的自定义脚本添加功能。基类Editor包含成员target,通过target可以获取指定的脚本对象。

Editor类文档连接: https://docs.unity3d.com/cn/2022.2/ScriptReference/Editor.html

添加自定义窗口方法

using UnityEngine;
using UnityEditor;

public class CustomEditorWindow :EditorWindow
{
    [MenuItem("EditorTools/CustomEditorWindow")]
    public static void ShowCustomEditorWindow()
    {
        EditorWindow.GetWindowWithRect<CustomEditorWindow>(new Rect(0, 0, 300, 150), false, "CustomEditorWindow");
    }

    private void OnGUI()
    {
    }
}

如图一,这里我们创建了一个最简单的自定义窗口,自定义窗口类需要继承EditorWindow类,通过 EditorWindow.GetWindowWithRect 或者 EditorWindow.GetWindow 方法创建窗口。

EditorWindow.GetWindowWithRect 为创建固定尺寸的窗口。

EditorWindow.GetWindow 为创建动态尺寸的窗口,可以通过拖动右下角拉伸窗口尺寸。

OnGUI 方法用于绘制窗口内的各种组件,下一节将单独讲解。

EditorWindow类文档连接:https://docs.unity3d.com/cn/2022.2/ScriptReference/EditorWindow.html

GUILayout的常用方法

using UnityEngine;
using UnityEditor;

public class CustomEditorWindow : EditorWindow
{
    private string textField = "";
    private string textArea = "";

    [MenuItem("EditorTools/CustomEditorWindow")]
    public static void ShowCustomEditorWindow()
    {
        EditorWindow.GetWindowWithRect<CustomEditorWindow>(new Rect(0, 0, 300, 150), false, "CustomEditorWindow");
    }

    private void OnGUI()
    {
        GUILayout.Label("Hello World");
        textField = GUILayout.TextField(textField);
        textArea = GUILayout.TextArea(textArea);
        if (GUILayout.Button("点击按钮"))
        {
            Debug.LogError("按钮点击响应成功");
        }

    }
}

 这里我们来介绍一下GUILayout常用的方法。

GUILayout.Label:用于创建文本内容,支持多行显示,使用\n或者@“”等方式可以多行显示。

GUILayout.TextField:创建一个可编辑的单行文本框,到达最大长度后输入内容会超框。如图一需要创建一个成员变量存储输入内容。

GUILayout.TextArea:创建一个可编辑的多行文本框,到达最大长度后文本框会换行。同样输入内容需要成员变量存储。

GUILayout.Button:创建一个单击按钮,需要用if语句判断点击。按钮支持图片形式,可传入一个Texture类对象创建图片按钮。

using UnityEngine;
using UnityEditor;

public class HorizontalGUI : EditorWindow
{
    [MenuItem("EditorTools/HorizontalGUI")]
    public static void HorizontalGUIEnum()
    {
        EditorWindow.GetWindowWithRect<HorizontalGUI>(new Rect(0, 0, 500, 50), false, "HorizontalGUI");
    }

    private void OnGUI()
    {
        GUILayout.BeginHorizontal();

        if (GUILayout.Button("按钮1"))
        {
        }

        if (GUILayout.Button("按钮2"))
        {
        }

        GUILayout.Label("文本显示:一二三四五");

        GUILayout.EndHorizontal();
    }
}

GUILayout.BeginHorizontal:开始一个水平控件组,可将多个控件放在同一行。

GUILayout.EndHorizontal:结束一个水平控件组,BeginHorizontal的配套结束方法。

未完待续。

关于GUILayout更多细节可以查阅官方文档。

GUILayout类文档连接:https://docs.unity3d.com/cn/2022.2/ScriptReference/GUILayout.html

EditorUtility的常用方法

EditorUtility.OpenFilePanel:显示“打开文件”对话框并返回所选的路径名称。

EditorUtility.OpenFolderPanel:显示“打开文件夹”对话框并返回所选的路径名称。

EditorUtility.RevealInFinder:打开指定目录文件夹

EditorUtility类文档连接:https://docs.unity3d.com/cn/2022.2/ScriptReference/EditorUtility.html

UnityEditor常用回调方法

UnityEditor.Callbacks.DidReloadScripts:重新加载脚本后,将此属性添加至方法以接收通知,并且DidReloadScripts可以添加参数以控制调用顺序。示例如下:

[UnityEditor.Callbacks.DidReloadScripts]
private static void OnDidReloadScriptsCallback()
{
    Debug.LogError("OnDidReloadScriptsCallback");
}

UnityEditor.Callbacks.DidReloadScripts文档链接:https://docs.unity3d.com/cn/2022.2/ScriptReference/Callbacks.DidReloadScripts.html

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐