0

我正在尝试在 Unity 中为 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

4

2 回答 2

1

尝试使用当前 Rotation 中的 Lerp 而不是最后一个:

transform.rotation = Quaternion.Slerp(transform.rotation, to, Time.deltaTime);
于 2016-11-25T16:07:11.537 回答
1

你解决了我在评论部分讨论的大部分问题。剩下的一件事仍然是while循环。目前,无法退出该 while 循环,这将导致 Rotate 函数的多个实例同时运行。

但旋转不断增加,我使用滑动的次数越多

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

像这样的东西。

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

而不是while (true),您应该有一个存在 while 循环的计时器。此时,该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变量。

于 2016-11-25T17:43:39.390 回答