我正在尝试使用Unity使像对象一样的跷跷板旋转,并且由于某种原因,旋转是瞬时的,而不是逐渐的运动。之前,我已经研究过Slerp和Lerp,但无法与它们一起使用。我想知道是否有人有任何见识,因为我确定我缺少一些愚蠢而简单的xD。 谢谢!这是方法。
private void Rotate(float rotateAmount)
{
var oldRotation = transform.rotation;
transform.Rotate(0, 0, rotateAmount);
var newRotation = transform.rotation;
for (float t = 0; t <= 1.0; t += Time.deltaTime)
{
transform.rotation = Quaternion.Slerp(oldRotation, newRotation, t);
}
transform.rotation = newRotation;
}
}
答案 0 :(得分:6)
在for
循环中完成的所有旋转都在一个帧下进行。您看不到它们在一帧之内发生变化。使Rotate
函数成为协程函数,然后在每个循环中使用yield return null
等待一帧,您应该会看到随着时间的变化。
private IEnumerator Rotate(float rotateAmount)
{
var oldRotation = transform.rotation;
transform.Rotate(0, 0, rotateAmount);
var newRotation = transform.rotation;
for (float t = 0; t <= 1.0; t += Time.deltaTime)
{
transform.rotation = Quaternion.Slerp(oldRotation, newRotation, t);
yield return null;
}
transform.rotation = newRotation;
}
由于它是协程函数,因此您可以启动它而不是直接调用它:
StartCoroutine(Rotate(90f));
我注意到您使用transform.Rotate(0, 0, rotateAmount)
来获取目标角度。您不需要这样做。如果需要将对象从当前角度旋转到另一个角度,请获取当前角度,然后将其添加到目标角度,然后使用Vector3.Lerp
进行旋转。
请参阅this帖子中的“随着时间的推移角度旋转” 部分。