连续旋转 90 度无法获得初始角度

Continuously rotating by 90 doesn't get me the initial angle

我有一个游戏对象每两秒旋转 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,则没有新的旋转有意义,这就是我得到的:

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

你的代码对我来说工作正常。也许这里正在进行一些时髦的 float 到 int 转换?

即 44.99999° 变成 44.

int angle = (int)transform.rotation.eulerAngles.z;

你能Debug.Log在你把它转换成整数之前的角度吗?

它的四舍五入问题:你可以使用Mathf.Round

int angle = (int)Mathf.Round(transform.rotation.eulerAngles.z);

还有一个专门的函数可以舍入为整数,而无需在之前强制转换:

Mathf.RoundToInt(浮动变量)

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