一、先记住 4 种坐标(UGUI 必懂)
- 屏幕坐标 Screen 鼠标坐标、Input 输出的都是这个,左下角 (0,0),右上角 (Screen.width, Screen.height)
- 世界坐标 World transform.position,3D 通用坐标
- 本地坐标 Local transform.localPosition,相对于父节点的坐标
- UI 锚点坐标 Anchored rectTransform.anchoredPosition,UGUI 专用,相对于锚点的坐标
二、最常用坐标转换 API(直接背)
1. UI 自身 本地坐标 → 屏幕坐标
cs
Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(
Camera.main,
rectTransform.TransformPoint(localPos)
);
2. UI 锚点坐标 → 屏幕坐标
cs
Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(
uiCamera,
rectTransform.position
);
3. 屏幕坐标 → UI 锚点坐标(最常用!拖拽、跟随鼠标)
cs
RectTransformUtility.ScreenPointToLocalPointInRectangle(
父节点RT,
screenPos,
uiCamera,
out Vector2 anchoredPos
);
4. 屏幕坐标 → UI 世界坐标
cs
RectTransformUtility.ScreenPointToWorldPointInRectangle(
父节点RT,
screenPos,
uiCamera,
out Vector3 worldPos
);
5. 世界坐标 → 屏幕坐标
cs
Vector2 screenPos = RectTransformUtility.WorldToScreenPoint(camera, worldPos);
6. UI 本地坐标 ↔ 世界坐标
cs
// 本地 → 世界
Vector3 world = rectTransform.TransformPoint(localPos);
// 世界 → 本地
Vector3 local = rectTransform.InverseTransformPoint(worldPos);
7. 任意 UI 坐标 → 另一个 UI 的本地坐标(跨父节点对齐神器)
cs
// A 坐标 → 世界 → B 本地
Vector3 world = targetRT.TransformPoint(localPosA);
Vector3 localInB = myRT.InverseTransformPoint(world);
8. 获取 UI 四个角的屏幕坐标
cs
Vector3[] corners = new Vector3[4];
rectTransform.GetWorldCorners(corners);
// 然后转屏幕
Vector2 screenLB = RectTransformUtility.WorldToScreenPoint(uiCamera, corners[0]);
三、Canvas 渲染模式区别(超级关键)
- Screen Space - Overlay 相机传 null
- Screen Space - Camera 传 Canvas.worldCamera
- World Space 传 主相机
四、最常用 4 句背下来就够(90% 场景)
- 屏幕 → UI 锚点
ScreenPointToLocalPointInRectangle - UI → 屏幕
WorldToScreenPoint - 跨父节点 UI 对齐
TransformPoint+InverseTransformPoint - 取 UI 四角
GetWorldCorners