我正在尝试根据用户输入旋转对象(在一个轴上)(例如键盘左/右箭头)。我使用Rigidbody
方法MoveRotation
。
所以在FixedUpdate
中,我使用Mathf.Lerp
创建与帧无关的角度移动。
rotation = Mathf.Lerp(rotation, rotation + input, Time.deltaTime * speed)
但这是线性的,我想平滑这个旋转(例如Sine.easeIn
),所以它开始缓慢旋转,过了一段时间它完全旋转。
Unity中将补间与用户输入和帧独立性结合起来的最佳方式是什么。 (我想我不能使用像DOTween
或iTween
这样的库,因为补间的时间是未知的。
答案 0 :(得分:0)
您可以使用Physics围绕其轴加速对象。
Rigidbody.AddTorque(torqueVector3, ForceMode.Accelerate);
您需要添加一个Rigidbody才能工作,参数ForceMode设置为加速,根据Unity文档将:
向刚体添加连续加速度,忽略其质量。
您可以添加一些代码来限制我认为的速度,例如:
if (Rigidbody.velocity.magnitude >= capAmount)
{
Rigidbody.velocity.magnitude = capAmount;
}
另一种更全面的限制轮换方法是更改max angular velocity。
答案 1 :(得分:0)
所以它开始缓慢旋转,过了一会儿就完全了 旋转。
这可以用协程来完成。启动协程并在while
循环中执行所有操作。当按下左/右箭头键时,使用Time.deltaTime
随时间递增的变量。
public Rigidbody objectToRotate;
IEnumerator startRotating()
{
float startingSpeed = 10f;
const float maxSpeed = 400; //The max Speeed of startingSpeed
while (true)
{
while (Input.GetKey(KeyCode.LeftArrow))
{
if (startingSpeed < maxSpeed)
{
startingSpeed += Time.deltaTime;
}
Quaternion rotDir = Quaternion.Euler(new Vector3(0, 1, 0) * -(Time.deltaTime * startingSpeed));
objectToRotate.MoveRotation(objectToRotate.rotation * rotDir);
Debug.Log("Moving Left");
yield return null;
}
startingSpeed = 0;
while (Input.GetKey(KeyCode.RightArrow))
{
if (startingSpeed < maxSpeed)
{
startingSpeed += Time.deltaTime;
}
Quaternion rotDir = Quaternion.Euler(new Vector3(0, 1, 0) * (Time.deltaTime * startingSpeed));
objectToRotate.MoveRotation(objectToRotate.rotation * rotDir);
Debug.Log("Moving Right");
yield return null;
}
startingSpeed = 0;
yield return null;
}
}
只需启动Start()
函数的协同程序一次。它应该永远运行。它将缓慢旋转到快速,直到达到maxSpeed
。
void Start()
{
StartCoroutine(startRotating());
}
您可以修改startingSpeed
和maxSpeed
变量以满足您的需求。如果您认为到达maxSpeed
需要很长时间,那么在向startingSpeed
添加Time.deltaTime;
后,您可以将startingSpeed += Time.deltaTime;
与其他数字相乘。例如,将startingSpeed += Time.deltaTime * 5;
更改为.css