
VR 환경에서 상호작용을 담당하는 컨트롤러의 기능들을 알아본다
AR에서는 직접 XR Origine(Mobile AR) 오브젝트에 구현하는 식으로 했는데, 그럴 필요없이 샘플들에 있는 프리팹을 가져다 쓰는것이 낫다.
프리팹으로 이거 하나만 추가해주면, 자동으로 VR 환경의 컨트롤은 대부분 가능하다
헤드셋을 벗고 쓸 일없이 PC 환경의 마우스, 키보드로 시뮬레이션 할 수 있게 해준다. 프리팹을 추가하기만 하면 된다

Player의 역할을 하는 오브젝트
헤드셋과 가상 세계를 연결해주는 매개체 역할을 하는 오브젝트다.


인터렉터, 액션 등을 가지고 있다

플레이어의 움직임 및 동작을 담당하는 시스템이다. 단어 뜻 부터가 운동이다. 아래 서술할 모든 운동은 Locomotion Provider를 상속받는다

XR Origin을 참조한다. Time Out의 경우, 딱히 건들 필요는 없다. 10초동안 XR Origin과 연결되지 않을경우 자동으로 중지 한다는 옵션

회전 기능을 담당한다.
한번에 회전하는 경우다. 오른쪽 컨트롤러의 스틱에 입력이 있을 때마다 Turn Amount 만큼 회전한다. Debounce Time은 일종의 쿨타임이라고 생각하면 된다. 설정된 시간 안에는 다시 회전하지 못한다.
부드럽게 회전한다. 마찬가지로 오른쪽 컨트롤러 스틱의 입력값 만큼 회전한다. Turn Speed 만큼 빠르게 회전한다

기본상태는 Snap Turn 이다. Right Controller에서 밑줄 친 Smooth Turn Enabled에 체크하면 Continuous Turn으로 변경된다
플레이어(XR Origin)의 이동을 담당한다. Move와 Teleportation으로 나뉘어져 있다. 먼저 Move부터 살펴본다.

Move Speed : 이동속도Enable Strafe : 옆으로 이동Enable Fly : 체크하면 마인크래프트 크리에이티브 모드 처럼 날아다닐 수 있다Movement Direction : Left/Right Hand Movement Direction 을 헤드, 핸드로 변경할 수 있는데 이동 시 해당 방향을 이동 방향으로 설정할 수 있다. 기본값은 Head.Left Controller에서 Smooth Move Enabled를 ON/OFF하는 것으로 각각 Move 방식, Teleport방식으로 이동 방법을 변경한다


TelePortation의 경우, 컨트롤러에 있는 Teleport Interactor를 봐야 한다

Ray Interactor를 통해, 텔레포트 가능한 지역을 판정 후 해당 위치로 텔레포트 하는 방식이다.
텔레포트 방식의 이동을 위해서는 환경(Plane)에 컴포넌트를 추가한다
Teleportation AreaInteraction Layer Mask에 Teleport를 추가해줘야 한다
Add Layer하면 된다Interaction Layer Mask
기존의 게임오브젝트 레이어와는 다른 레이어다. 기능은 동일하다. 어떠한 레이어와 상호작용할 것인지 정한다.

오른손 컨트롤러의 Teleport 인터렉터에서도 레이어 설정을 해준다. 여기까지 완료하면, 이제 텔레포트 이동방식이 된다
Teleportation Anchor
동일하게 Interaction Layer Mask를 설정해주고, Teleport Anchor Transform에 원하는 위치로 쓰일 게임 오브젝트를 참조시키면 된다. 이제 해당 게임오브젝트 어느 곳으로 텔레포트 하더라도 해당 Anchor 위치로 가게된다
그랩 이후 좌측 컨트롤러를 움직여 오르내리거나, Teleport로 이동할 수 있다

딱히 건드릴 설정은 없다. 테스트씬에서 직접 체험 해보는 것이 좋다

상호작용 여부를 결정하는 게임 오브젝트다. 왼쪽, 오른쪽 컨트롤러에 서로 다른 인터렉터들이 부착될 수 있다. 아주 많은 인터렉터들이 있는데, 그 중 일부만 알아보자


Ray Interactor : 빛을 쏘는 방식의 인터렉터. 컨트롤러에서 발사 된 레이에 물체가 부딪히고, 인터렉터블이면 활성화 된다Force Grab : 상호작용 시, 해당 물체의 위치에서 상호작용 되던 것을 플레이어 위치까지 끌어와서 상호작용 한다Anchor Control : 상호작용 중 게임 오브젝트의 회전 기능 ON/OFF
Direct Interactor : 근접했을 때 물체가 활성화 되는 인터렉터. 콜라이더의 크기만큼 인식된다Attach Transform 을 미리 설정하는 것이 좋다. 런타임 중 자동 생성되기는 하는데, 총을 잡을 경우와 같이 미리 포지션을 지정해야 된다. 방향도 이걸로 결정됨. XR Grab Interactable 같은 인터렉터블에도 attach transform이 있다.Attach Trasnform
인터렉터와 인터렉터블 둘 다Attach Transform을 별도로 지정할 경우, 인터렉터블의 것이 우선 적용된다. 이 때,AttachEaseInTime옵션을 통해 부드러운 이동이 가능하다.


Poke Interactor : 특정 물체에 닿았을 때 상호작용 가능해지는 인터렉터. 위 사진에서는 작은 Sphere가 해당한다.
컨트롤러에 추가되는 컴포넌트. 인터렉터들을 그룹으로 묶는다. Interaction Override Configuration을 통해 인터렉터의 우선순위를 정해줄 수 있다.

