如何平稳地旋转门

时间:2020-04-03 19:32:19

标签: c# unity3d

我正在做一个游戏,门必须平稳地旋转-90度。我已经尝试了很多不同的方法,但是我无法使其正常工作。

public float degrees = -90f;

public Transform door;

private void update()
{
    door.transform.Rotate(0f, 0f, degrees, Space.Self);
}

我如何使其平滑旋转,而不仅仅是卡入到位?

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案

public float degrees = -90f;
    public float rotationDuration = 5f;

    public Transform door;

    private float startTime;
    private bool isOpenningDoor;

    private void OpenDoor()
    {
        startTime = Time.time;
        door.transform.eulerAngles = Vector3.zero;
        isOpenningDoor = true;
    }

    private void update()
    {
        if(Input.GetKeyDown(KeyCode.O))//for testing
        {
            OpenDoor();
        }
        if(isOpenningDoor)
        {
            float ratio = (Time.time - startTime)/rotationDuration;//percentage of total rotation
            if(ratio >= 1f)//when you reached max rotation
            {
                ratio = 1f;
                isOpenningDoor = false;//Stop extra rotation
            }
            door.transform.Rotate(0f, 0f, ratio * degrees, Space.Self);
        }
    }

在示例中,打开时间为5秒。如果您想做很多小型的程序员动画,我建议Dotween进行一些轻松和快速的实现。

答案 1 :(得分:0)

您可以使用CoroutinesSlerp方法来做到这一点。试试这个:

using System.Collection;

...

public Transform door;
public float degrees = -90f;
public float someSpeed = 0.08f;

IEnumerator OpenDoor ()
{
    while (door.transform.localEulerAngles.y > degrees)
    {
        door.transform.localEulerAngles = Vector3.Slerp(door.transform.localEulerAngles
            , new Vector3(0, degress - 0.2f, 0), someSpeed);

        yield return new WaitForEndOfFrame();
    }

    yield break;
}

在需要的地方,只需致电StartCoroutine(OpenDoor());

希望这就是您想要的。