unity3d - 连续旋转 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,则没有新的旋转是有意义的,这就是我得到的:
为什么会发生这种情况,我该如何避免?
解决方案
还有一个专用函数可以舍入到整数,而无需之前必须强制转换:
Mathf.RoundToInt(float var)
int angle = Mathf.RoundToInt(transform.rotation.eulerAngles.z)