当前位置:   article > 正文

Unity 编辑器篇|(八)编辑器工具类(EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility) (全面总结 | 建议收藏)_unity 编辑器工具 editor window

unity 编辑器工具 editor window

1. EditorGUIUtility

1.1 参数总览

静态函数描述
AddCursorRect向控件添加自定义鼠标指针。
CommandEvent创建可以发送到另一个窗口的事件。
DrawColorSwatch绘制颜色样本。
DrawCurveSwatch绘制曲线样本。
DrawRegionSwatch绘制在两条 SerializedProperty 曲线之间具有填充区域的样本。
FindTexture从源文件名中获取纹理。
GetBuiltinSkin获取其中一个内置 GUI 皮肤,可以是按参数选择的游戏视图、检视面板或场景视图皮肤。
GetFlowLayoutedRects在给定区域中按从左到右、从上到下的方式布置字符串项的列表。
GetIconForObject获取与对象关联的自定义图标。只有 GameObjects 和 MonoScripts 具有关联的自定义图标。
GetIconSize获取已使用 SetIconSize 设置的大小。
GetMainWindowPosition返回 Unity 编辑器主窗口的位置。
GetObjectPickerControlID当前显示的 Object Picker 的 controlID。
GetObjectPickerObjectObject Picker 中当前选中的对象。
HasObjectThumbnail给定的类是否具有针对每个对象的缩略图?
IconContent从具有给定名称的 Unity 内置资源中获取 GUIContent。
IsDisplayReferencedByCameras检查是否有任何已启用的摄像机可以渲染到特定显示屏。
Load加载内置资源。
LoadRequired加载所需的内置资源。
LookLikeControls使所有 EditorGUI 看起来像常规控件。
ObjectContent返回具有某个 Object 的名称和图标的 GUIContent 对象。
PingObject在场景中对对象执行 Ping 操作,就像在检视面板中单击它一样。
PixelsToPoints从像素空间转换为点空间。
PointsToPixels从点空间转换为像素空间。
QueueGameViewInputEvent将输入事件发送到游戏中。
SetIconForObject设置与 GameObject 或 MonoScript 关联的自定义图标。自定义图标显示在场景视图和检查器中。
SetIconSize将渲染为 GUIContent 一部分的图标设置为以特定大小渲染。
SetMainWindowPosition设置 Unity 编辑器主窗口的位置。
ShowObjectPicker通过代码显示 Object Picker。

