使用Odin内置api,自定义绘制区域

添加一个继承自Attribute,HealthBarAttribute自定义特性类,其中只有一个MaxHealth最大生命值,浮点类型,在构造函数中,会通过传参赋值

这里是使用,HealthBarAttribute自定义特性; 添加TypeInfoBox提示文本,然后弄一个float浮点值,使用HealthBar标签,传参给最大生命值MaxHealth,是100

自定义特性,创建一个,对应的特性绘制类,HealthBarAttributeDrawer,继承自OdinAttributeDrawer,两个传参,第一个是要绘制的特性,第二个会是绘制的,类型字段,这里是float; ValueEntry.SmartValue是对应float的数值,跟最大生命值做比例处理,参考Mathf.Clamp01; 通过GetControlRect拿到绘制区域u,然后通过DrawSolidRect先绘制背景底色,然再使用相同的DrawSolidRect方法,绘制按照比例显示的,红色; 再通过DrawBorders绘制边框

Ctrl+N创建一个测试空场景; 空节点,添加组件,表现正常;

自定义一个序列化,MyStruct结构体

这里声明了自定义结构体,还有一个浮点labelWidth数值,默认10

一个类CustomStructDrawer,是继承自OdinValueDrawer绘制类,其中传参是MyStruct自定义结构体,这里就是自定义绘制,自定义结构体 这里是把,结构体中的X和Y,变成 EditorGUI.Slider 滑动条

而且自定义绘制里面,也使用上,前面调用类,声明的浮点labelWidth,去控制滑动条的,显示宽度

测试,表现正常

OdinToolkit是继承自 OdinMenuEditorWindow 的,工具箱集合; 重写BuildMenuTree,调用Odin自带的OdinMenuStyle.TreeViewStyle样式,设置一下宽高; 选项图标也是用Odin自带的EditorIcons即可

使用CreateInstance创建ScriptableObject实体

入口

这是一键搜索,重复文件的入口栏目

对应脚本逻辑; 需要搜索的文件夹,默认是Asset; 其中检索,有两个类型:相同MD5码文件(文件复制之后,名字不一样,但MD5码相同),相同名字文件; 整两个字典,去存储MD5码,文件命名

这是俩字典,用来存储两者;

这是检索之后的,两者的相同字典;

开始检索按钮的逻辑; 先重置数据,清空各个字典容器; 然后,拿到对应的文件组,过滤去掉,.meta后缀,生成的unity文件

这是把Update函数,加到编辑器的更新函数中

检索是一个,基于文件信息的,协程; 使用协程的好处,在于检索过程,unity本身,不会卡住

在开始检索的时候,就基于检索过滤出来的文件组,进行赋值了;

更新函数逻辑; 是遍历这个协程,往MD5码字典里,添加MD5码数据,还有命名字典,添加命名数据,如果遍历字典,存在相同的Key,也就是有了,相同的文件,就往容器里添加,并且最大值MaxCount自增; 遍历到最后,通过EditorApplication.update -= Update移除更新函数,同时过滤掉,非重复文件

过滤逻辑,总数Count > 1的,才是重复文件,加到结果容器即可

绘制进度条的颜色变化逻辑

点击“开始搜索”按钮之后

显示检索结果的两个列表

这个工具是用来,批量处理,射线点击检测raycastTarget的开关

逻辑入口

具体逻辑实现; 有两个列表组,分别是,要勾选射线检测的,和 取消勾选射线检测的;

批量勾选的脚本逻辑,其中的HideIf标签,判断是,如果设置完成,或者要设置的列表数量为0,这个按钮就不会显示; 拿到所有的Graphic Component组件,将它的raycastTarget设置为true即可; 通过IsPartOfPrefabInstance和IsPartOfPrefabAsset两个接口,判断是预制体,还是实例化出来的实体,调用SavePrefabAsset或ApplyPrefabInstance接口,去保存即可; 最后再AssetDatabase.Refresh刷新一下资源数据库即可

也就是批量处理,这个的相关设置

取消勾选射线检测,逻辑基本是相同的,只是raycastTarget的设置,批量弄成false即可;

选择,点击,表现正常