所以直到现在我还没有注意到这一点,但是当通过脚本更改它时,Unity 的旋转从 -180 到 180 。考虑到在检查器中更改时,旋转可以达到无穷大,我觉得这很奇怪,但这可能是由于某种我还不知道的原因。为什么这对我来说是个问题?好吧,我正在尝试将对象从当前旋转旋转回 0,它应该是逆时针旋转。当我旋转高达 180 度时,一切正常,任何高于此的旋转代码都不起作用,基本上我无法使对象旋转超过半圈。我觉得通过更标准和传统的 0 到 360 旋转,我可以更轻松地编写代码。 感谢任何反馈,提前致谢。
编辑:抱歉回复晚了,这是代码:
[ContextMenu("Rotate Chamber")]
public void RotateChamber()
{
StartCoroutine(RotateOverTime(60, 1f, true));
}
[ContextMenu("Reload Chamber")]
public void Reload()
{
float currentAngle = -chamber.localEulerAngles.z;
StartCoroutine(RotateOverTime(currentAngle, 5f, false));
}
private IEnumerator RotateOverTime(float angle, float duration, bool clockWiseRotation)
{
Quaternion startRotation = chamber.localRotation;
Quaternion targetRotation = chamber.localRotation * Quaternion.Euler(0, 0, clockWiseRotation ? -angle : angle);
float elapsedTime = 0f;
while (elapsedTime < duration)
{
chamber.localRotation = Quaternion.Lerp(startRotation, targetRotation, elapsedTime / duration);
elapsedTime += Time.deltaTime;
yield return null;
}
chamber.localRotation = targetRotation;
}
我不知道它会有多大帮助,因为这不是一些高级代码,而是非常基本的东西,但无论如何还是感谢您的帮助。
您正在寻找的方法是 Transform.RotateAround。
您采用的方法的问题在于四元数的工作方式 - 它代表一个向量可以修改为另一个向量的最短路径。因此,旋转超过 180 度是没有意义的 - 因为旋转 185 度本质上也是向另一个方向旋转 175 度。
您可以做的就是快速调用
RotateAround
,直到获得您感兴趣的角度。因此,将 angle
除以 duration
- 这就是您感兴趣的每秒旋转次数(乘以 Time.deltaTime
)。至于轴 - 我假设你想围绕 Transform.forward
旋转?
private IEnumerator RotateOverTime(float angle, float duration, bool clockWiseRotation)
{
float speed = angle / duration * (clockWiseRotation ? 1.0f : -1.0f);
float elapsedTime = 0f;
while (elapsedTime < duration)
{
chamber.RotateAround(chamber.position, chamber.forward, speed * Time.deltaTime;
elapsedTime += Time.deltaTime;
yield return null;
}
}
不确定轴,我假设您旋转左轮手枪室,因此围绕其前向矢量旋转是有意义的。