1

注意:尽管这个问题是在我使用 Unity 时出现的,但它与 Unity 无关,更多的是关于编程逻辑,所以请不要回避。

我正在使用 Unity 并通过脚本旋转对象。问题是,如果我将它旋转到 180 度,物体不会完全旋转到那么多,并且往往会停在 179 到 181 度之间。因此,为了检查旋转是否完成,我检查旋转角度是否为 targetAngle +/- 1,它有效。

我检查使用

if (transform.eulerAngles.z > lowerLimit && transform.eulerAngles.z < upperLimit)

在哪里

lowerLimit = targetAngle-1;
upperLimit = targetAngle + 1;

现在,当 targetAngle 为 0 时出现问题。在这种情况下,我的脚本检查旋转角度是否在 -1 和 1 之间。但是,-1 应该是 359,所以它需要检查角度是否在 359 和 1 之间.

我该如何实施?换句话说,我想我在问如何实现一个环绕数字系统。

编辑

找到了一种解决方法。如果targetAngle为0,我对待是特殊的。它有效,但不是最优雅的。

         if (targetAngle == 0.0)
        {
            if ((transform.eulerAngles.z > 359.0 && transform.eulerAngles.z <= 360.0) || (transform.eulerAngles.z >= 0.0 && transform.eulerAngles.z <= 1)) 
            {
                rotate = false;            
            }
        }
        else
        {
            if (transform.eulerAngles.z > targetAngle - 1 && transform.eulerAngles.z < targetAngle + 1)
            {
                rotate = false;            
            }
        }
4

2 回答 2

3

你可以做...

lowerLimit = (targetAngle % 360) + 359; //360 - 1;
upperLimit = (targetAngle % 360) + 361; //360 + 1;

if (((transform.eulerAngles.z + 360) % 360) > lowerLimit
 && ((transform.eulerAngles.z + 360) % 360) < upperLimit)

这将检查从零移开,您不必处理正/负检查。

编辑

%操作员将targetAngle旋转限制在 +/-359 度,因此 721 的目标角度将下降到 1,而 -359 的目标角度将下降到 1。这对于我认为的所有情况都应该很好。

编辑 2

要解决您在评论中提到的最后一种情况,我想您需要对您的transform.eulerAngles.z值应用相同的包装逻辑。现在最好把这个包装放在一个额外的函数中,所以试试这个:

int wrapNumber(int input) // replace int with whatever your type is
{
  // this will always return an angle between 0 and 360:
  // the inner % 360 restricts everything to +/- 360
  // +360 moves negative values to the positive range, and positive ones to > 360
  // the final % 360 caps everything to 0...360
  return ((input % 360) + 360) % 360;
}

lowerLimit = wrapNumber(targetAngle) + 359; //360 - 1;
upperLimit = wrapNumber(targetAngle) + 361; //360 + 1;

if (wrapNumber(transform.eulerAngles.z) + 360 > lowerLimit
 && wrapNumber(transform.eulerAngles.z) + 360 < upperLimit)

根据您需要使用它的频率,检查某些情况可能会消除不必要的开销。例如,% 360仅当输入为正时才需要 final 的 wrapNumber。如果您每分钟调用十次,则可能无关紧要。如果你每秒调用它一百次,你可能想检查它在这种情况下的表现。

于 2011-07-17T10:22:41.463 回答
1

这可能是一个旧线程,但是在查看了许多尝试处理 Wrapping 的不同片段后,我发现 Unity 有一个很好的内置函数,可以简单地处理业务,至少在我的情况下,我需要的最终结果是一个 lerp 所以我只需要将其更改为 LerpAngle,它就返回了可靠的结果。

Mathf.LerpAngle 是你的朋友.. 解决了我所有的弹出等问题。

http://docs.unity3d.com/ScriptReference/Mathf.LerpAngle.html

于 2015-11-18T08:47:08.880 回答