RectTransform.SetSizeWithCurrentAnchors的实例应用

记得之前写过一个一篇文章《Unity3D UGUI运行时实现Editor视窗中的UI编辑功能》当时用到了一个UGUI的API RectTransform.SetInsetAndSizeFromParentEdge ,后来又看到有另一个API,是RectTransform.SetSizeWithCurrentAnchors详细的看了看官方文档的介绍,它说的意思是根据当前锚点布局去水平或垂直方向的改变,如果父rectTransform的size改变了,那么它的rect也会改变,所以最好不要把RectTransform的 anchors 设置为那几种可自适应拉伸的stretch,要么你就在父rectTransform改变时,重新再调用这个API再次。温故而知新,我又回头看了看之前的那篇文章和代码,觉得原先的实现方法并不好,尤其是调整了UI的Rotation后,对于边缘悬浮检测,以及拉伸UI的操作都是不正确的,所以决定换RectTransform.SetSizeWithCurrentAnchors这个API,从而实现边角悬浮旋转交互,以及各种角度下的拉伸操作。
首先我们回看之前的实现思路: 鼠标移动到控件边缘------>可以拖拽调整大小了--------->按下鼠标拖拽左侧边框时用先计算出此时距离父节点右侧边的距离和当前x轴方向上控件大小,算出鼠标x轴方向移动差值,利用这个API调整控件大小-------->松开鼠标操作结束。 它在UI控件有一定旋转角度时利用RectTransform.SetInsetAndSizeFromParentEdge去设置距离父节点RectTransform边缘的距离就是不对的,在这种情况下,我们如果用RectTransform.SetSizeWithCurrentAnchors这个API就可以,只不过我们要在计算在水平和垂直方向上的两个拉伸分量,去分别调用这个API,调整UI水平和垂直方向上的size,并且要利用拉伸量去重新计算下该控件的位置。
首先先探讨下检测可操作的实现思路,如图:RectTransform.SetSizeWithCurrentAnchors的实例应用_第1张图片
检测触发区域的数学模型
关于检测一个点是否在一个多边形内的算法问题,我们可以探讨下,我在这里简单写了一个数学工具类,用于解决这个问题。简单看下它的内容:
RectTransform.SetSizeWithCurrentAnchors的实例应用_第2张图片
我就简单写了两个类,一个是Line2D(有方向的线段),一个是Polygon2D。如果把一条线段看成是无限延长的直线,那么点和线的关系就归为三种:在直线的左侧,在直线的右侧,在直线上。这里的多边形,Polygon2D,我们看做是一组有向线段,按顺时针顺序连接成的一个封闭的多边形。我们想,给定一个点,如果它都在所有线段的同一侧(按顺时针是右侧),那是不是就可以确定它是在多边形内。于是我就采用这样的方式来计算当前鼠标是否在悬浮区域的四个多边形内,来判断是否触发可拉伸操作。
RectTransform.SetSizeWithCurrentAnchors的实例应用_第3张图片
其实呢,**这样的方法是错误的!!!!!!**因为上面的实例,我们只是给一个矩形(凸多边形),没问题,如果给你一个凹多边形,这样算就是错误的!!!你可以想象给你一个在“凹”中间小坑里的点……
关于点是否在一个多边形的问题,可以参考下一下的文章:
https://blog.csdn.net/lynon/article/details/82015834

https://blog.csdn.net/qq_39108767/article/details/89813886?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

有了这个思路,算法,那么旋转检测我们只需先判断如果不在拉伸区域,那么距离控件四个角的距离是否在我们规定的距离内,就可以判断是否在旋转触发区域就可以了。
拉伸的计算如图:
RectTransform.SetSizeWithCurrentAnchors的实例应用_第4张图片
这样算出RectTransform.SetSizeWithCurrentAnchors 的size参数,在拖拽完成时进行调用,同时还要算出此时UI控件中心点位置的变化,进行更新,就可以了。看下效果:

这个工具里的细节还有很多,比如UI控件的旋转问题,触发检测数值临界点的判断,在不同canvas模式下的坐标变化等等,不再一一展开说了,感兴趣的小伙伴可以下载源码自行查看,也希望能一起探讨,发现问题,再去完善。谢谢~
工程源码

你可能感兴趣的:(RectTransform.SetSizeWithCurrentAnchors的实例应用)