Unity 在屏幕边界显示追踪目标提示

最近有一个需求是仿照原神的地图在屏幕边界显示任务和人物的追踪指引。

具体思路:

因为地图上的任务和人物图标本身就是UI,可以通过Transform.TransformPoint将对应的任务和人物图标转换为世界坐标,再通过Transform.InverseTransformPoint将世界坐标转换为本地坐标,这两个方法需要保证层级的正确。

下面是代码:

    /// <summary>
    /// 边界追踪
    /// </summary>
    /// <param name="vector">追踪目标坐标</param>
    void EdgeTracking(Vector3 vector)
    {
        /// m_Trans  追踪目标UI的父级
        /// m_Panel  边缘指引UI的父级
        /// m_Tracking 边缘指引UI
        /// ui_Screen_Width/ui_Screen_Height UI的屏幕分辨率
        /// defaultAspectRatio ui的宽高比
        var worldPos = m_Trans.TransformPoint(m_Point.anchoredPosition);
        var nowPos = m_Panel.InverseTransformPoint(worldPos);
        if (Mathf.Abs(nowPos.x) > ui_Screen_Width || Mathf.Abs(nowPos.y) > ui_Screen_Height)
        {
            var currentAspectRatio = Mathf.Abs(nowPos.x) / Mathf.Abs(nowPos.y);
            var currentPos = Vector2.zero;
            if (currentAspectRatio > defaultAspectRatio)
            {
                var valueX = nowPos.x / Mathf.Abs(nowPos.x) * ui_Screen_Width;
                currentPos = new Vector2(valueX, nowPos.y * Mathf.Abs(valueX / nowPos.x));
            }
            else
            {
                var valueY = nowPos.y / Mathf.Abs(nowPos.y) * ui_Screen_Height;
                currentPos = new Vector2(nowPos.x * Mathf.Abs(valueY / nowPos.y), valueY);
            }
            m_Tracking.anchoredPosition = currentPos;
            m_Tracking.localEulerAngles = new Vector3(0, 0, Mathf.Atan2(currentPos.y, currentPos.x) * Mathf.Rad2Deg);
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值