【Unity】【UGUI】映射3D坐标到UI上(血条、人物状态)

44 篇文章 4 订阅
19 篇文章 1 订阅

前言:

把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:

我感觉这个方法并不是性能最优,后面还以再研究怎么优化。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值