这个是,实现遮罩的逻辑 ![[Pasted image 20240306161852.png]] 继承自 ![[Pasted image 20240306161935.png]] 这是重写ugui重绘 ![[Pasted image 20240306162017.png]] 在重绘的最开始,先把原本的渲染清空 ![[Pasted image 20240306165459.png]] 这里是获取uv信息: ![[Pasted image 20240306162033.png]] uv有四个角,在坐标系,所以是Vector4 ![[Pasted image 20240306162117.png]] 然后,获取uv高度和宽度 计算uv中心和比例 radian是每一块的弧度 ![[Pasted image 20240306165844.png]] ![[Pasted image 20240306170005.png]] 原始坐标,和锚点pivot进行计算处理,防止轴心点问题 ![[Pasted image 20240306172546.png]] ![[Pasted image 20240306172700.png]] 这里是最开始的绘制,原始顶点 ![[Pasted image 20240306171837.png]] 原始颜色 ![[Pasted image 20240306172022.png]] 逐弧度递增,对颜色进行赋值; 跟百分比有关,如果在范围内,就是正常颜色,否则,置灰 ![[Pasted image 20240306170231.png]] 表现: ![[Pasted image 20240306170622.png]] ![[Pasted image 20240306170332.png]] 获得三角面函数: ![[Pasted image 20240306170438.png]] 结构上,是相邻的: ![[Pasted image 20240306170457.png]] 逻辑实现,也是如此,中间的是圆心0 ![[Pasted image 20240306170529.png]] 还有检测点击的逻辑重写: 通过屏幕空间,转换成本地空间,得到一个localPoint ![[Pasted image 20240306170747.png]] ![[Pasted image 20240306170953.png]] 检测点击的算法,就是点击的点,画一根线,如果跟图片,交点总数,是奇数,就说明在图片内,就是点击有效,如果交点总数,是偶数,就说明在图片外,点击无效 ![[Pasted image 20240306173110.png]] 也是用到了前面填充的,有效_vertexList顶点列表; 除以2,看奇偶 ![[Pasted image 20240306171054.png]] 具体实现,也是遍历顶点列表,然后,对比本地空间,和顶点距离范围,计算相交点总数 ![[Pasted image 20240306171157.png]] ![[Pasted image 20240306170843.png]] 这是一个3D滚轮,最终运行的效果,可以看到,实际上,只是一个2d的界面,是通过算法处理,呈现3D效果 ![[Pasted image 20240322170231.png]] 逻辑上,每个图片,都会上一个RotationDiagramItem,进行统一管理; 其中包含,位置ID,拖曳移动,对应的Action回调函数,移动的_offsetX偏移;动画的时间_aniTime,用在Dotween动画插件,还有协程的时间等待; 图片和GUI矩形的获取器; ![[Pasted image 20240322170624.png]] 各个设置接口,设置结构父类,图片值; 设置位置信息,调用了Dotween相关的DOAnchorPos和DOScale接口,分别是修改坐标,还有缩放; 然后调用,协程Wait函数,等待动画事件_aniTime过渡之后,通过SetSiblingIndex,修改层级次序; ![[Pasted image 20240322171028.png]] 继续,是两个拖曳函数,还有注册移动监听函数; 另外,每个图片Item体,都会有一个位置PosId,拖曳旋转之后,这个需要,配合总Item数目,重新换算; ![[Pasted image 20240322171345.png]] 位置信息、缩放、层级次序,构成一个ItemPosData的数据类; 位置坐标PosId是一个图片ItemData的结构体; ![[Pasted image 20240322171538.png]] 游戏内,挂载的脚本是这个 ![[Pasted image 20240322171641.png]] 对应的逻辑,其中ItemSize是设置,每个图片Item的大小; ItemSprites就是图片数组,用来存储,需要实例化出来,展示的图片集合; Offset就是两个图片之间的间距偏移; ScaleTimesMin 和 ScaleTimesMax,就是在切换过程中,最小和最大的缩放值; ![[Pasted image 20240322171819.png]] 各个功能函数接口:创建一个命名为Template的子实体,大小尺寸,设定为ItemSize的大小,再添加图片和RotationDiagramItem组件; 调用RotationDiagramItem组件的接口,完成父物体的赋值; 添加拖曳移动的监听,是Change函数; 完成以上操作后,就可以加到_items队列容器; Change函数,是其中一个,根据偏移的正负,三元运算,得到symbol方向,再调用另一个Change函数; ![[Pasted image 20240322172132.png]] 两个函数重载 ![[Pasted image 20240322173308.png]]