Notice
Recent Posts
Recent Comments
Link
12-26 11:26
«   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. 4. 19. 20:57
 

VR) 유니티 XR Interaction Toolkit 기본 탐구

VR) 유니티에서 오큘러스 퀘스트 샘플 씬 탐구 (feat. MacOS' tears) 우선 조작이 가능해서 탐구를 하든말든 하므로, 유니티에서 빌드 없이 바로 에디터에서 오큘러스로 조작할 수 있는 방법을 찾아보

kingmuffin.tistory.com

 

  • XRRig : MonoBehaviour 상속.
  • LocomotionSystem : MonoBehaviour 상속.
  • LocomotionProvider : abstract class. MonoBehaviour 상속.
  • CharacterControllerDriver : MonoBehaviour 상속.
  • ActionBasedContinuousMoveProvider : ContinuousMoveProviderBase 상속.
  • ActionBasedContinuousTurnProvider : ContinuousTurnProviderBase 상속.
  • ActionBasedSnapTurnProvider : SnapTurnProviderBase 상속.
  • ContinuousMoveProviderBase : abstract class. LocomotionProvider 상속.
  • ContinuousTurnProviderBase : abstract class. LocomotionProvider 상속.
  • SnapTurnProviderBase : abstract class. LocomotionProvider 상속.
  • TeleportationProvider : LocomotionProvider 상속.

 


클래스를 상속받아서 재정의할 수 있다면 유용할 것이다. 근데 난 할 줄 모른다! 하고 싶지도 않다. 일단 스크립트를 장착한 게임오브젝트를 그대로 가져와서 사용하는 방법으로 진행할 것이다.

상단 '게임 오브젝트 - XR' 메뉴에서 핵심 게임오브젝트를 생성하거나, XR Interaction Toolkit 샘플 씬을 살펴보면 어떤 스크립트를 어느 게임오브젝트에 붙여야 할지 알 수 있다.

  • (GameObject) XRRig : XRRig, Character Controller(기본 컴포넌트)
  • (Script) Locomotion System :  LocomotionProvider 상속 스크립트와 함께 아무 게임오브젝트에. XRRig 게임오브젝트에도 가능.

간단히 정리하면, 한 오브젝트에 다 때려박을 수도 있지만, Locomotion System이나 Interaction Manager와 같은 위치에 구애받지 않는 스크립트는 Rig과 따로 생성된다.


XR Interaction Toolkit의 예제에는 네임스페이스가 UnityEngine.XR.Interaction.Toolkit.Examples인 스크립트가 두 개 있다.

  • LocomotionSchemeManager : XRRigDemo 게임오브젝트에 부착됨
  • LocomotionConfigurationMenu : Locomotion 설정을 조작하는 Locomotion Configuration Area - UI Canvas 게임오브젝트에 부착됨. Locomotion control schemes 및 구성 환경설정을 구성하는 데 사용할 동작을 저장하는 용도로 LocomotionSchemeManager을 이용함.

내가 필요한 기능이 이 두 스크립트에 있으니 참고하자. 일단 LocomotionconfigurationMenu는 LocomotionSchemeManager에서 정의한 Enum으로 목록을 표시하고 선택 시 LocomotionSchemeManager의 moveScheme과 turnStyle에 적용할 뿐이다. 그러니 핵심은 그 두 필드.

그렇게 적용한 설정을 SetMoveScheme()와 SetTurnStyle()에서 처리하는데, 코드가 의외로 겁나 간단하다 만세! 그냥 용도에 맞는 Provider 스크립트를 껐다 켰다할 뿐이다.

Binding masks, find control schame 등 Input action과 관련이 있어보이는(추정) 함수도 있지만 몰라, 무시한다. (클래스에 물음표 붙은 함수랑 인수는 뭐야? 아무튼 맘에 안 든다 ㅎㅎㅎ)


우선 ActionBased 스크립트 세 개는 단지 입력을 처리한다. ProviderBase 스크립트 세 개도 복잡하지 않았다. LocomotionProvider으로 상속받는 XRRig 스크립트의 함수에 입력한 값을 전달할 뿐이다.

  • TeleportationProvider 핵심 코드 : xrRig.MoveCameraToWorldLocation(cameraDestination);
  • SnapTurnProviderBased 핵심 코드 : xrRig.RotateAroundCameraUsingRigUp(m_CurrentTurnAmount);
  • ContinuousTurnProviderBased 핵심 코드 : xrRig.RotateAroundCameraUsingRigUp(turnAmount);
  • ContinuousMoveProviderBased 핵심 코드 : Character Controller을 사용중이면 m_CharacterController.Move(motion); 그렇지 않다면 xrRig.rig.transform.position += motion; EndLocomotion();

각 핵심 코드 다음에는 항상 EndLocomotion();이 있다.

이것들만 잘 활용하면 XRRig와 Locomotion 스크립트를 탐구하지 않아도(날로 먹고도) 새로운 기능을 만들 수 있지 않을까?

그 검증은 다음 글에서.