Attach Transform : Select된 물체의 transform이 참조된다.인터렉터에는 여러 이벤트들이 있다.

Hover : 레이, 다이렉트, 포크로 인터렉터블에 접촉 했을 때 상태다. 물체가 하이라이트 된 상태로 생각하면 이해가 빠르다Select : 상호작용 상태. 물체와 상호작용 중일 때다.
Audio Events : 상황에 따른 오디오 재생Haptic Events : 상황에 따른 진동 이벤트게임 오브젝트에 상호작용이 가능한 물체라는 속성을 부여하는 컴포넌트다. Interactor와 상호작용한다
게임오브젝트를 잡아서 상호작용할 수 있게 한다. 게임 오브젝트에 XR Grab Interactable을 추가하면 된다. 레이어 설정으로 왼쪽, 오른쪽 컨트롤러를 나누어서 적용 시킬 수도 있다. Rigidbody 와 Collider가 반드시 필요하다
총을 집는 손을 주 손(보통 오른손)쪽으로 레이어를 잡고, 발사 또한 오른쪽으로 제한할 수 있다. 왼손은 총열에 파지하거나, 탄창을 집어 갈아 끼우는 역할로 나눌 수도 있다.

소총과 같이 긴 무기의 경우, 이 옵션을 통해 양손으로 잡아야 하는 무기로 만들 수 있다.
기본값은 Instantaneous(즉각적) 이다. 이 외에 Kinematic, Velocity가 있다. Velocity를 제외하고는 다른 물체들과의 상호작용이 적용되지 않는다. 그래서 보통은 velocity를 사용한다


위와 같이 콜라이더 배열을 만들어서 배열에 있는 콜라이더를 통해서만 상호작용하게 만들 수 있다.
상호작용을 중지 할 때, 던지는 판정이 되는 옵션.

어디를 잡든, 잡는 곳의 해당 포인트를 기준으로 잡히는 기능. 자연스러운 잡기를 구현하고자 할 때 사용된다. Attach Transform이 잡히는 곳이 된다. 해당 기능을 체크하면, 자동으로 컴포넌트로 XR General Grab Transformer가 추가된다.
잡기와 관련한 일반적인 기능을 가진다. 제약사항들을 줄 수 있는데, 양손을 기준으로 해줄 수 있어서 총기와 같이 양손으로 제어가 필요한 물체의 경우에 유용하다.


Select Mode를 Multiple로 바꿔줘야 한다.

해당 컴포넌트를 추가한 게임오브젝트의 XR Grab Interactable 컴포넌트 필드로 가서, Start Multiple Grab Transformers에 추가해줘야 한다. 이러면 양손잡기가 가능해진다.
탄알집을 총에 장전하는 경우와 같이 게임 오브젝트를 정확한 위치에 끼울 때 사용하는 인터렉터다.
앞서 총과 관련해서 언급 했듯이, 물체에 의해서 발생하는 이벤트들은 인터렉터가 아니라 여기서 구현해야한다. 기능이나 동작 방법은 전부 인터렉터와 동일하다. 여기에 추가로 Focus, Activate가 있다.
Focus : UI 포인터가 UI 요소 안에 들어올 때. 주로 UI에서 사용된다. Canvas + XR UI Input Module에서 UI 요소에 포인터가 올려졌을 때 수행되는 이벤트다. XR Gaze Interactor, XR Ray Interactor로 발동된다. 추가적으로, HMD에서 Gaze based interaction을 쓰면, 정면 방향이 물체를 향할 경우 Focus Enter로 인식된다. 해당 기능은 3.0 이상에서 확인 가능
Activate : Grip 버튼을 누른 후, 트리거 버튼을 눌렀을 때. Select 이후에 트리거 액션이 추가로 필요한, 보조액션이다.
Hover : Ray Interactor / Direct Interactor가 Collider 안에 들어왔을 때.
일반적으로 Render Mode로 WorldSpace를 사용한다. 기존처럼 Screen Space - Overlay로 하게 되면, 컨트롤러로 상호작용을 할 수 없기 때문이다.
XR Grab Interactable 추가.
XR General Grab Transformer 추가. Allow Two Handed Scailing을 체크한다

총을 잡을 부위에 맞춰 콜라이더들을 추가한다.

Attach Transform, Secondary Attach Transform을 각각 추가해준다.
XR Grab Interactable에서 Select Mode를 Multiple로 변경. 이제 양손으로 잡을 수 있다.
탄창을 끼울 위치를 위해 소켓 인터렉터를 사용한다

탄창을 하나 추가해서 정확한 위치에 배치 한다.

매시 필터를 제외한 컴포넌트를 삭제, XR Socket Interactor를 추가한다

Attach Transform에 해당 위치를 저장한다

끼울 수 있을 때의 메시와 끼울 수 없을 때의 메시를 추가한다.
메시 콜라이더를 추가해준다. 그래야 인식이 된다

탄창의 인터렉터블 이벤트에서 Select에 위와 같이 구현할 수 있다. 탄창이 꽂혀있으면 발사가 된다. 탄약이 다 떨어져서 발사가 안되는 것은 스크립트 내부에서 처리한다.
알맞는 탄창만 소켓에 들어가게 하려면, Hover 이벤트에서 처리해야 한다. 빨간색 메가 출력되서, 장착을 못하게 막을 수 있다.