我对Unity关于Euler角度的一些文档感到有点困惑。我只是想知道我是否不理解差异,或者样本没有遵循最佳实践。文档here 规定:
仅使用此变量读取并将角度设置为绝对值。不要增加它们,因为当角度超过360度时它会失败。改为使用Transform.Rotate。
同时,代码示例似乎使用可能超过360度的增量:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public float yRotation = 5.0F;
void Update() {
yRotation += Input.GetAxis("Horizontal");
transform.eulerAngles = new Vector3(10, yRotation, 0);
}
void Example() {
print(transform.eulerAngles.x);
print(transform.eulerAngles.y);
print(transform.eulerAngles.z);
}
}
如果变量超过360度,不会递增变量然后使用该变量设置值绝对仍会超过360度吗?
答案 0 :(得分:2)
当您使用欧拉角旋转对象时,当它达到360并尝试进一步超越时,它变为(减)-360并逐渐从-359增加到-1。
执行以下代码后,您的值不会超过360,并保持正值。
float rotateAngle = rotateObject.transform.localEulerAngles.y;
// Convert negative angle to positive angle
rotateAngle = (rotateAngle > 180) ? rotateAngle - 360 : rotateAngle;
rotateObject.transform.localEulerAngles = new Vector3(rotateObject.transform.localEulerAngles.x, rotateAngle, rotateObject.transform.localEulerAngles.z);
答案 1 :(得分:1)
存在差异。在做的时候:
transform.eulerAngles.y += 1F;
您正在调用+=
中的Vector3
运算符。
但是,当您以这种方式设置eulerAngles
时:
float newY = transform.eulerAngles.y + 1F;
transform.eulerAngles = new Vector3(.., newY, ..);
您正在Transform
中调用一个setter,在此setter中,它可能包含更新Transform.rotation
的操作。
不同之处在于Unity可以在Transform
类而不是Vector3
类中实现更新逻辑,这在那里更有意义。
我们可以在documentation:
下面进一步验证不要单独设置一个eulerAngles轴(例如,eulerAngles.x = 10; )因为这会导致漂移和不希望的旋转。什么时候 如上所示,将它们设置为新值会立即设置它们。的统一 将角度转换为存储的旋转角度 Transform.rotation 强>