Notice
Recent Posts
Recent Comments
Link
12-26 00:51
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

킹머핀의 제작 일지

VR) 유니티 XR Interaction Toolkit 계속 탐구 본문

Unity

VR) 유니티 XR Interaction Toolkit 계속 탐구

KingMUffin 2021. 5. 11. 19:22
 

VR) 유니티 XR Interaction Toolkit 응용 탐구

VR) 유니티 XR Interaction Toolkit 클래스 탐구 VR) 유니티 XR Interaction Toolkit 기본 탐구 VR) 유니티에서 오큘러스 퀘스트 샘플 씬 탐구 (feat. MacOS' tears) 우선 조작이 가능해서 탐구를 하든말든 하므로..

kingmuffin.tistory.com

저번에는 텔레포트를 응용한 Fast Move를 구현했고, 이번에는 Continuous Move를 응용해서 Smooth Move를 구현할 것이다.

이번에는 ActionBasedContinuousMoveProvider와 ContinuousMoveProviderBase 스크립트를 살펴보았다. 굉장히 복잡한 계산과 절차를 거쳐 최종적으로 움직이는데, 다 꺼져. 내가 필요한 건 '속도' 하나 뿐.

이미 moveSpeed 필드가 준비되어 있다. 코드를 최대한 수정하지 않고 부드러운 움직임을 구현하려면, 이 필드를 곱하는 계산에 필요한 다른 필드에 스무th하게 보간한 값을 곱해주는 방법이 있다.

속도를 점진적으로 올려주려면 언제 움직이기 시작하는지 알아야 한다. 바로 오큘러스 컨트롤러의 조이스틱으로 입력을 받을 때. ActionBasedContinuousMoveProviderReadInput 함수로 이 입력을 벡터로 반환한다.

이 함수는 매 프레임마다 실행되는데, print 함수로 출력해보니 아무 입력이 없으면 (0, 0)이고, 왼쪽으로 이동할 땐 (-1, 0), 오른쪽은 (1, 0), 앞으로 이동할 땐 (0, 1), 뒤로는 (0, -1), 대각선으로 이동할 때는 (±0.7, ±0.7)이다. 왜 0.7이지?? 호기심 꾹 참고 넘어가자.

벌써 필요한 요소를 모두 확보했다. 이제 겁나 쉬울 것이다. 그래야 한다. 저번엔 너무 혹독했어..

 

ActionBasedContinuousMoveProvider을 상속받는 ActionBasedSmoothMoveProvider 클래스를 정의한다. 그리고 ReadInput 함수를 override하고, base.ReadInput으로 입력한 벡터값을 가져온다.

만약 이 벡터값이 zero라면, 지역 벡터에 저장하고 속도 변수를 점점 올린다. 아니라면 속도 변수만 점점 내린다. (속도는 0와 1 사이의 실수다.) 함수 밖에서 미리 선언해둔 지역 벡터에 저장하는 이유는, 입력을 멈추었을 때 바로 정지하지 않고 감속하기 위함이다.

이제 이 지역 벡터와, 속도를 이용한 커브값을 인수로 넣은 Vector2.UnClampedLerp 함수를 반환하면?

완성!

크하하 일찍 끝나서 기분이 좋다. 이전 글이랑 비교하면 가성비 천상계다.

우선 다른 기능부터 만들 계획이지만, 이게 이렇게 쉽다면 Smooth Turn도 마찬가지로 만들기 쉬울 것이다.

혹시 위의 설명을 코드로 보고 싶다면 아래를 보세요. &

        protected override Vector2 ReadInput()
        {
            Vector2 baseValue = base.ReadInput();
            float evaluated;

            if (baseValue != Vector2.zero)
            {
                time += Time.deltaTime * 2;

                value = baseValue;
            }
            else
            {
                time -= Time.deltaTime * 2;
            }

            time = Mathf.Clamp01(time);

            evaluated = VM.moveCurve.Evaluate(time);
            VM.curruntSpeed = evaluated - VM.curruntSpeed;

            return Vector2.LerpUnclamped(Vector2.zero, value, evaluated);
        }