unity 箭头看向某个点

18 篇文章 0 订阅
此篇博客介绍了如何在Unity中使用Transform.LookAt()函数,根据给定位置调整3D箭头的方向,并通过屏幕坐标计算旋转角度以实现精确指向。作者详细展示了如何处理不同方向的输入并更新箭头的朝向。
摘要由CSDN通过智能技术生成
    void LookAtPos(Transform arrow,Vector3 pos)
        {
            Vector2 screenPos = Camera.main.WorldToScreenPoint(transform.position);
            Debug.Log(transform.position);
            Debug.Log(screenPos);

            arrow.transform.LookAt(pos);                                          
            Vector2 arrowPos = Camera.main.ViewportToScreenPoint(arrow.transform.position);
            Vector2 newPos = Camera.main.ViewportToScreenPoint(pos);
            float dirY = newPos.y - arrowPos.y;
            float dirX = newPos.x - arrowPos.x;
            float arrowRotationZ = 0f;
            if (dirX >= 0)
            {
                if (dirX == 0)
                {
                    if (dirY > 0)
                    {
                        arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 90f);
                    }
                    else if (dirY < 0)
                    {
                        arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f - 90f);
                    }
                    else
                    {
                        arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 90f);
                    }
                }
                else
                {
                    if (dirY > 0)
                    {
                        arrowRotationZ = Mathf.Atan2(Mathf.Abs(dirY), Mathf.Abs(dirX)) * 180f / Mathf.PI;
                        Debug.Log("角度值:" + arrowRotationZ);
                        arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f + arrowRotationZ);
                    }
                    else if (dirY < 0)
                    {
                        arrowRotationZ = Mathf.Atan2(Mathf.Abs(dirY), Mathf.Abs(dirX)) * 180f / Mathf.PI;
                        arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f - arrowRotationZ);
                    }
                    else
                    {
                        arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f);
                    }
                }
            }
            else
            {
                if (dirY > 0)
                {
                    arrowRotationZ = Mathf.Atan2(Mathf.Abs(dirY), Mathf.Abs(dirX)) * 180f / Mathf.PI;
                    arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 180f - arrowRotationZ);
                }
                else if (dirY < 0)
                {
                    arrowRotationZ = Mathf.Atan2(Mathf.Abs(dirY), Mathf.Abs(dirX)) * 180f / Mathf.PI;
                    arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 180f + arrowRotationZ);
                }
                else
                {
                    arrow.transform.rotation = Quaternion.Euler(0f, 0f, 360f + 180f);
                }
            }
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值