2016-11-25 14 views
0

저는 GearVR 용 Unity에서 간단한 게임을 만들려고합니다. 게임에서는 사용자가 항목 목록을 탐색 할 수있는 장면이 있습니다. 사용자가 항목을 보면서 클릭하면 항목을 선택할 수 있습니다. 네비게이션 부분의 경우 사용자는 머리 움직임과 스 와이프를 사용하여 항목을 회전 할 수 있어야합니다 (오른쪽/왼쪽 스 와이프마다 1/1 씩 이동).Unity3D : Quaternion.Slerp();를 사용하는 방법을 모른다. 회전이 더 빨라졌습니다.

이제 문제는 : 아래의 코드 (항목의 부모에 구성 요소로 설정)로이 모든 작업을 수행 할 수 있지만 스 와이프를 많이 사용할수록 회전 수가 계속 증가합니다. 나는 이유를 이해하는 것 같지 않습니다 ... 여전히 그것에 대해 연구하고 있습니다.
도움의 모든 종류의 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; 
    } 
} 

내가 유니티 5.4.1f1 및 JDK 1.8.0를 사용하고 있습니다 감사합니다.

추신. 이것이 내 첫 번째 질문이기 때문에 나에게 열심히하지 마라. 그런데
는 ... 안녕하세요 모두 XD

+1

이 코드는 너무 잘못되어 어디서부터 시작해야할지 모르겠습니다. 해결책을 찾았음에도 불구하고 여전히 잘못된 것입니다. 나는 'while (true)'루프를 가지고 있기 때문에'Rotate' 함수가 존재하지 않을 것이라고 생각합니다. 또한이 함수는 스 와이프가있을 때마다 호출됩니다. 어떤 시점에서 전체가 느려질 것입니다. 또한, 'Rotate' 함수에 0을 전달하면, 전체 앱이 멈 춥니 다. while 루프 안에 if 문 안에 있지 않은 while 루프 안에'yield return null; '을 넣으려면 ... – Programmer

+0

고맙습니다. 그 점에 대해 당신이 맞다고 생각합니다. 그걸로 나는 많은 사람들이 많은 시도와 실수를 한 후에 여기에 게시했다. 솔루션이 아니라 해결책을 찾았습니다. 그리고 만약 당신이 기꺼이, 어떻게 그리고 어디서 잘못되었는지 설명해 주시면 감사하겠습니다. – remmargorp

+0

수익률 반환 값이 null로 고정되었습니다. if() 문에서 벗어납니다. 고정 회전 (int v)을 회전합니다 (bool v).while을 제거하면 오브젝트가 Lerp의 대상이 아닌 프레임에만 회전합니다. 너 나 좀 도와 줄 수있어? – remmargorp

답변

1

당신은 내가 코멘트 섹션에서 논의 된 대부분의 문제를 해결했습니다. 한 가지 남은 일은 여전히 ​​while 루프입니다. 지금 당장은 while 루프를 종료 할 수있는 방법이 없으며 이로 인해 동시에 실행되는 Rotate 함수의 여러 인스턴스가 생성됩니다.

그러나 회전이 계속 증가는 더 많은 I는 새로운 하나를 시작하기 전에 중지

솔루션은 하나 개의 코 루틴 함수에 대한 참조를 저장하는 것입니다 와이프를 사용합니다.

이와 비슷한 것.

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

대신 while (true)

, 당신은 while 루프를 존재하는 타이머를 가져야한다. 현재 Rotate 기능이 계속 실행 중입니다. 회전에서 대상 회전으로 이동 한 후에 정지해야합니다. 이 같은

뭔가 작동합니다 : 당신은 증가 또는 duration 변수를 줄일 수 있습니다

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; 
    } 
} 

:

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

같이 전체 코드가 보일 것입니다 것입니다.

+0

경험이 생겼을 때의 모습입니다 ... 도와 주셔서 감사합니다! – remmargorp

+0

당신은 오신 것을 환영합니다! – Programmer

1

봅니다되지 마지막 현재 회전에서 LERP를 사용 :

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

저는 이것을 시도해 보았습니다. 그러나 회전은 전혀 멈추지 않습니다. 왜냐하면 'to'는 '변형'의 회전으로 정의 된 쿼터니언이기 때문입니다. to = Quaternion.Euler (새 Vector3 (0, transform.eulerAngles.y + 30, 0)); – remmargorp

+0

해결되었습니다! 답변 주셔서 감사합니다. – remmargorp