【Unity】【UGUI】對映3D座標到UI上(血條、人物狀態)

魔術師Dix發表於2020-12-27

前言:

把3D座標對映到UI上,這種操作多用於類似血條、人物名之類的東西:

這種其實是可以整個通用的方法來解決的:通過3D座標直接修改UI控制元件的位置:

 

正文:

需求很明瞭簡潔,所以直接上程式碼:


    /// <summary>
    /// 通過世界座標設定UI的位置
    /// </summary>
    /// <param name="rectTransform"></param>
    /// <param name="worldPos"></param>
    public static void Do_SetUIPositionByWorldPos(this RectTransform rectTransform, Vector3 worldPos)
    {
        if (rectTransform == null)
            return;

        if (uiCamera == null)
            return;

        Vector3 screenPos = worldCamera.WorldToScreenPoint(worldPos);
        // Z小於0,代表在相機後面,此時X、Y反向;
        if (screenPos.z < 0)
        {
            screenPos.x *= -1;
            screenPos.y *= -1;
        }

        Vector3 uiWorldPos = uiCamera.ScreenToWorldPoint(screenPos);
        rectTransform.position = uiWorldPos;
        rectTransform.Do_SetLocalPosZ(0);
    }

    public static void Do_SetLocalPosZ(this Transform t, float z)
    {
        Vector3 localPos = t.localPosition;
        localPos.z = z;
        t.localPosition = localPos;
    }

上文中的 worldCamera 是指照3D物體的相機。

uiCamera是指照射UI的相機。

注意區分。

 

PS:

這個方法要放在一個靜態類裡,如果不明白這種寫法可以去搜尋C#類擴充套件。

PS2:

我感覺這個方法並不是效能最優,後面還以再研究怎麼優化。

 

 

相關文章