Lerp vs tweening

时间:2016-08-17 07:21:40

标签: c# unity3d tween

我正在尝试根据用户输入旋转对象(在一个轴上)(例如键盘左/右箭头)。我使用Rigidbody方法MoveRotation

所以在FixedUpdate中,我使用Mathf.Lerp创建与帧无关的角度移动。

rotation = Mathf.Lerp(rotation, rotation + input, Time.deltaTime * speed)

但这是线性的,我想平滑这个旋转(例如Sine.easeIn),所以它开始缓慢旋转,过了一段时间它完全旋转。

Unity中将补间与用户输入和帧独立性结合起来的最佳方式是什么。 (我想我不能使用像DOTweeniTween这样的库,因为补间的时间是未知的。

2 个答案:

答案 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());
}

您可以修改startingSpeedmaxSpeed变量以满足您的需求。如果您认为到达maxSpeed需要很长时间,那么在向startingSpeed添加Time.deltaTime;后,您可以将startingSpeed += Time.deltaTime;与其他数字相乘。例如,将startingSpeed += Time.deltaTime * 5;更改为.css