1. 程式人生 > >unity 實現UI元素跟隨3D物體

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(); } /// <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; } } }

效果如下:

這裡寫圖片描述