obsidian/笔记文件/2.笔记/odin入门和进阶_第五章.md
2025-03-26 00:02:56 +08:00

5.3 KiB
Raw Blame History

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

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

!Pasted image 20240319120058.png

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

!Pasted image 20240319120011.png

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

!Pasted image 20240319120348.png

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

!Pasted image 20240319121004.png

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

!Pasted image 20240319121647.png

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

!Pasted image 20240319121722.png

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

!Pasted image 20240319121759.png

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

!Pasted image 20240319122017.png

测试,表现正常

!Pasted image 20240319122117.png

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

!Pasted image 20240319125220.png

使用CreateInstance创建ScriptableObject实体

!Pasted image 20240319125519.png

入口

!Pasted image 20240319125604.png

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

!Pasted image 20240319125625.png

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

!Pasted image 20240319125711.png

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

!Pasted image 20240319125905.png

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

!Pasted image 20240319130019.png

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

!Pasted image 20240319130107.png

!Pasted image 20240319130126.png

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

!Pasted image 20240319130334.png

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

!Pasted image 20240319130348.png

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

!Pasted image 20240319130422.png

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

!Pasted image 20240319130454.png

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

!Pasted image 20240319130822.png

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

!Pasted image 20240319131010.png

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

!Pasted image 20240319131047.png

显示检索结果的两个列表

!Pasted image 20240319131102.png

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

!Pasted image 20240319131403.png

逻辑入口

!Pasted image 20240319131943.png

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

!Pasted image 20240319131956.png

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

!Pasted image 20240319132145.png

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

!Pasted image 20240319132359.png

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

!Pasted image 20240319132638.png

选择,点击,表现正常

!Pasted image 20240319132827.png