目录

Unity-UGUI下实现精确点击的一种方式

Unity UGUI下实现精确点击的一种方式

比如有这样一个情况,UI的显示区域是个圆形,在点击的时候也需要精确点击到这个圆形显示区域,但是UI元素的RectTransform是个矩形

https://i-blog.csdnimg.cn/direct/4c8bf4e2fd844b5ca04135a0509af07b.png

1. 使用脚本修改

https://i-blog.csdnimg.cn/direct/e5eab21b2ceb4db5ad1212f816afb22a.png

2. 原理探究

此脚本继承了Image组件,但是获取了自身的Collider2D,目的是为了通过Collider2D检测点击操作时的射线检测是否在Collider2D的范围内,从而达到精确点击的效果,重写IsRaycastLocationValid方法

https://i-blog.csdnimg.cn/direct/b6a48ed4889a4545b2e992f68ae3f0f9.png

原先的方法会判断透明度,再判断是否在RectTransform范围内。

这里最终是使用Collider2D的OverlapPoint方法,但传入的需要是世界空间中的点。所以涉及到一个坐标转换的问题。

https://i-blog.csdnimg.cn/direct/81a6fcfd4c494a2bbc81a0f4515c508b.png

当Canvas是Overlay的模式,此时不存在eventCamera,那就先通过RectTransformUtility.ScreenPointToLocalPointInRectangle方法将屏幕坐标转换到UI元素的本地坐标,再通过rectTransform.TransformPoint方法转换到世界坐标。

当Canvas是Camera/WorldSpace模式时,注意,此时Camera需要是正交的才可以直接使用ScreenToWorldPoint方法,如果相机是透视的,需要设置传入的screenPoint的Z不为0,将被设置为想要得到的坐标Z - 相机的坐标Z