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。 |
GetObjectPickerObject | Object 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);
}
1234567891011
1.3 搜索框: ShowObjectPicker
private Texture tex;
...
if (GUILayout.Button("查找法线贴图"))
{
//参数释义
//1. 查找对象的引用
//2. 是否允许查找场景对象
//3. 查找对象名称过滤(比如这里的normal是指文件名称中有normal的会被搜索到)
//4. controlID, 默认写0
EditorGUIUtility.ShowObjectPicker<Texture>(tex, false, "normal", 0);
}
1234567891011
1.4 currentViewWidth
- 这个值和position.width的值,它们近似相等
if (GUILayout.Button("Test"))
{
Debug.Log(EditorGUIUtility.currentViewWidth);
Debug.Log(this.position.width);
}
12345
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");
12
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 参数总览
静态函数 | 描述 |
ClearDefaultParentObject | C从特定场景或活动场景中清除默认父游戏对象。 |
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 | 打开对象的属性编辑器。 |
RequestScriptReload | Unity 编辑器会在下一帧上异步重新加载脚本程序集。这会重置所有脚本的状态,但是 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(); //关闭进度条
}
}
}
123456789101112131415161718192021222324252627282930
2.4 提示框:DisplayDialog、DisplayDialogComplex、DisplayPopupMenu
- DisplayDialog: 显示模态对话框。
- DisplayDialogComplex: 显示含有三个按钮的模态对话框。
- DisplayPopupMenu: 显示弹出菜单。
DisplayDialog
EditorUtility.DisplayDialog("Title", "Message", "ok", "cancel");
1
DisplayDialogComplex
EditorUtility.DisplayDialogComplex("Title", "Message", "ok", "cancel", "alt");
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);
}
123456
2.5 打开文件对话框:OpenFilePanel、OpenFilePanelWithFilters、OpenFolderPanel
- OpenFilePanel: 显示“打开文件”对话框并返回所选的路径名称。
- OpenFilePanelWithFilters: 显示“打开文件”对话框并返回所选的路径名称。
- OpenFolderPanel: 显示“打开文件夹”对话框并返回所选的路径名称。
OpenFilePanel
private void OnGUI()
{
if (GUILayout.Button("OpenFilePanel"))
{
string path = EditorUtility.OpenFilePanel("png", "", "png");
}
}
1234567
OpenFilePanelWithFilters
if (GUILayout.Button("OpenFilePanelWithFilters"))
{
string path = EditorUtility.OpenFilePanelWithFilters("png", "",
new string[] { "Image files", "png,jpg,jpeg", "All files", "*" });
}
12345
OpenFolderPanel
private void OnGUI()
{
if (GUILayout.Button("OpenFolderPanel"))
{
string path = EditorUtility.OpenFolderPanel("Load png Textures", "", "");
}
}
1234567
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");
}
}
1234567891011
SaveFilePanelInProject
if (GUILayout.Button("SaveFilePanelInProject"))
{
string path = EditorUtility.SaveFilePanelInProject("Save png", "texture.png", "png",
"Please enter a file name to save the texture to");
}
12345
SaveFolderPanel
if (GUILayout.Button("SaveFolderPanel"))
{
string path = EditorUtility.SaveFolderPanel("Save textures to folder", "", "");
}
1234
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则提供了自动布局的功能。