在Canvas不同的渲染模式(RenderMode)下实现UI跟随3D物体

当Canvas.RenderMode为Screen Space-Overlay时

 利用WorldToScreenPoint(worldPos)将物体的世界坐标转换成屏幕坐标,实时更新UI的坐标:

using UnityEngine;
using System.Collections;

public class FollowWorldObj : MonoBehaviour {
    [SerializeField]
    GameObject worldPos;//3D物体(人物)
    [SerializeField]
    RectTransform rectTrans;//UI元素(如:血条等)
    public Vector2 offset;//偏移量

    // Update is called once per frame
    void Update () {
        Vector2 screenPos=Camera.main.WorldToScreenPoint(worldPos.transform.position);
        rectTrans.position = screenPos + offset;
    }
}

当Canvas.RenderMode为Screen Space-Camera时

利用RectTransformUtility.ScreenPointToLocalPointInRectangle换算出UI元素在Canvas的2D坐标:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

public class UI_FollowObj : MonoBehaviour {
    [SerializeField]
    Camera UI_Camera;//UI相机
    [SerializeField]
    RectTransform image;//UI元素
    [SerializeField]
    GameObject obj;//3D物体
    [SerializeField]
    Canvas ui_Canvas;
    // Update is called once per frame
    void Update () {
        UpdateNamePosition();
    }
    /// <summary>
    /// 更新image位置
    /// </summary>
    void UpdateNamePosition()
    {
        Vector2 mouseDown = Camera.main.WorldToScreenPoint(obj.transform.position);
        Vector2 mouseUGUIPos = new Vector2();
        bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(ui_Canvas.transform as RectTransform, mouseDown, UI_Camera, out mouseUGUIPos);
        if (isRect)
        {
            image.anchoredPosition = mouseUGUIPos;
        }
    }
}

转载自(侵删):https://blog.csdn.net/nnew_hande/article/details/78501309

这里着重强调一下RectTransformUtility.ScreenPointToLocalPointInRectangle这个方法:场景->屏幕->UI,所以当场景中的UI是相机模式的UI时,这个方法起到了转换作用

原文地址:https://www.cnblogs.com/xiaoahui/p/13624583.html