1.2 选中提示: PingObject

  • 在场景中对对象执行 Ping 操作,就像在检视面板中单击它一样。
    PingObject 将促使 Hierarchy 突出显示已执行 Ping 操作的对象。不必选择 已执行 Ping 操作的对象。例如,可以用于 GameObject.Find 来查找 要执行 Ping 操作的对象。
 [MenuItem("Examples/Ping Selected")]
 static void Ping()
 {
     if (!Selection.activeObject)
     {
         Debug.Log("Select an object to ping");
         return;
     }

     EditorGUIUtility.PingObject(Selection.activeObject);
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

1

1.3 搜索框: ShowObjectPicker

private Texture tex;
...
if (GUILayout.Button("查找法线贴图"))
{
    //参数释义
    //1. 查找对象的引用
    //2. 是否允许查找场景对象
    //3. 查找对象名称过滤(比如这里的normal是指文件名称中有normal的会被搜索到)
    //4. controlID, 默认写0
    EditorGUIUtility.ShowObjectPicker<Texture>(tex, false, "normal", 0);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

1

1.4 currentViewWidth

  • 这个值和position.width的值,它们近似相等
        if (GUILayout.Button("Test"))
        {
            Debug.Log(EditorGUIUtility.currentViewWidth);
            Debug.Log(this.position.width);
        }
  • 1
  • 2
  • 3
  • 4
  • 5

1.5 fieldWidth

  • 为 Editor GUI 控件字段保留的最小宽度(以像素为单位)。
    大多数 Editor GUI 控件由标签和控制字段本身组成。字段的最小宽度由 fieldWidth 值控制。字段通常看起来比最小宽度要宽,因为 Editor GUI 控件通常设置为占用一个 Rect,该 Rect 会扩展以填充可用的水平空间。在此 Rect 中,该字段将占用 EditorGUIUtility.labelWidth 未使用的所有空间。

1.6 labelWidth

  • 为 Editor GUI 控件标签保留的宽度(以像素为单位)。
    Editor GUI 控件为标签分配了特定的宽度。可通过将 labelWidth 设置为不同的值来更改此宽度。将其设置为 0 会将标签宽度重置为默认值。默认值可能有所不同,例如,取决于 Inspector 窗口的宽度。
EditorGUIUtility.labelWidth = 50;
EditorGUILayout.TextField("Label", "Text");
  • 1
  • 2

1.7 singleLineHeight

  • 获取用于单个 Editor 控件(如单行 EditorGUI.TextField 或 EditorGUI.Popup)的高度。
    当您创建自己的多行控件(例如具有多个字段的自定义类的控件)时,可以使用 EditorGUILayout.GetControlRect 并传入一个高度值,该值是 EditorGUIUtility.singleLineHeight 的倍数。这比硬编码特定像素值更可取。

1.8 IconContent

  • 从具有给定名称的 Unity 内置资源中获取 GUIContent。
    EditorGUIUtility.IconContent 用于为 GUI 元素创建 GUIContent。 只会加载图标.通常情况下,将使用第一个参数获取 Assets/Editor Default Resources/Icons 中的图标。 只需要图标的名称,而不需要 png 扩展名。 \ 第二个参数为悬停工具提示提供文本。此字符串 需要以竖线“|”字符开头以将其标记为工具提示。\ \ 注意:目前无法悬停定位在工具提示上方。

2. EditorUtility

2.1 参数总览

静态函数描述
ClearDefaultParentObjectC从特定场景或活动场景中清除默认父游戏对象。
ClearDirty清除 target 的“脏”标志。
ClearProgressBar删除进度条。
CollectDeepHierarchy收集层级视图中以每个指定对象为根对象的所有对象。
CollectDependencies计算并返回 roots 中列出的资源所依赖的所有资源的列表。
CompressCubemapTexture压缩立方体贴图纹理。
CompressTexture压缩纹理。
CopySerialized复制 Unity Object 的所有设置。
CopySerializedIfDifferent将 Unity Object 的所有设置复制到第二个 Object(如果两者不同)。
CopySerializedManagedFieldsOnly在不同的托管对象之间复制可序列化的字段。
CreateGameObjectWithHideFlags使用 HideFlags 和指定组件创建游戏对象。
DisplayCancelableProgressBar显示或更新含有 Cancel 按钮的进度条。
DisplayDialog此方法显示模态对话框。
DisplayDialogComplex显示含有三个按钮的模态对话框。
DisplayPopupMenu显示弹出菜单。
DisplayProgressBar显示或更新进度条。
FocusProjectWindow将 Project 窗口置于前面并聚焦该窗口。
FormatBytes返回有关字节数的文本。
GetDialogOptOutDecision此方法显示模态对话框,使用户可以选择不再次显示当前对话框。
GetDirtyCount返回一个整数,指示更改指定对象的序列化属性的次数。
GetObjectEnabled对象是否已启用(0 表示已禁用,1 表示已启用,-1 表示没有 Enabled 按钮)。
InstanceIDToObject将实例 ID 转换为对对象的引用。
IsDirty获取一个布尔值,指示指定对象自上次保存以来是否已更改。
IsPersistent确定对象是否存储在磁盘中。
IsRunningUnderCPUEmulation获取一个布尔值。该值指示您的 CPU 是否无法本机执行 Unity 并正在运行模拟版本。
IsUnityExtensionsInitialized返回一个布尔值,表示 Unity 扩展的初始化状态。
IsValidUnityYAML如果提供的字符串可以解析为 YAML,则返回 true。
NaturalCompare仿人类排序。
OpenFilePanel显示“打开文件”对话框并返回所选的路径名称。
OpenFilePanelWithFilters显示“打开文件”对话框并返回所选的路径名称。
OpenFolderPanel显示“打开文件夹”对话框并返回所选的路径名称。
OpenPropertyEditor打开对象的属性编辑器。
RequestScriptReloadUnity 编辑器会在下一帧上异步重新加载脚本程序集。这会重置所有脚本的状态,但是 Unity 不会编译任何自上次编译以来已更改的代码。
SaveFilePanel显示“保存文件”对话框并返回所选的路径名称。
SaveFilePanelInProject在项目的 Assets 文件夹中显示“保存文件”对话框并返回所选的路径名称。
SaveFolderPanel显示“保存文件夹”对话框并返回所选的路径名称。
SetCameraAnimateMaterials设置此摄像机以启用编辑器中的材质动画。
SetCameraAnimateMaterialsTime为此摄像机设置渲染时使用的全局时间。
SetCustomDiffTool设置自定义差异工具设置。
SetDefaultParentObject设置活动场景的默认父对象。
SetDialogOptOutDecision此方法显示模态对话框,使用户可以选择不再次显示当前对话框。
SetDirty将目标对象标记为脏。
SetObjectEnabled设置对象的启用状态。
SetSelectedRenderState为此渲染器将场景视图设置为所选的显示模式。
UnloadUnusedAssetsImmediate卸载未使用的资源。
UpdateGlobalShaderProperties更新渲染时使用的全局着色器属性。

2.2 “脏”标志:ClearDirty、IsDirty、SetDirty

  • Unity 使用“脏”标志查找必须保存到磁盘的已更改资源。如果对资源进行的更改无需保存(例如以后会恢复的临时更改)
  • ClearDirty: 使用ClearDirty清除“脏”标志。
  • IsDirty:判断是否带有“脏”标志。
  • SetDirty:将对象标记为脏。当您想要修改对象而不撤消时,可以使用SetDirty,但仍要确保更改已保存且不会丢失。如果对象是场景的一部分,则该场景被标记为脏。

2.3 进度条:ClearProgressBar、DisplayCancelableProgressBar、DisplayProgressBar

  • ClearProgressBar: 删除进度条。
  • DisplayCancelableProgressBar: 显示或更新含有 Cancel 按钮的进度条。
  • DisplayProgressBar: 显示或更新进度条。
using Unity.VisualScripting;
using Unity.VisualScripting.YamlDotNet.Core.Tokens;
using UnityEditor;
using UnityEngine;

public class EditorGUIExample : EditorWindow
{
    [MenuItem("Examples/ProgressBar(")]
    static void Init()
    {
        UnityEditor.EditorWindow window = GetWindow(typeof(EditorGUIExample));
        window.position = new Rect(0, 0, 150, 60);
        window.Show();
    }

    private float value; //定义进度条填充值
    private void OnGUI()
    {
        if (GUILayout.Button("增加进度")) //手动增加进度
        {
            value += 0.1f;
            value = Mathf.Clamp01(value); //约束value值到0~1
        }
        EditorUtility.DisplayProgressBar("进度条", "显示信息", value); //显示进度条
        if (value == 1)
        {
            EditorUtility.ClearProgressBar(); //关闭进度条
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

1

2.4 提示框:DisplayDialog、DisplayDialogComplex、DisplayPopupMenu

  • DisplayDialog: 显示模态对话框。
  • DisplayDialogComplex: 显示含有三个按钮的模态对话框。
  • DisplayPopupMenu: 显示弹出菜单。

DisplayDialog

EditorUtility.DisplayDialog("Title", "Message", "ok", "cancel");
  • 1

1

DisplayDialogComplex

 EditorUtility.DisplayDialogComplex("Title", "Message", "ok", "cancel", "alt");
  • 1

1

DisplayPopupMenu

 if (GUILayout.Button("对话框"))
 {
     Event evt = Event.current;
     Vector2 mousePos = evt.mousePosition;
     EditorUtility.DisplayPopupMenu(new Rect(mousePos.x, mousePos.y, 0, 0), "Assets/", null);
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1

2.5 打开文件对话框:OpenFilePanel、OpenFilePanelWithFilters、OpenFolderPanel

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

OpenFilePanel

    private void OnGUI()
    {
        if (GUILayout.Button("OpenFilePanel"))
        {
            string path = EditorUtility.OpenFilePanel("png", "", "png");
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1
OpenFilePanelWithFilters

 if (GUILayout.Button("OpenFilePanelWithFilters"))
 {
     string path = EditorUtility.OpenFilePanelWithFilters("png", "", 
         new string[] { "Image files", "png,jpg,jpeg", "All files", "*" });
 }
  • 1
  • 2
  • 3
  • 4
  • 5

1
OpenFolderPanel

    private void OnGUI()
    {
        if (GUILayout.Button("OpenFolderPanel"))
        {
            string path = EditorUtility.OpenFolderPanel("Load png Textures", "", "");
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

2.6 保存文件对话框:SaveFilePanel、SaveFilePanelInProject、SaveFolderPanel

  • SaveFilePanel: 显示“保存文件”对话框并返回所选的路径名称。
  • SaveFilePanelInProject: 在项目的 Assets 文件夹中显示“保存文件”对话框并返回所选的路径名称。
  • SaveFolderPanel: 显示“保存文件夹”对话框并返回所选的路径名称。

SaveFilePanel

     private void OnGUI()
   {
       if (GUILayout.Button("SaveFilePanel"))
       {
           var path = EditorUtility.SaveFilePanel(
          "Save texture as PNG",
          "",
          "texture.png",
          "png");
       }
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

1

SaveFilePanelInProject

   if (GUILayout.Button("SaveFilePanelInProject"))
   {
       string path = EditorUtility.SaveFilePanelInProject("Save png", "texture.png", "png",
        "Please enter a file name to save the texture to");
   }
  • 1
  • 2
  • 3
  • 4
  • 5

1

SaveFolderPanel

    if (GUILayout.Button("SaveFolderPanel"))
   {
       string path = EditorUtility.SaveFolderPanel("Save textures to folder", "", "");
   }
  • 1
  • 2
  • 3
  • 4

1

2.6 SetObjectEnabled、GetObjectEnabled

  • 设置/获取对象的启用状态。

3. GUIUtility

3.1 参数总览

静态函数描述
AlignRectToDevice将本地空间矩形与像素网格对齐。
ExitGUI通过抛出 ExitGUIException 来将 GUI 置于这样一种状态:阻止所有后续即时模式 GUI 函数计算 GUI 循环的其余部分。
GetControlID为控件获取一个唯一的 ID。
GetStateObject从 controlID 获取状态对象。
GUIToScreenPoint将一个点从 GUI 位置转换为屏幕空间位置。
GUIToScreenRect将矩形从 GUI 位置转换到屏幕空间。
QueryStateObject从 controlID 获取一个现有的状态对象。
RotateAroundPivot让 GUI 围绕一个点旋转的 Helper 函数。
ScaleAroundPivot让 GUI 围绕一个点缩放的 Helper 函数。
ScreenToGUIPoint将一个点从屏幕空间位置转换为 GUI 位置。
ScreenToGUIRect将矩形从屏幕空间转换到 GUI 位置。

4. GUILayoutUtility

4.1 参数总览

静态函数描述
GetAspectRect保留一个具有特定宽高比的矩形布局空间。
GetLastRect获取 GUILayout 最后用于控件的矩形。
GetRect保留一个矩形布局空间,以显示某些具有特定样式的内容。

5. 总结

  • EditorGUIUtility、EditorUtility、GUIUtility、GUILayoutUtility都是Unity编辑器中用于UI开发的工具类,但它们的功能和使用场景有所不同。

    • EditorGUIUtility:主要用于编辑器界面的UI开发,提供了创建和管理编辑器界面的工具和函数。它继承自GUIUtility,因此具有GUIUtility的所有功能。
    • EditorUtility:一个辅助类,主要用于编辑器脚本的开发。它提供了一系列实用的静态方法,用于处理编辑器中的各种任务,例如获取场景中的相机、设置游戏对象的属性等。
    • GUIUtility:一个基础的UI绘制类,主要用于在场景中创建和管理UI元素。它提供了很多基础的UI组件,例如按钮、标签、滑动条等,但需要手动设置控件的位置和大小。
    • GUILayoutUtility:类似于GUIUtility,用于在场景中创建和管理UI元素。但它提供了自动布局的功能,可以自动调整控件的位置和大小,使其适应不同的屏幕尺寸和分辨率。
  • 总结来说,EditorGUIUtility主要用于编辑器界面的UI开发,EditorUtility主要用于编辑器脚本的开发,GUIUtility提供基础的UI组件但需要手动布局,而GUILayoutUtility则提供了自动布局的功能。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1vi5kv7wjb1cc

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/82557
推荐阅读
相关标签
  

闽ICP备14008679号