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

5.5 KiB
Raw Permalink Blame History

继续看控件逻辑; 继承自UIBehaviour逻辑它本身也是继承自MonoBehaviour还有按钮点击的IPointerClickHandler 然后,就是序列化,各个按钮点击相关

!Pasted image 20240315112250.png

!Pasted image 20240315112334.png

这个控件主要是用于animationTime控制动画播放时间和多久可以触发一次按钮invokeIntervalTime

!Pasted image 20240315112428.png

触发和调用本身,是用的协程

!Pasted image 20240315112653.png

样式

!Pasted image 20240315112703.png

重置按钮相关逻辑就是置空动画控制器播放时间和触发时间归零通过UnityEventTools移除动画事件

!Pasted image 20240315112726.png

!Pasted image 20240315124232.png

运行游戏,点击,效果也是正常的,实时修改也可以; 需要注意的是两时间是有制约关系的间隔时间是需要等动画播放完毕才可以下一次点击所以这里设置了MinValue最小值就是按钮动画播放时间

!Pasted image 20240315124452.png

!Pasted image 20240315124547.png

这是一个遍历创建Asset文件的脚本可以看到是继承自OdinMenuEditorWindow的先拿到自己创建的类

!Pasted image 20240315133039.png

会重写BuildMenuTree

!Pasted image 20240315134042.png

是创建预制体的核心逻辑; 设置是在menutree中选中的预制体作为asset命名 在targetFolder目标文件夹中创建即可 其中预览Object实体是在BuildMenuTree函数重写的逻辑里完成初始化 参考:Activator.CreateInstance 方法

!Pasted image 20240317184158.png

!Pasted image 20240317184914.png

会根据选中的物体,如果是文件夹,就直接把它,当作目标文件夹;如果选中的物体,是文件,就拿它所在的文件夹,作为目标文件夹; 使用Trim处理修剪一下路径分割符号然后显示窗体即可

!Pasted image 20240317184427.png

表现

!Pasted image 20240319103329.png

!Pasted image 20240319103354.png

这是收集UI节点的工具类

!Pasted image 20240319105656.png

在Canvas画布创建一个空节点

!Pasted image 20240319105732.png

加上这个工具类

!Pasted image 20240319105803.png

其中的UINode列表包含一个UINodeGroup类

!Pasted image 20240319105934.png

!Pasted image 20240319110010.png

点击+加号,会新增这个类对应的,绘制结构

!Pasted image 20240319110032.png

其中节点类型的命名选择是遍历UnityEngine.UI拿到对应的Name字段即可

!Pasted image 20240319110110.png

而Nodes节点的选择就是检索所选物体ChildGameObjectsOnly子物体下归属UnityEngine.UI里面的节点 其中的逻辑也验证了是否为选中的UI类型控件

!Pasted image 20240319110226.png

如果不是所选的UI类型控件会显示这个报错提示

!Pasted image 20240319112959.png

在测试的空节点创建3个ui组件

!Pasted image 20240319112633.png

先检索出来Image图片类

!Pasted image 20240319112657.png

点+号,如逻辑所示,检索出子物体

!Pasted image 20240319112804.png

如果选择了非Image类型的话如逻辑所示会出现验证提示

!Pasted image 20240319112829.png

修改成正确的类型,即可

!Pasted image 20240319113049.png

!Pasted image 20240319113108.png

按钮和文本的ui控件也是相同处理

!Pasted image 20240319113151.png

先加一个,对应面板的脚本

!Pasted image 20240319113216.png

加一个 partial 关键字 参考partial分部类和方法即可

!Pasted image 20240319113253.png

加上

!Pasted image 20240319113404.png

填上,点击

!Pasted image 20240319113433.png

!Pasted image 20240319113451.png

对应逻辑; 文件后缀Extensions限制是"cs, lua"拿到对应类的名称然后生成的类命名后缀会加上字符Extention

!Pasted image 20240319113520.png

添加注释说明还有命名空间主要使用StringBuilder实现即可

!Pasted image 20240319113725.png

创建一个Node也是遍历uINodes里面节点组创建即可

!Pasted image 20240319113842.png

最后使用StreamWriter文件流创建新的脚本文件即可

!Pasted image 20240319114021.png

这里有一个判断,是重名元素的

!Pasted image 20240319114104.png

是遍历节点组,查看是否有重复元素

!Pasted image 20240319114124.png

整一个字符串类使用GroupBy处理如果相同字符串的总数大于1就输入提示

!Pasted image 20240319114153.png

!Pasted image 20240319114334.png

测试一下添加一个Button下跟Text控件同名的子组件

!Pasted image 20240319114456.png

!Pasted image 20240319114506.png

点击,重复提示,正常

!Pasted image 20240319114534.png

删掉测试的Text重新点击

!Pasted image 20240319114607.png

自动创建出来了

!Pasted image 20240319114620.png

脚本内容

!Pasted image 20240319114650.png

编辑器表现:

!Pasted image 20240319114733.png

为组件赋值从className类名这里是TestPanel配合uINodes列表遍历拿到对应的targetValue组件再通过SetValue设置值即可

!Pasted image 20240319114801.png

点击,正常生效

!Pasted image 20240319115029.png

在这个脚本创建一个,按钮点击的逻辑

!Pasted image 20240319115121.png

运行,点击正常

!Pasted image 20240319115150.png