Unity Editor
文章平均质量分 50
Unity编辑器开发
CoderZ1010
这个作者很懒,什么都没留下…
展开
-
Unity Editor Window 拖拽调整区域大小
如何在Editor Window 编辑器窗口中拖拽调整某个区域的大小。原创 2023-04-13 13:20:25 · 1032 阅读 · 0 评论 -
Bezier Curve 贝塞尔曲线 - 在Unity中实现路径编辑
贝塞尔曲线你玩明白了吗?原创 2023-03-31 00:09:09 · 4424 阅读 · 1 评论 -
Unity 编辑器开发实战【Editor Window】- Replacer 替换器
如图所示,假如一个模型被大量的规整的摆放在场景中,当我们修改了这个模型需要替换时,需要将新模型按照如上位置进行逐个替换比较麻烦,下面介绍的工具Replacer可以很方便的进行批量替换:在Hierarchy层级窗口选中所有需要替换的模型,然后指定用来替换的模型,点击Replace进行替换工具代码如下:using UnityEditor;using UnityEngine;namespace SK.Framework{ /// <summary> ///..原创 2022-04-26 10:02:08 · 1371 阅读 · 0 评论 -
Unity & 蓝湖 关于UI工作流优化的思考(二)
背景和历史版本在下面这篇博客中查看:Unity & 蓝湖 关于UI工作流优化的思考最新版本:本文旨在让不会使用Unity的其他人员在简单了解该工具后,可以帮助研发人员搭建Unity中的UI预制体,研发人员稍作调整即可用,以减轻研发人员的工作压力。一个UI视图的预制体的制作步骤如下:1.在蓝湖中下载该视图的所有相关切图2.将下载的切图资源包解压缩后,拖入到Unity中Project窗口的Assets目录中的任一文件夹内3.选中所有切图,在Inspect.原创 2022-04-21 16:03:46 · 4004 阅读 · 3 评论 -
Unity & 蓝湖 关于UI工作流优化的思考
我们Unity项目关于UI界面制作的工作流是这样的,UI设计人员将设计好的UI界面在Adobe XD中上传至蓝湖,Unity程序猿从蓝湖中下载切图资源包导入项目工程中,根据蓝湖中的效果图、样式信息进行界面的搭建:例如这张首页UI中的第一个按钮,其图层名称为"组646",位置为(209px,605px),大小为(225px,76px)首先可以看到位置信息中的685px是指这个图层到顶部的像素大小,可以判断其位置信息是在以左上角为原点的坐标系中的,而且在Unity...原创 2022-02-23 21:56:37 · 3123 阅读 · 4 评论 -
Unity 编辑器开发实战【Editor Window】- 构建公司内部的PackageManager
Unity中的资源包管理器Package Manager为我们提供了模块、工具包的集中管理功能,可在其中下载、升级相应的资源包,本文介绍如何构建公司内部的Package Manager资源包管理器。 首先我们需要一个局域网服务器,将我们的资源包放到服务器内提供下载。构建该服务器有很多途径,可以让公司后端人员进行开发,并定制下载等相关接口,我们只需要调用接口。如果没有该条件,可以使用一些相关的软件,比如HFS,一个简易的HTTP服务器软件,下载链接:HFS ~ Http ...原创 2022-01-17 16:15:32 · 3657 阅读 · 0 评论 -
Unity 编辑器开发实战【Editor Window】- 关于提高Proto通信协议文件生成效率的考虑
在项目中使用Protobuf作为通信协议时,需要用到protogen.exe程序将.proto文件编译成.cs文件再导入Unity工程中使用:例如我们创建一个ProtoTest.proto文件:然后编辑run.bat文件中的内容,根据.proto文件名称输入编译指令:编辑完成后,运行run.bat文件,可见编译好的ProtoTest.cs文件已经生成到指定位置:当我们有大量的.proto文件需要编译时,手动输入这些编译指令费时费力,而且容易出错,基于这样的情况,博主在Unit原创 2022-04-12 13:51:45 · 1424 阅读 · 0 评论 -
Unity 编辑器开发实战【Editor Window】- Filter 物体筛选工具
Unity开发工作中,在Hierarchy窗口搜索栏可以通过物体名称或组件名称对场景中的物体进行搜索,但是并不能满足我们一些其它的搜索要求,例如搜索指定Tag标签的物体,或者指定Layer层级的物体,或者指定Active状态的物体,或者更为复杂的一些搜索,比如我们想找到场景中所有隐藏的、且挂有Camera组件的、且标签为MainCamera的物体,这些都无法实现。今天分享一个作者为了解决上述搜索需求而开发的Filter物体筛选器:其中Target是指需要进行筛选的所...原创 2021-08-12 14:37:23 · 3457 阅读 · 0 评论 -
Unity 编辑器开发实战【Editor Window】- Animation Clip Previewer 动画片段预览工具
通常我们把一个人物模型拖到Scene场景中后是这样的:本文制作一个在Scene窗口预览动画片段的工具,如图所示:代码如下:using UnityEngine;using UnityEditor;namespace SK.Framework{ /// <summary> /// 动画片段预览工具 /// </summary> public class AnimationClipPreviewer : EditorWi..原创 2022-03-01 17:17:48 · 3043 阅读 · 0 评论 -
Unity 编辑器开发实战【Editor Window】- Duplicator复制机
1.Name Duplicator:名称复制机(根据层级结构复制名称)2.Material Duplicator:材质复制机(根据层级结构复制材质)代码如下:namespace SK.Framework{ public interface IDuplicator { string InvalidatedInfo { get; } bool IsValidated(); void Duplicate(); }原创 2022-03-27 16:16:55 · 2952 阅读 · 0 评论 -
Unity 编辑器开发实战【Editor Window】- BlendShape调试工具
Skin Mesh Renderer组件编辑器本身包含BlendShape的调试滑动条,但是当数量较多想要重置时较为麻烦,下面介绍的工具添加了这些调试滑动条的同时,增加了一键重置的功能:代码如下:using UnityEngine;using UnityEditor;namespace SK.Framework{ /// <summary> /// BlendShape调试工具 /// </summary> public cl..原创 2022-03-15 10:37:39 · 2874 阅读 · 0 评论 -
Unity 编辑器开发实战【Custom Editor】- 为UI视图制作动画编辑器
为了更方便地为UI视图添加动画,将动画的编辑功能封装在了UI View类中,可以通过编辑器快速的为视图编辑动画。动画分为两种类型,一种是Unity中的Animator动画,该类型直接通过一个字符串类型变量记录动画State状态的名称即可,播放时调用Animator类中的Play方法传入该名称。另一种是DoTween动画,支持视图的移动、旋转、缩放、淡入淡出动画的编辑:首先看一下动画相关的几个类的数据结构:using System;using UnityEngine;us...原创 2022-02-18 17:49:50 · 2902 阅读 · 5 评论 -
Unity 编辑器开发实战【Custom Editor】- AudioDatabase Editor 音频库编辑器
本文实现一个音频库的自定义编辑器,效果如图:开始实现之前,首先简单介绍该音频库模块,音频库类Audio Database继承自Scriptable Object类,是一个可配置的资源文件:包含的内容如下,databaseName表示该音频库的名称,outputAudioMixerGroup表示音频播放时的输出混音器组,datasets则是表示所有音频数据的列表: /// <summary> /// 音频库 /// &...原创 2022-01-15 17:27:26 · 2930 阅读 · 1 评论 -
Unity 编辑器开发实战【Custom Editor】- FSM Editor
本文介绍如何为FSM有限状态机模块实现一个自定义编辑器面板,FSM的详细代码在上一篇文章中有介绍,链接地址:在Unity中构建FSM有限状态机下面是最终效果:首先,自定义一个编辑器面板,需要用到Attribute:CustomEditor,参数传入目标类的类型,代码如下:using UnityEngine;using UnityEditor;namespace SK.Framework{ [CustomEditor(typeof(FSMMas...原创 2022-01-14 11:04:31 · 2950 阅读 · 0 评论 -
Unity 编辑器开发实战【Create Editor】- RectTransformEditor拓展 Auto Anchors
通过Editor类中的CreateEditor方法可以实现在不改变原有编辑器布局的情况下进行拓展,下面以RectTransform组件的编辑器为例: 如图所示,我们在不改变RectTransform原有编辑器布局的情况下,添加了一个Auto Anchors功能,该功能方便我们在搭建UI时自动设置锚点。原有的编辑器布局通过CreateEditor方法来创建一个编辑器类,在OnInspectorGUI中调用其OnInspectorGUI方法即可,同时...原创 2022-02-15 09:52:20 · 2623 阅读 · 0 评论 -
Unity 编辑器开发实战【Scene View】- UI Selector
在Scene窗口编辑UI界面时,当重叠的UI元素较多时,很难点选想要选中的元素,UI Selector工具做了如下功能:右键时弹出一个列表,列举所有包含鼠标当前位置的RectTransform物体,在列表中选择即可选中该UI元素。实现该功能需要使用Scene View类,本人用的Unity版本是2020.3.16,该版本里显示onSceneGUIDelegate是弃用状态,使用duringSceneGui代替:using UnityEngine;usi...原创 2022-02-14 14:58:25 · 3160 阅读 · 0 评论 -
Unity 编辑器开发实战【Model Importer】- 如何多选设置模型导入设置中的Material Location
模型的Import Settings中Materials部分是不支持多选进行编辑的,如图所示,如果我们选中多个模型,编辑器中会提示Material Editing is not supported on multiple selection.假如我们往工程中导入了大量模型,其默认的Location设置为Use Embedded Materials,而我们想要将其设为Use External Materials(Legacy),就需要依次选中模型、设置Location,比较耗时耗力。本文实现的原创 2022-03-22 11:58:23 · 3798 阅读 · 0 评论 -
Unity 编辑器开发实战【MenuItem】- 批量删除场景中的LOD Group,保留最高层次细节
如果场景中包含大量的LOD Group组件,我们不想要使用时,手动依次删除需要耗费大量时间,本文介绍如何编写一个批量删除场景中LOD Group组件,并且只保留最高层次细节的物体的工具。实现思路:1.使用MenuItem制作一个功能菜单;2.调用功能时,弹出窗口提醒确认删除场景中的LOD Group组件;3.如果物体属于Prefab,不能进行销毁操作,因此还要确认是否进行Prefab Unpack;4.遍历场景中的所有LOD Group组件;5.遍历LOD Group中的LOD结原创 2022-03-21 16:19:26 · 2712 阅读 · 0 评论 -
Unity 编辑器开发实战【MenuItem & CONTEXT】- Image、RawImage的相互转换
1.Image转RawImage:代码如下:using UnityEditor;using UnityEngine;using UnityEngine.UI;namespace SK.Framework{ public class ImageTool : Editor { /// <summary> /// Image转RawImage /// </summary> [MenuIt原创 2022-03-18 12:04:34 · 2073 阅读 · 0 评论 -
Unity 编辑器开发实战【AssetDatabase】- 获取资产的依赖项、引用项
Unity AssetDatabase类中提供了获取资产依赖项的API,如果我们想要获取某一资产被哪些资产引用,可以通过如下思路去实现:1.获取工程中的所有资产;2.遍历每一项资产,获取其依赖项列表;3.如果资产A的依赖项列表中包含资产B,则资产B被资产A引用。用到的核心API:1.根据guid获取资产路径//// 摘要:// Gets the corresponding asset path for the supplied GUID, or an empty s..原创 2022-03-28 15:40:33 · 5303 阅读 · 0 评论 -
Unity【InitializeOnLoadMethod】- 如何在项目工程打开时创建一个窗口
我们在Unity中安装的一些插件、工具,会在工程打开时弹出一个相关介绍的窗口,实现这样的功能需要用到InitializeOnLoadMethod这个特性,官方文档中的介绍:使用了该特性的静态函数会在Unity工程加载时,不需要用户做任何操作,函数将会自动执行,下面是使用该特性实现的一个简单的窗口:代码如下:using UnityEngine;using UnityEditor;public class Example : EditorWindow{ [Initializ原创 2022-03-06 11:14:19 · 3118 阅读 · 0 评论 -
Unity Editor【Open Folder Panel】- 打开选择文件夹窗口并记录文件夹路径
如图所示,在Unity Editor编辑器环境下编写这样一个功能:点击“浏览”按钮,打开一个窗口,选择文件夹并记录该文件夹的路径:用到的API:EditorUtility类中的OpenFolderPanel方法:// 摘要:// Displays the "open folder" dialog and returns the selected path name.// 参数:// title://// folder://// defaultName:[原创 2022-02-28 17:51:41 · 6348 阅读 · 1 评论 -
Unity Editor【Open File Panel】- 打开选择文件窗口并记录文件路径
如图所示,在Unity Editor编辑器环境下编写这样一个功能:点击“浏览”按钮,打开一个窗口,选择文件并记录该文件夹的路径:用到的API:EditorUtility类中的OpenFilePanel方法:// 摘要:// Displays the "open file" dialog and returns the selected path name.// 参数:// title://// directory://// extension:publ.原创 2022-03-01 15:19:03 · 3866 阅读 · 1 评论 -
十三、Unity编辑器开发之AnimBool
在编辑器开发中可以使用AnimBool来为编辑器添加动态效果,下面以foldout的折叠效果为例:首先声明一个AnimBool类型变量,需要在OnEnable函数中对其进行初始化。private AnimBool foldout;private void OnEnable(){ //参数1 bool类型 表示初始值 //参数2 回调函数 设为重新绘制事件 foldout = new AnimBool(false, Repaint);}...原创 2021-10-10 15:33:12 · 980 阅读 · 0 评论 -
十二、Unity编辑器开发之各类字段及滑动条绘制
1.各类字段:为我们的Test类中添加以下字段:using UnityEngine;public class Test : MonoBehaviour{ public enum TestEnum { Enum1, Enum2, } public string stringValue = "str"; public int intValue = 30; public float floatValue = 50f;原创 2021-05-14 17:16:37 · 1569 阅读 · 1 评论 -
十一、Unity编辑器开发之Toggle
当我们需要切换一个bool值的时候通常需要用到Toggle开关,Toggle的绘制需要用到GUILayout.Toggle或EditorGUILayout.Toggle方法。using UnityEngine;using UnityEditor;[CustomEditor(typeof(Test))]public class TestEditor : Editor{ private bool boolValue; public override void OnInspect原创 2021-05-14 16:20:49 · 3223 阅读 · 0 评论 -
十、Unity编辑器开发之Button
Button按钮的绘制需要用到GUILayout.Button或者EditorGUILayout.Button方法。一、类型按钮的绘制有很多种:1.String类型Button:using UnityEngine;using UnityEditor;[CustomEditor(typeof(Test))]public class TestEditor : Editor{ public override void OnInspectorGUI() {原创 2021-05-14 15:35:32 · 3673 阅读 · 6 评论 -
九、Unity编辑器开发之Gizmos
1.OnDrawGizmos和OnDrawGizmosSelcted方法Gizmos绘制需要Monobehaviour生命周期中的OnDrawGizmos函数,它在生命周期中的位置:using UnityEngine;public class Test : MonoBehaviour{ private void OnDrawGizmos() { }}虽然函数代码块中没有任何实现,但是我们已经可以在Gizmos下拉框中看到Test选项:下面我们来实现一些绘制:原创 2021-05-14 14:23:11 · 5261 阅读 · 0 评论 -
八、Unity编辑器开发之GUILayout布局
1.水平布局在编辑器的开发中,如果我们想将一些GUI元素绘制在一个水平方向上,需要用到GUILayout中的一对方法:GUILayout.BeginHorizontal();// GUI Element1st// GUI Element2nd// GUI Element3rdGUILayout.EndHorizontal();这两个方法一定是成对出现的,有了上述布局后,我们绘制的内容类似于下图:2.垂直布局如果我们想将这些元素绘制在一个垂直方向上,则需要用到GUILayou原创 2021-05-14 11:13:40 · 5216 阅读 · 0 评论 -
七、Unity编辑器开发之PropertyDrawer
PropertyDrawer允许我们控制一个属性的Inspector检视面板的GUI如何绘制。首先看几个Unity中内置的PropertyDrawers:[Range(0, 20)]public int intValue = 10;[Header("名称")]public string nameStr;[SerializeField]private float floatValue = 10f;如图所示,Range可以限制intValue的取值范围0~20,Header可以给原创 2021-05-14 09:45:26 · 3776 阅读 · 2 评论 -
六、Unity编辑器开发之GUIIcon
如图,在GUIIcon窗口列出所有Unity内置的图标:实现:首先,加载以上所有图片,将它们的名称存在一个.txt的文本中 [MenuItem("SKFramework/Editor/GUI/GUI Icon/Load GUIIcon")] private static void LoadGUIIcon() { List<Texture> icons = new List<Texture>(Res原创 2021-05-13 20:41:38 · 904 阅读 · 3 评论 -
五、Unity编辑器开发之GUIStyle
在编辑器开发中会大量用到GUIStyle,为了能够精确的实现想要的样式,将所有的样式列在一个窗口中进行预览,如下:在窗口顶部的Search输入框中输入样式名称的关键字可进行筛选,点击样式左侧的拷贝按钮可将样式名称进行复制。下面为代码,需要放在Editor文件夹中using UnityEngine;using UnityEditor;namespace SK.Framework{ public sealed class GUIStyle : EditorWindow原创 2021-05-13 20:08:26 · 1360 阅读 · 1 评论 -
四、Unity编辑器开发之EditorWindow
Unity的使用,是在不同的编辑器窗口中进行,例如Scene、Game、Project、Hierarchy、Inspector等等,那么如何创建一个自定义的编辑器窗口?首先需要EditorWindow类作为基类,例如我们创建一个ExampleWindow编辑器窗口:using UnityEditor;public class ExampleWindow : EditorWindow {}我们使用MenuItem,创建一个窗口的入口: [MenuItem("Example/Ope原创 2021-02-26 14:12:11 · 3260 阅读 · 0 评论 -
三、Unity编辑器开发之CustomEditor
CustomEditor特性,允许我们自定义组件的Inspect检视面板。public CustomEditor (Type inspectedType);public CustomEditor (Type inspectedType, bool editorForChildClasses);param1: inspectedType 检视的类型,即自定义哪个类型的Inspector。param2: editorForChildClasses 默认为false,为true时表明其子类使用同样原创 2021-02-26 13:32:04 · 4340 阅读 · 0 评论 -
二、Unity编辑器开发之ContextMenu
ContextMenu属性,允许我们在Inspect检视面板对Component组件添加菜单功能。public ContextMenu (string itemName);public ContextMenu (string itemName, bool isValidateFunction);public ContextMenu (string itemName, bool isValidateFunction, int priority);param1: itemName 表示菜单的路径。原创 2021-02-26 10:20:05 · 3846 阅读 · 0 评论 -
一、Unity编辑器开发之MenuItem
MenuItem自定义菜单栏属性,允许我们创建自己的编辑器菜单。public MenuItem (string itemName);public MenuItem (string itemName, bool isValidateFunction);public MenuItem (string itemName, bool isValidateFunction, int priority);param1: itemName 表示菜单项的路径。param2: isValidateFunct原创 2021-02-25 17:00:22 · 2405 阅读 · 0 评论