将世界空间GameObject位置转换为屏幕空间Canvas UI位置
解决屏幕空间(相机模式)Canvas中UI跟随世界物体的方法
WorldToScreenPoint得到的是屏幕像素坐标,但Screen Space - Camera模式下的UI元素,其位置是基于Canvas的局部空间(而非直接的屏幕像素),所以需要额外转换步骤:
具体实现步骤
- 获取世界物体的世界坐标,通过相机的
WorldToScreenPoint转换为屏幕坐标
- 获取世界物体的世界坐标,通过相机的
- 调用
RectTransformUtility.ScreenPointToLocalPointInRectangle,将屏幕坐标转换为UI元素在Canvas局部空间中的坐标
- 调用
- 将得到的局部坐标赋值给UI元素RectTransform的
anchoredPosition(而非直接赋值position,锚点会影响位置计算)
- 将得到的局部坐标赋值给UI元素RectTransform的
示例代码
using UnityEngine; public class WorldToUIFollower : MonoBehaviour { public Camera renderCamera; // 绑定渲染世界物体的相机(需与Canvas的Render Camera一致) public RectTransform canvasRect; // 绑定屏幕空间Canvas的RectTransform public RectTransform targetUI; // 绑定需要移动的UI元素 public Transform worldTarget; // 绑定世界空间中的目标物体 void Update() { if (worldTarget == null || targetUI == null || canvasRect == null || renderCamera == null) return; // 世界坐标转屏幕坐标 Vector3 screenPosition = renderCamera.WorldToScreenPoint(worldTarget.position); // 屏幕坐标转Canvas局部坐标 if (RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenPosition, renderCamera, out Vector2 localPosition)) { // 赋值给UI的锚定位置 targetUI.anchoredPosition = localPosition; } } }
关键注意事项
- 确保
renderCamera同时是渲染世界物体的相机和Canvas组件指定的Render Camera - 必须使用
anchoredPosition赋值,UI元素的锚点设置会直接影响最终显示位置 - 当世界物体不在相机视野内时,
ScreenPointToLocalPointInRectangle会返回false,可根据需求隐藏UI或做边界处理
内容的提问来源于stack exchange,提问作者stroibot
相关产品推荐
相关产品推荐

