从水平和垂直轴获取角度

时间:2019-04-09 16:53:28

标签: c# unity3d

试图实现一种基于垂直轴和水平轴来统一旋转对象的方法,该方法由光标在图像上的位置确定。

创建带有操纵杆的3D游戏。目的是使用操纵杆旋转。 图片示例: https://imgur.com/a/hd9QiVe 随着用户按下并返回,绿色圆圈移动 X和Y值介于-1至1之间,中间为0。 只是为了可视化输入的发生方式: https://imgur.com/a/8QVRrIh 如图中所示,我只是想要一个角度或一种在检测到用户输入的方向上移动对象的方法。

尝试了几种使用atan和tan来计算角度的方法,但是我的数学很糟糕,我不能完全确定我首先获得了正确的值。

//背景操纵杆是指第一张图片中的白色圆圈

        pos.x = (pos.x / backgroundJoystick.rectTransform.sizeDelta.x);
        pos.y = (pos.y / backgroundJoystick.rectTransform.sizeDelta.y);
        inputVector = new Vector3(pos.x * 2f, 0, pos.y * 2f);
        inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;

//抓取轴输入

public float Horizontal()
{
    if (inputVector.x != 0)
    {
        return inputVector.x;
    }
    else
        return Input.GetAxis("Horizontal");
}

public float Vertical()
{
    if (inputVector.z != 0)
    {
        return inputVector.z;
    }
    else
        return Input.GetAxis("Vertical");
}

如代码所示,对于垂直和水平方向,input.getaxis必须有角度才能将对象指向该角度。 当前使用的公式不提供任何角度。

1 个答案:

答案 0 :(得分:1)

如果要获取向量的角度,请使用Vector2.SignedAngle()

var inputAngle = Vector2.SignedAngle(Vector2.right, inputVector);

角度是相对的,这就是为什么需要将Vector2.right指定为第一个参数的原因。还有一个Vector2.Angle()方法,但是该方法仅返回两个角度之间的距离,而没有考虑方向。

如果您需要验证输入矢量是否正确,请使用Debug.Log()打印inputVector