OVRInput.Get() vs. OVRInput.GetDown()


오늘 먼저 정리할 내용은 OVRInput.Get() 이랑 OVRInput.GetDown()의 차이점.


사실 유니티로 개발한 경험은 학부때(2-2, 3-1 이니까.... 2014년 6월..... 3년..전....실화?)가 마지막이었고, 간단한 미로게임을 만들었던 경험이 전부였다.

그런데 이번에 프로젝트에 운좋게 참여하게 되면서 3년만에 유니티를 하는데다가 오큘러스까지 더해지니.. 너무나 혼돈의 카오스인것.

그래서 어찌보면 너무나 간단한 Oculus Controller 입력가지고 몇시간 동안 머리를 잡아뜯었다고 한다. (이제 잡담 끝!)


일단 OVRInput은 controller의 입력 API를 제공하는 클래스이다.  (응?)

그러니까... 유니티에서 Oculus Controller의 입력을 받으려면 이걸 사용해야한다.


내가 지금까지 구현하면서 필요했던 Oculus Controller의 입력은


1. Index Trigger를 눌렀을 때, Line을 그리기 시작함.    ----- 최초 눌렀을 때만

2. Index Trigger를 누른 상태에서는 controller의 이동 좌표를 따라 Line이 그려져야함.    ----- 누른 상태 계속

3. Thumb Stick을 좌우로 조절하여 두께를 조절함.      ----- 최초 눌렀을 때만


(참고로 내가 구현한 Line은 4개의 좌표로 사각형 mesh를 이어서 그려진다. -- 이것도 구현하는데 뻘짓 엄청함)



우선 고려해야 했던 것은, 버튼 입력은 Update() 안에서만 검사할 수 있다는 것.

처음에는 OVRInput.Get()으로 모두 구현을 했는데, 1, 3을 한번만 눌렀는데도 자꾸 함수가 미친듯이 호출이 되는현상이 발생했다. (문제상황)


열심히 구글링을 해서 버튼을 눌렀을 때 호출이 되도록 찾아보니, 눌렀을 때만 호출하려면 OVRInput.GetDown()을 사용해야 한다는 것을 알았다.

여기서 Get()이랑 GetDown() 두개가 비슷한 것 같으면서도 달라서 좀 버벅거렸었다.


두 개의 차이를 정리하면 다음과 같다.




 

 OVRInput.Get()

 OVRInput.GetDown()

 Update() 에서 호출

누른 상태에서 계속 호출

 눌렀을 때 최초 한번만 호출

 Access 방식

결합방식 (Accessed as a Combined Controller)

개별방식 (Accessed as a Individual Controller)

 Parameter

OVRInput.[사용하는 버튼]

OVRInput.Button.[사용하는 버튼]

 return value

 float [사용하는 버튼에 따라 다름]

 bool

 사용예시

 OVRInput.Get(OVRInput.Axis1D.SecondaryIndexTrigger,

OVRInput.Controller.Touch);

 OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger,

OVRInput.Controller.RTouch);




- Combined : 왼손, 오른손 각각 mapping되는 button의 이름이 다름

- Individual : 왼손, 오른손 mapping되는 button의 이름이 대칭으로 같음

사진출처 : Oculus developers





(내가 구현하는것 기준)


- 2번의 경우 Update() 안에서 연속적으로 호출되어야 하니까 OVRInput.Get() 을 사용 : Combined

  오른손의 Index Trigger의 mapping은 Axis1D.SecondaryIndexTrigger이다.


  OVRInput.Get(OVRInput.Axis1D.SecondaryIndexTrigger, OVRInput.Controller.Touch);

 

 //버튼 이름으로 왼손, 오른손이 구분 가능하기 때문에 두번째 parameter에서 오른손, 왼손을 구분해 줄 필요 없다. (버튼 이름은 위의 사진 참고)



- 1, 3번의 경우 Update() 안에서 눌렀을 때 최초 한번만 호출되어야 하니까 OVRInput.GetDown() 을 사용 : Individual

  Index Trigger (1번) 의 mapping은 PrimaryIndexTrigger, Thumb Stick (3번)의 mapping은 PrimaryThumbStick 이다.

  

  (1번) OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger, OVRInput.Controller.RTouch);

  (3번) OVRInput.GetDown(OVRInput.Button.PrimaryThumbstickRight, OVRInput.Controller.RTouch);


  // 양손의 버튼 이름이 같기 때문에, 두번 째 parameter 에서 RTouch, LTouch를 명시해주어야 한다.

  // (3번)위의 매핑 이름과 다른데, GetDown의 경우 Button type으로 parameter를 받기 때문에 Button의 하위 클래스로 찾아야 한다.

  // (3번)GetDown의 return 값이 bool 타입이라 그런지 Thumbstick의 방향까지 지정을 해주어야 하나보다....

  


나도 하위객체를 모두 파악하고 있지는 않지만, 보면 대부분 직관적으로 알 수 있는 정도라 코딩하면서 알아가고 있는중..





정리하니까 막상 별거 아닌데 오래 고민한 것 같아 허무하기도 하면서.. 다시 한번 정리하니까 공부도되고 좋다.

그나저나 그동안 밀린거 언제 다 정리해~~~




천천히, 꾸준히 syaring's blog

참고 : Oculus developers (https://developer.oculus.com/documentation/unity/latest/concepts/unity-ovrinput/)

+ Recent posts