首页 > 解决方案 > 连续旋转 90 度无法获得初始角度

问题描述

我有一个游戏对象每两秒旋转 90 度,使对象的 Z 旋转有 4 个可能的值。由于初始 Z 旋转为 45,其他值将是 135、225 和 315。每次游戏对象旋转时,它都会在字典中查找其当前的 Z 旋转:

static public Dictionary<int, string> rotDirection = new Dictionary<int, string>{
        {45, "NE"},
        {135, "SE"},
        {225, "SW"},
        {315, "NW"},
    };

然而,它没有找到初始值 (45),因为它在旋转中得到的实际上是 44。为什么会发生这种情况?

float timer;
    void FixedUpdate()
    {
        timer -= Time.deltaTime;
        if (timer <= 0.0f)
        {
            timer += Constants.cannonRotationTime;

            //transform's initial (z) rotation is 45
            transform.Rotate(0.0f, 0.0f, 90);
            int angle = (int)transform.rotation.eulerAngles.z;
            Debug.Log("Angle: " + angle + ", direction: " +
            (Constants.rotDirection.ContainsKey(angle) ?
                Constants.rotDirection[angle] : "*NOT FOUND*"));
        }

还有一件奇怪的事情。如果我将游戏对象的初始 (Z) 旋转设置为 135,则找到所有值,它会旋转到 45 而不是 44:

在此处输入图像描述

现在,如果我将其设置为 225 或 315,则没有新的旋转是有意义的,这就是我得到的:

在此处输入图像描述

为什么会发生这种情况,我该如何避免?

标签: unity3drotationeuler-angles

解决方案


还有一个专用函数可以舍入到整数,而无需之前必须强制转换:

Mathf.RoundToInt(float var)

int angle = Mathf.RoundToInt(transform.rotation.eulerAngles.z)

推荐阅读