UNITY3D:不知道如何使用Quaternion.slerp();旋转变得更快



我正在尝试为gearvr制作一个简单的游戏。在游戏中,我有一个场景,用户可以在其中浏览项目列表。如果用户在查看一个时单击一个,则可以选择一个项目。对于导航部件,用户应该能够同时使用头部移动和滑动来旋转项目(在每个右/左滑动时都会换一个/减一个)。

现在问题:我可以将所有这些工作与下面的代码(将项目的父母设置为组件),但是旋转不断增加,我使用的速度越多。我似乎无法弄清楚为什么...仍在努力。
XD

对任何类型的帮助都表示赞赏
private void ManageSwipe(VRInput.SwipeDirection sw)
{
    from = transform.rotation;
    if (sw == VRInput.SwipeDirection.LEFT)
    {
        to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y + 30, 0));           
    }
    if (sw == VRInput.SwipeDirection.RIGHT)
    {
        to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y - 30, 0));
    }
    StartCoroutine(Rotate());
}
IEnumerator Rotate(bool v)
{
    while (true)
    {
        transform.rotation = Quaternion.Slerp(from, to, Time.deltaTime);           
        yield return null;
    }
}

我正在使用Unity 5.4.1f1和JDK 1.8.0。

ps。不要对我很难,因为这是我在这里的第一个问题。
顺便说一句...大家好XD

您解决了我在评论部分中讨论的大多数问题。剩下的一件事仍然是循环。目前,没有办法退出循环时,这将导致多个旋转函数在same时运行。

但是旋转不断增加,我使用swipes

解决方案是存储对一个coroutine函数的引用,然后在开始新的函数之前将其停止。

类似的东西。

IEnumerator lastCoroutine;
lastCoroutine = Rotate();
...
StopCoroutine(lastCoroutine);
StartCoroutine(lastCoroutine);

而不是while (true),您应该具有一个定时器,该计时器存在时循环。目前,Rotate功能正在连续运行。从旋转到目的地旋转后,您应该使其停止。

类似的东西应该有效:

while (counter < duration)
{
    counter += Time.deltaTime;
    transform.rotation = Quaternion.Lerp(from, to, counter / duration);
    yield return null;
}

这是您的整个代码的样子:

IEnumerator lastCoroutine;
void Start()
{
    lastCoroutine = Rotate();
}
private void ManageSwipe(VRInput.SwipeDirection sw)
{
    //from = transform.rotation;
    if (sw == VRInput.SwipeDirection.LEFT)
    {
        to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y + 30, 0));
    }
    if (sw == VRInput.SwipeDirection.RIGHT)
    {
        to = Quaternion.Euler(new Vector3(0, from.eulerAngles.y - 30, 0));
    }
    //Stop old coroutine
    StopCoroutine(lastCoroutine);
    //Now start new Coroutine
    StartCoroutine(lastCoroutine);
}
IEnumerator Rotate()
{
    const float duration = 2f; //Seconds it should take to finish rotating
    float counter = 0;
    while (counter < duration)
    {
        counter += Time.deltaTime;
        transform.rotation = Quaternion.Lerp(from, to, counter / duration);
        yield return null;
    }
}

您可以增加或减少duration变量。

尝试从当前旋转而不是最后一个使用LERP:

transform.rotation = Quaternion.Slerp(transform.rotation, to, Time.deltaTime);

相关内容

  • 没有找到相关文章

最新更新