【watch源码】【netty源码游戏解析】【澳洲dha 溯源码】unity editor源码

1.Unity Editor 编辑器扩展功能详解(3)EditorGUI/EditorGUILayout(下)
2.Unity3d Editor 编辑器扩展功能详解(6)Editor常用辅助类(下)
3.Unity3d Editor 编辑器扩展功能详解(2) GUI/GUILayout
4.Unity3d Editor 编辑器扩展功能详解(5)Handles
5.Unity3d Editor 编辑器扩展功能详解(4)Gizmos
6.Unity3d Editor 编辑器扩展功能详解(1) 目录索引

unity editor源码

Unity Editor 编辑器扩展功能详解(3)EditorGUI/EditorGUILayout(下)

       全系列目录索引:Unity3d Editor 编辑器扩展功能详解(1)目录索引

       上一章节:Unity Editor 编辑器扩展功能详解(3)EditorGUI/EditorGUILayout(上)

       下一章节:Unity3d Editor 编辑器扩展功能详解(4)Gizmos

       在探讨Unity Editor扩展功能时,编辑器工具的重要性与趣味性逐渐凸显。尽管开发工具可能不如游戏玩法或优化渲染那么吸引眼球,但它们对于构建高效、用户友好的编辑环境至关重要。接下来,watch源码我们将继续深入探讨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();

       }

       总结

       通过掌握这些核心功能,开发者可以创建出更加高效、直观的编辑器界面,显著提升开发效率。然而,即便掌握了这些基础,如何使编辑器界面更加美观、操作流畅,仍是netty源码游戏解析一门艺术。后续文章中,我们将深入探讨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

       查阅资料的澳洲dha 溯源码时候发现有这样一种使用方法:

       文档解释: 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博客

