此方法会将屏幕坐标点转换为UI的本地坐标点,即UI子物体相对于父物体的相对位置。不过值得注意的是:当父物体的锚点不在中心时,可能比较麻烦,因为UI的本地坐标是相对于父物体的锚点来计算的。
RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, eventData.position, eventData.pressEventCamera, out localPoint)
-
parentRectTransform
:这是要进行坐标转换的RectTransform的父级RectTransform。它定义了坐标转换的参考系。通常,你会将父级RectTransform设置为UI元素所在的Canvas的RectTransform。 -
eventData.position
:这是事件数据的屏幕坐标。它表示鼠标或触摸事件发生的位置。 -
eventData.pressEventCamera
:这是事件数据的相机。它表示事件发生时使用的相机。对于UI事件,通常使用UI相机(例如Canvas上的UI Camera)。 -
localPoint
:这是一个输出参数,用于存储转换后的本地坐标。方法执行后,将通过这个参数返回转换后的坐标值。
假设鼠标点击a物体(都为UI元素,下同),而a物体的父物体为A,如果A相对于Canvas,其锚点在Canvas的中心点,那么使用RectTransformUtility.ScreenPointToLocalPointInRectangle方法,将父物体,鼠标指针位置,渲染Canvas的相机(若为Overly则为null),传入,得到的localPoint就是a的PosX和PosY。但是如果A的锚点不在Canvas的中心,那么得到的localPoint就不会是预期值了。
如果子物体的父物体的锚点不在中心,可以在子物体上再套一个空物体,将空物体的锚点设为父物体的中心,则完美解决。