1.Unity3d Editor 编辑器扩展功能详解(2) GUI/GUILayout
2.Unity3d Editor 编辑器扩展功能详解(4)Gizmos
3.Unity编辑器拓展开发-在IMGUI中实现滑条拖动功能
4.Unity3d Editor 编辑器扩展功能详解(1) 目录索引
5.unityunity editoråunityengineçåºå«
6.Unity3d Editor 编辑器扩展功能详解(5)Handles
Unity3d Editor 编辑器扩展功能详解(2) GUI/GUILayout
GUI/GUILayout模块主要针对Game视图的UI信息显示与逻辑操作,如插件或demo项目中常见场景。此模块采用关键字、图例与代码的简洁描述方式,便于快速定位目标功能。按钮类组件
包括按钮(Button)、netwap扫描源码选择按钮(Selection)、工具栏(Toolbar)、切换键(Toggle)等。 按钮(Button)使用关键字:GUILayout.Button 选择按钮(Selection)使用关键字:GUILayout.SelectionGrid 工具栏(Toolbar)使用关键字:GUILayout.Toolbar 切换键(Toggle)使用关键字:GUILayout.Toggle文本标签类
包括文本标签(Label)和文本输入区域(TextField)。 文本标签(Label)使用关键字:GUILayout.Label 文本输入区域(TextField)使用关键字:GUILayout.TextArea, GUILayout.TextField滚动滑条类
涉及滑条(Slider)、滚动条(ScrollBar)。 滑条(Slider)使用关键字:GUILayout.HorizontalSlider, GUILayout.VerticalSlider 滚动条(ScrollBar)使用关键字:GUILayout.HorizontalScrollbar, GUILayout.VerticalScrollbar区块布局类
涵盖方形区域(Box)、可视区域(Area)、水平/垂直布局(Horizontal/Vertical)、滑动视图(ScrollView)与空白间隔(Space)。 方形区域(Box)使用关键字:GUILayout.Box 可视区域(Area)使用关键字:GUILayout.BeginArea, GUILayout.EndArea 水平/垂直布局(Horizontal/Vertical)使用关键字:GUILayout.BeginHorizontal, GUILayout.EndHorizontal, GUILayout.BeginVertical, GUILayout.EndVertical 滑动视图(ScrollView)使用关键字:GUILayout.BeginScrollView, GUILayout.EndScrollView 空白间隔(Space)使用关键字:GUILayout.Space, GUILayout.FlexibleSpace控件属性(GUILayoutOption)
提供自定义布局属性的关键字。总结
GUI/GUILayout主要在Game视图中实现UI操作,通常与EditorGUILayout配合,在Editor编辑器模式下提供扩展功能。这些组件和布局属性共同构建了Unity项目中的丰富UI界面。Unity3d Editor 编辑器扩展功能详解(4)Gizmos
全索引目录: Unity3d Editor 编辑器扩展功能详解(1) 目录索引
上一章节: Unity Editor 编辑器扩展功能详解(3)EditorGUI/EditorGUILayout(下)
下一章节: Unity3d Editor 编辑器扩展功能详解(5)Handles
想开新坑了,让我快马加鞭地把这系列坑填完吧。
一、 Gizmos基础介绍
官方文档: Important Classes - Gizmos & Handles
官方文档解释了Gizmos与Handles类的作用,它们允许你在“SceneView”与“GameView”中绘制线段、图形、互动控制柄等,DSPBIOS启动源码从而扩展显示信息,构建自定义编辑工具。例如,你可以创建一个可拖动的圆环作为NPC的视听检测范围,代替在Inspector中输入数字。
简单地说,Gizmos与Handles主要用于可视化数据信息,便于Debug。
二、 Gizmos使用方式
关键字:MonoBehaviour.OnDrawGizmos, MonoBehaviour.OnDrawGizmosSelected
在MonoBehaviour相关子类中,使用特定的函数调用。OnDrawGizmos在每帧调用,所有渲染都是可见的;OnDrawGizmosSelected仅在脚本附加的物体被选择时调用。
示例代码将脚本挂载在场景中的Gameobject上,可以看见Gizmos的使用。
请注意,全局“是否显示Gizmos”的开关定义在场景上方工具栏的Gizmos按钮中,取消激活此按钮将不绘制任何Gizmos图形。
三、 Gizmos基本绘制API
本部分介绍Gizmos基本绘制方法,包括立方体、视锥、贴图、图标、线段、网格、紫微黄历源码射线、球体、网格线、颜色与矩阵设置。每个API都提供示例代码。
四、 Gizmos经验使用
提供了绘制圆环、弧线的经验方法。圆环绘制需自行计算线段,而弧线绘制则需基于单位圆计算起始方向与扫过的面积,不适用于AI视锥感知范围的绘制。
五、小结
Gizmos提供了基本图形绘制功能,场景文本绘制则由UnityEditor.Handles.Label提供。后续将介绍Handles的使用。
Unity编辑器拓展开发-在IMGUI中实现滑条拖动功能
在Unity编辑器中,实现滑条拖动功能可以通过自定义脚本来完成。这种功能在调整子窗口大小或列表宽度时非常常见。Unity的IMGUI组件虽然内置了一些拖动滑条的功能,如Treeview,但并没有提供直接的拖动滑条组件。因此,我们需要自己实现这种功能。
实现拖动滑条的核心逻辑是:记录鼠标按下时的位置,计算鼠标移动时的偏移量,并根据偏移量调整滑条值。为避免滑条值变化不连续的线程interuppted源码问题,我们需要在鼠标移动时设置更新滑条值的间隔时间。
实现时,可以使用Unity的EventSystem和Raycast功能来检测鼠标事件。当鼠标按下时,记录鼠标位置,并初始化滑条值。当鼠标移动时,通过Raycast检测到的Ray与滑条的Ray进行比较,计算偏移量,然后根据偏移量调整滑条值。为防止快速移动导致的不连续变化,可以设置一个时间间隔,每过一定时间更新滑条值。
下面是一个实现步骤的概述:
1. 创建一个Unity编辑器窗口(EditorWindow)。
2. 在窗口内绘制一个可拖动的滑条,可以使用Texture或Shape来表示滑条。
3. 监听并处理鼠标按下和移动事件。
4. 计算滑条的偏移量,并根据偏移量调整滑条值。
5. 设置一个时间间隔,确保滑条值的更新连续平滑。
通过上述步骤,你可以实现一个简单的滑条拖动功能,允许用户通过拖动滑条来调整窗口大小或列表宽度。
本文使用 Zhihu On VSCode 创作并发布
Unity3d Editor 编辑器扩展功能详解(1) 目录索引
面对国内UnityEditor资料的不足,我深感困扰。寻找特定功能时,28程序源码英文关键字的准确性至关重要,但往往令人头疼。CSDN上充斥着抄袭和索引,真正有价值的内容少之又少,犹如在“屎堆”中寻找金子。 无奈之下,我决定自力更生。本系列旨在详细介绍Unity3d Editor在实际应用中的各类功能,例如如何实现折叠功能,只需通过“编辑器--折叠”进行搜索,便能找到所需内容。废话不多说,让我们开始深入了解。1. GUI/GUILayout
关键类如GameView GUI和 MonoBehaviour.OnGUI,Unity的UnityEngine.GUI允许在运行时或编辑器中展示UI,需要手动计算Rect。而GUILayout则是基于GUI的布局工具,自动处理坐标和大小,详情请看系列文章《Unity Editor 编辑器扩展功能详解(2) GUI/GUILayout》。2. Editor/EditorLayout
Editor和EditorWindow是编辑器扩展的核心,EditorGUI和EditorGUILayout用于编辑器中的UI设计,分别需要手动和自动计算Rect,系列文章《Unity Editor 编辑器扩展功能详解(3) EditorGUI/EditorGUILayout(上、下)》将进一步讲解。3. Handles与Gizmos/Debug
Handles用于在Scene View中操作3D元素,如Collider的绿色线框,详情请看《Unity3d Editor 编辑器扩展功能详解(5)Handles》。
Gizmos和Debug功能允许在Scene视图中绘制图形,例如绘制AI敌人的视锥范围,系列文章《Unity3d Editor 编辑器扩展功能详解(4)Gizmos》有详细介绍。
4. EditorUtility, AssetDatabase, Selection
EditorUtility、AssetDatabase和Selection提供了对项目资源的管理和选择操作,如序列化对象修改、资源读写等,系列文章《Unity3d Editor 编辑器扩展功能详解(6)Editor常用辅助类(上、下)》将详细阐述。5. 总览
系列文章包括了《Unity3d Editor 编辑器扩展功能详解(2)到(7)》共计六篇文章,全面覆盖各类功能详解。小结
虽然理解这些原理,但Odin插件的强大诱惑难以抗拒。也许未来某天,我会有机会尝试并利用这个强大的工具。让我们拭目以待吧。unityunity editoråunityengineçåºå«
UnityEditoræ¯Unityç¼è¾å¨ç¼ç¨ï¼æ¯å¦ä½ è¦å¼åä¸ä¸ªå·¥å ·ï¼ä¸é®ç»åºæ¯ä¸ææçç©ä½æ·»å 碰æä½ï¼é£ä¹å°±å¯ä»¥ç¨UnityEditoræ¥å¼åè¿ä¸ªå·¥å ·ï¼è¿ä¸ªå·¥å ·æç®åçä¸ä¸ªå®ç°å½¢æå°±æ¯ä»Unityç¼è¾å¨ä¸æ¹èåæ æå±ä¸ä¸ªæé®ï¼å½æä¸è¿ä¸ªæé®çæ¶åï¼åºæ¯ä¸ææçç©ä½é½ä¼èªå¨æ·»å ä¸ç¢°æä½ï¼ç¸å½äºä½ æå¨ç»ææçç©ä½æ·»å 碰æä½ï¼æ³¨æè¿ä¸ªæ¶ååºæ¯æ¯éè¿è¡ç¶æï¼å³ç¼è¾ç¶æï¼ã
UnityEngineæ¯Unityç¼ç¨ï¼å°±æ¯æä½ çå ·ä½è½¯ä»¶å 容å¼åäºï¼æ¯å¦ä½ åäºä¸ä¸ªèæ¬åè½æ¯åå移å¨ï¼é£ä¹ä½ æè¿ä¸ªèæ¬æå¨ä¸ä¸ªCubeä¸é¢ï¼å½ä½ çåºæ¯è¿è¡æ¶Cubeå°±ä¼å å移å¨ï¼æ³¨æè¿ä¸ªæ¶ååºæ¯æ¯è¿è¡ç¶æèéç¼è¾ç¶æäºã
综ä¸ï¼åè æ¯é对ç¼è¾å¨æ¬èº«æä¾ä¸äºä¾¿äºå¼åè ç¼è¾Unityç©ä½çç¼ç¨ï¼åè åæ¯å ·ä½å°Unityè¦å®ç°ä»ä¹è½¯ä»¶å 容çç¼ç¨ã
Unity3d Editor 编辑器扩展功能详解(5)Handles
全系列目录 Unity3d Editor 编辑器扩展功能详解(1) 目录索引 上一章节: Unity3d Editor 编辑器扩展功能详解(4)Gizmos 下一章节: Unity3d Editor 编辑器扩展功能详解(6)Editor常用辅助类(上) 在Unity3d开发中,handles扩展功能是编辑器扩展中非常重要的一部分,本章节将深入探索handles的使用与绘制方法。Handles基础介绍
Handles是Unity在场景视图中用于操控物体的3D控制器,内置了许多操作GUI,如基于Transform组件的定位、缩放、旋转工具。同时,开发者也可以自定义Handle GUI,用于编辑程序化生成的场景内容、不可见的子对象或关联对象,如路径点和坐标标记。Handles使用方式
1. 基于Editor类的OnSceneGUI方法:在继承自Editor的类中定义OnSceneGUI()方法,当此Editor活跃时,方法内容会根据SceneView刷新调用。 例如,在层次视图中新建空对象,挂载脚本,点击显示HandlesMono信息,即可观察到信息打印。如果不在层次视图中选择对应物体,则HandlesMono在检视器中不显示,意味着Disable了OnSceneGUI方法。 2. 基于EditorWindow的手动注册:若需要在Window中进行数据编辑,需手动注册SceneView刷新事件。Handles基本绘制方法
1. Label(文本):使用Handles.Label方法绘制文本信息。 2. Line/Dotted Line(线段/虚线):使用Handles.DrawLine或Handles.DrawDottedLine方法绘制线段或虚线。 3. Arc/Disc(弧线/圆环):使用Handles.DrawWireArc或Handles.DrawSolidDisc方法绘制弧线或圆环。 4. Rectangle(矩形):使用Handles.DrawSolidRectangleWithOutline方法绘制填充矩形。 5. GUI:通过Handles.BeginGUI和Handles.EndGUI方法开始和结束GUI绘制。控制柄
Handles的核心功能是其Handle类,如Handles.PositionHandle用于类似位置移动操作。典型应用是显示列表元素的Position控制柄并进行移动。小结
handles功能结合OnGUIScene与Handles实现的“地形笔刷”功能也非常实用,通过编辑模式下的Event事件,开发者可以自定义在SceneView中调整高度、生成植被的功能。Unity Editor 编辑器扩展功能详解(3)EditorGUI/EditorGUILayout(下)
全系列目录索引:Unity3d Editor 编辑器扩展功能详解(1)目录索引 上一章节:Unity Editor 编辑器扩展功能详解(3)EditorGUI/EditorGUILayout(上) 下一章节:Unity3d Editor 编辑器扩展功能详解(4)Gizmos 在探讨Unity Editor扩展功能时,编辑器工具的重要性与趣味性逐渐凸显。尽管开发工具可能不如游戏玩法或优化渲染那么吸引眼球,但它们对于构建高效、用户友好的编辑环境至关重要。接下来,我们将继续深入探讨Unity编辑器中的一些核心扩展功能,以帮助开发者更高效地进行场景管理、属性调整以及界面设计。折叠栏
在Unity编辑器中,折叠栏是一种强大的组织和展示内容的工具。通过使用关键字`EditorGUILayout.Foldout`,你可以创建可折叠的面板来分组和展示不同的属性或设置。 示例代码如下:csharp
public bool isExpanded;
public string headerText = "Foldout Example";
public void Update()
{
isExpanded = EditorGUILayout.Foldout(isExpanded, headerText);
if (isExpanded)
{
// 展开时展示的内容
}
}
折叠组
折叠组通过`EditorGUILayout.BeginFoldoutHeaderGroup`和`EditorGUILayout.EndFoldoutHeaderGroup`来实现,允许你在一个特定的标题下组织一组折叠面板。 示例代码如下:csharp
public void BeginFoldoutGroupExample()
{
EditorGUILayout.BeginFoldoutHeaderGroup(false, "Group Title");
{
// 展开组内的内容
}
EditorGUILayout.EndFoldoutHeaderGroup();
}
开关控件
开关控件是用于创建二进制选择(开/关)的界面元素。`EditorGUILayout.Toggle`和`EditorGUILayout.ToggleLeft`分别用于创建标准和左对齐的开关按钮。 示例代码如下:csharp
public bool toggleValue;
public string toggleLabel = "Toggle Example";
public void ToggleExample()
{
toggleValue = EditorGUILayout.Toggle(toggleLabel, toggleValue);
}
滑动控件
滑动条(`EditorGUILayout.Slider`和`EditorGUILayout.IntSlider`)用于创建可调整值的滑动条,而`MinMaxSlider`(`EditorGUILayout.MinMaxSlider`)则提供了一种在特定范围内滑动的控件。 示例代码如下:csharp
public float sliderValue;
public float minValue = 0.0f;
public float maxValue = .0f;
public void SliderExample()
{
sliderValue = EditorGUILayout.Slider("Slider Example", sliderValue, minValue, maxValue);
}
其他控件
Unity编辑器提供了一系列辅助控件,如`HelpBox`用于展示警告或说明文本,以及`Space`用于添加间距。`GUILayout派生控件`则是基于`GUILayout`类扩展的功能,允许开发者根据需求定制界面布局。 示例代码如下:csharp
public void HelpBoxExample()
{
EditorGUILayout.HelpBox("This is a help message", MessageType.Info);
}
public void SpaceExample()
{
EditorGUILayout.Space();
}
总结
通过掌握这些核心功能,开发者可以创建出更加高效、直观的编辑器界面,显著提升开发效率。然而,即便掌握了这些基础,如何使编辑器界面更加美观、操作流畅,仍是一门艺术。后续文章中,我们将深入探讨Unity编辑器界面优化的技巧,以期让编辑器的使用体验更加卓越。Unity3d Editor 编辑器扩展功能详解(6)Editor常用辅助类(下)
系列目录: Unity3d Editor 编辑器扩展功能详解(1) 目录索引
上一章节: Unity3d Editor 编辑器扩展功能详解(6)Editor常用辅助类(上)
下一章节: Unity3d Editor 编辑器扩展功能详解(7)(完结)Editor美化
本节查漏补缺,简单介绍一些其他辅助类。
一、 Selection
Selection主要是用于返回在编辑器中的选择对象(Object)信息,这个对象(Object)可以是一份资产文件(Asset、Prefab),也可是场景中的实例对象(Gameobject)。
一个经典应用就是,比如在EditorWindow中实例化了一个对象,出于操作友好性,应该把当前选择对象直接变为生成实例,这样在Inspector面板中就能显示对应信息了,这种操作就是通过Selection类实现的。
(注:Selection在命名空间UnityEditor中定义)
1. Object Selection(对象选择)
2. Static Methods(静态方法)
3. SelectionMode详解
4. 示例案例
目的:获取某个文件夹下所有的Texture资产
示例代码:
目的:新建一个GameObject,同时选中
示例代码:
二、 Event
A UnityGUI event. Events correspond to user input (key presses, mouse actions), or are UnityGUI layout or rendering events. For each event OnGUI is called in the scripts; so OnGUI is potentially called multiple times per frame. Event.current corresponds to "current" event inside OnGUI call.
Event主要用于编辑器模式下,对IMGUI操作输入的响应。
在Editor模式(而不是Playing模式)下,写在代码中的类似Input.GetKeyDown是无效的,是无法获取键盘/鼠标操作信息的,取而代之的是使用类似Event.current.type == EventType.MouseDown检测输入。
它的使用可以在Editor的面板下,也可以在场景视图中(SceneView)。
1. 简单输入
示例代码:
2. 组合键
示例代码:
3. 坐标转换
一个很常见的需求就是,我们在SceneView中点击了,希望在点击处发射一条射线检测场景中的物体,求一个交点然后放置什么东西(就像Terrain的笔刷一样),这是通过以下方式实现的。
样例:
4. Tip
查阅资料的时候发现有这样一种使用方法:
文档解释: Unity - Scripting API: Event.Use
文档上说,在某些Event检测后,使用Event.current.Use();就能让其他GUI elements忽视这次Event。
比如说使用Alt+鼠标左键创建物体,但是这个组合键也是unity场景自带的组合键,用于旋转SceneView的,使用
Event.current.Use();就会让自带的旋转功能失效。
主要是为了解决组合键冲突吧。
Reference:
[1] Unity - Scripting API: Selection
[2] Unity - Scripting API: Event
[3] UnityEditor的Selection类_庸人自扰Eam的博客-CSDN博客