Unity3d Editor 编辑器扩展功能详解(2) GUI/GUILayout

       GUI/GUILayout模块主要针对Game视图的UI信息显示与逻辑操作,如插件或demo项目中常见场景。此模块采用关键字、图例与代码的简洁描述方式,便于快速定位目标功能。

       按钮类组件

       包括按钮(Button)、选择按钮(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 编辑器扩展功能详解(5)Handles

       全系列目录 Unity3d Editor 编辑器扩展功能详解(1) 目录索引

       上一章节: Unity3d Editor 编辑器扩展功能详解(4)Gizmos

       下一章节: Unity3d Editor 编辑器扩展功能详解(6)Editor常用辅助类(上)

       在Unity3d开发中,handles扩展功能是编辑器扩展中非常重要的一部分,本章节将深入探索handles的使用与绘制方法。

       Handles基础介绍

       Handles是canal源码包详解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实现的“地形笔刷”功能也非常实用,通过编辑模式下的wx小程序源码Event事件,开发者可以自定义在SceneView中调整高度、生成植被的功能。

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”中绘制线段、图形、互动控制柄等,从而扩展显示信息,构建自定义编辑工具。例如,你可以创建一个可拖动的圆环作为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的使用。

Unity3d Editor 编辑器扩展功能详解(1) 目录索引

       面对国内UnityEditor资料的不足,我深感困扰。寻找特定功能时,英文关键字的准确性至关重要,但往往令人头疼。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要实现什么软件内容的编程。

Unity编辑器拓展开发-在IMGUI中实现滑条拖动功能

       在Unity编辑器中,实现滑条拖动功能可以通过自定义脚本来完成。这种功能在调整子窗口大小或列表宽度时非常常见。Unity的IMGUI组件虽然内置了一些拖动滑条的功能,如Treeview,但并没有提供直接的拖动滑条组件。因此,我们需要自己实现这种功能。

       实现拖动滑条的核心逻辑是:记录鼠标按下时的位置,计算鼠标移动时的偏移量,并根据偏移量调整滑条值。为避免滑条值变化不连续的问题,我们需要在鼠标移动时设置更新滑条值的间隔时间。

       实现时,可以使用Unity的EventSystem和Raycast功能来检测鼠标事件。当鼠标按下时,记录鼠标位置,并初始化滑条值。当鼠标移动时,通过Raycast检测到的Ray与滑条的Ray进行比较,计算偏移量,然后根据偏移量调整滑条值。为防止快速移动导致的不连续变化,可以设置一个时间间隔,每过一定时间更新滑条值。

       下面是一个实现步骤的概述:

       1. 创建一个Unity编辑器窗口(EditorWindow)。

       2. 在窗口内绘制一个可拖动的滑条,可以使用Texture或Shape来表示滑条。

       3. 监听并处理鼠标按下和移动事件。

       4. 计算滑条的偏移量,并根据偏移量调整滑条值。

       5. 设置一个时间间隔,确保滑条值的更新连续平滑。

       通过上述步骤,你可以实现一个简单的滑条拖动功能,允许用户通过拖动滑条来调整窗口大小或列表宽度。

       本文使用 Zhihu On VSCode 创作并发布

Unity用户手册-EditorWindow

       Unity Editor扩展概览

       Unity Editor 是一个通用编辑器,提供内部对象的创建、预览和编辑功能及可视化界面。但为了特定类型游戏开发需求,还需根据程序、策划和美术需求进行扩展。常见扩展包括打包界面、特定游戏对象编辑界面、技能编辑器界面、自定义场景编辑界面和美术资源导入批量设置等。Unity提供了丰富的接口以帮助开发者定制功能。

       用于扩展Editor的类需置于名为“Editor”的文件夹中,此文件夹可直接位于“Assets”文件夹下或项目目录的任何子文件夹,如“Assets/BigWorld/Editor”。Unity提供了多种编辑器扩展功能,下面介绍几种常用扩展。

       扩展工具栏菜单

       通过使用 MenuItem特性扩展工具栏菜单,可以单独执行某些功能,也可与窗口扩展功能一起使用,打开其他窗口。例如,创建“ArtResChecker”菜单并添加“CheckArtRes”项,可执行“ATestCheckArtResFunction”函数。此外,还可以扩展现有菜单,如在“GameObject”菜单中增加“AddChild”功能。

       使用 ScriptableWizard类进行扩展

       ScriptableWizard类提供编辑器向导窗口扩展模板,继承此类并重写几个消息响应函数即可快速创建向导窗口。通过 ScriptableWizard.DisplayWizard函数快速创建向导窗口。此类仅支持小于或等于两个按钮的定制,显示按钮名字通过函数传入。消息响应函数包括 API 中的函数和 DrawWizardGUI函数,用于更新用户界面内容。

       使用 EditorWindows类进行扩展

       完全自定义窗口,根据需求定义内容和布局,继承 EditorWindow类并重写“OnGUI”函数。示例代码展示了如何自定义窗口。

       扩展自定义组件的Inspector窗口

       对继承自“MonoBehaviour”的类的Inspector窗口进行扩展,以提高显示方式的直观性和编辑需求。通过继承 Editor类并重写“OnInspectorGUI”函数进行定制。如果需要在“Scene”视图中显示内容,需要重写 OnSceneGUI。可以参考Unity Manual Custom Editors中“Scene View Additions”。

       常用布局API

       在扩展编辑器时,常用布局API如 EditorGUI和 EditorGUILayout类来定义窗口布局。EditorGUILayout类自动布局,而EditorGUI类的API需要传入 Rect参数定义控件显示范围,自动对齐控件。具体API请查阅Unity文档。

       其他编辑器API

       扩展编辑器过程中常用到的类包括 Undo、Redo、ShaderGUI、PrefabUtility和EditorSceneManager等。这些类提供了undo和redo功能、自定义shader显示界面、Prefab操作和场景管理等功能。在Unity文档中详细介绍了这些类的用法。

更多内容请点击【娱乐】专栏

精彩资讯