unity 实现UI元素跟随3D物体

在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();
    }
    /// 
    /// 更新image位置
    /// 
    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;
        }
    }
}

效果如下:

unity 实现UI元素跟随3D物体_第1张图片

你可能感兴趣的:(unity 实现UI元素跟随3D物体)