You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将世界空间GameObject位置转换为屏幕空间Canvas UI位置

解决屏幕空间(相机模式)Canvas中UI跟随世界物体的方法

WorldToScreenPoint得到的是屏幕像素坐标,但Screen Space - Camera模式下的UI元素,其位置是基于Canvas的局部空间(而非直接的屏幕像素),所以需要额外转换步骤:

具体实现步骤

    1. 获取世界物体的世界坐标,通过相机的WorldToScreenPoint转换为屏幕坐标
    1. 调用RectTransformUtility.ScreenPointToLocalPointInRectangle,将屏幕坐标转换为UI元素在Canvas局部空间中的坐标
    1. 将得到的局部坐标赋值给UI元素RectTransform的anchoredPosition(而非直接赋值position,锚点会影响位置计算)

示例代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:39:13