OpenXR 플러그인으로 오큘러스 퀘스트 2를 비롯한 여러 VR기기 애플리케이션을 구현하는 작업
자세한 내용은 재생목록 확인
유니티 패키지 매니저에서 다음 패키지들을 다운받는다
Samples - Starter Assets
도 추가 임포트하여 샘플 VR 인터랙션 키트를 다운로드 받을 수 있다.OpenXR은 모든 XR 기기들에 대한 표준 SDK 플러그인이다.
Edit - Project Settings - XR Plug-in Management
에서 OpenXR을 체크해 플러그인을 다운로드 및 적용한다.
이후 다음과 같이 세팅해준다.
Interaction Profiles
에서 타겟 기기의 입출력 프로파일을, OpenXR Feature Groups
에서 추가적인 지원 그룹을 설정한다.Player
에서 모바일 관련 설정을 해준다.Minimum API Level
을 24(Android 7.0 Nougat)로 지정한다.Scripting Backend
를 IL2CPP로 지정한 후 Target Architectures를 ARM64만 지정한다.유니티 씬에 XR Origin
을 추가하여 VR 플레이어를 씬에 소환할 수 있다.
VR 플레이어는 기본적으로 카메라와 왼손, 오른손을 갖고 있다.
XR Controller
를 갖고 있다.XR Controller
에 Input System
의 Input Action Manager Refernce
를 할당해 원하는 입력에 동작을 할당할 수 있다.Model
에 개발자가 원하는 프리팹을 추가하여 손을 대신할 게임오브젝트를 배치할 수 있다.XR Interaction Toolkit
의 Sample Package
에 손과 카메라를 포함한 모은 XR 관련 입력 매핑이 되어있는 인풋 시스템이 존재한다.
이 인풋 시스템에 매핑된 입력값을 바탕으로 추후 구현하는 입력 및 애니메이션을 구현한다.
이전 강의에서 말했듯 XR Origin
의 손 오브젝트의 XR Controller
컴포넌트의 Model
에 손 프리팹을 추가하여 손을 위치시킬 수 있다.
그러므로 손 프리팹은 손 애니메이션과 이를 컨트롤하는 스크립트를 모두 갖고 있어야 한다.
using UnityEngine;
using UnityEngine.InputSystem;
namespace Unity_VR_Basics_2023_Hands.Oculus_Hands.Scripts
{
[RequireComponent(typeof(Animator))]
public class AnimateHandController : MonoBehaviour
{
[SerializeField] private InputActionReference gripInputActionRef;
[SerializeField] private InputActionReference triggerInputActionRef;
private Animator _handAnimator;
private float _gripValue;
private float _triggerValue;
private void Awake()
{
_handAnimator = GetComponent<Animator>();
}
// Update is called once per frame
private void Update()
{
AnimateGrip();
AnimateTrigger();
}
private void AnimateGrip()
{
_gripValue = gripInputActionRef.action.ReadValue<float>();
_handAnimator.SetFloat("Grip", _gripValue);
}
private void AnimateTrigger()
{
_triggerValue = triggerInputActionRef.action.ReadValue<float>();
_handAnimator.SetFloat("Trigger", _triggerValue);
}
}
}
오브젝트의 잡기는 XR Origin
의 손 컨트롤러에 XR Direct Interaction
컴포넌트 추가하고
잡기 상호작용을 할 오브젝트에 XR Grab Manager
를 추가하여 구현할수 있다.
잡기를 수행할 손 오브젝트에 추가한다.
해당 컴포넌트는 Is trigger
가 체크된 콜라이더를 필요로 한다.
또한 Interaction Manager
에 씬에 설정된 인터랙션 매니저를 추가해야 한다.
해당 컴포넌트에서는 다음과 같은 작업을 할 수 있다.
Interaction Layer Mask
: 레이어 마스크를 추가해 원하는 레이어를 지닌 오브젝트만 인터랙션할 수 있게 설정할 수 있다.Attach Transform
: 오브젝트를 잡을 때 오브젝트가 달려있는 위치, 없으면 기본 손 위치를 사용한다.Select Action Trigger
: 입력 트리거(그랩 트리거 등)의 입력 방식에 따라 물건을 집고 놓는 방식을 다르게 한다.이 외에도 여러 설정을 할 수 있다.
잡기의 대상인 물체 오브젝트에 추가한다.
해당 컴포넌트는 콜라이더와 Rigidbody를 필요로 한다.
또한 Interaction Manager
에 씬에 설정된 인터랙션 매니저를 추가해야 한다.
해당 컴포넌트에서 다음과 같은 작업을 할 수 있다.
Interaction Layer Mask
: 해당 오브젝트에 대한 레이어 마스크를 추가한다. 플레이어는 자기 손에 설정된 레이어 마스크에 해당되는 오브젝트만 집을 수 있다.Select/Focus Mode
: 플레이어가 한 번에 여러가지 오브젝트를 집을 수 있는지에 대한 설정이다.Movement Type
: 플레이어가 오브젝트를 집어들었을 때의 움직임에 대한 설정이다. 리지드바디의 성질을 건드려 다른 물체와의 충돌상황을 기체/액체/고체 상황처럼 구현한다.Attach Transform
: 플레이어가 해당 오브젝트를 집을 때 오브젝트의 어떤 부위를 잡을지에 대한 위치이다. 디폴트 값으로는 물체의 정중앙이 잡힌다.이 외에도 여러 설정을 할 수 있다.
멀리 있는 오브젝트 이동, XR UI 사용에 유용한 레이 상호작용 구현
유니티에서 XR Interactor
류 컴포넌트는 하나의 오브젝트에 한 개만 추가될 수 있다.
따라서 컨트롤러의 자식 오브젝트로 인터랙션을 각각 추가하여 하나의 컨트롤러가 여러 종류의 상호작용을 할 수 있게 구현한다.
하이어라키창을 우클릭해 XR 창을 클릭하면 (Action Based)
라 적혀진 각각의 인터랙션들을 확인 및 씬에 추가할 수 있다.
자식 오브젝트로 생긴 인터렉터들은 XR Controller
컴포넌트와 각각 인터렉터 컴포넌트, 그리고 해당 인터렉터 컴포넌트가 필요로 하는 컴포넌트들로 구성되어 있다.
이 때 XR Controller
는 인터랙터의 부모 오브젝트인 컨트롤러에 이미 선언되어 있으므로 인터랙터에서는 삭제해도 된다.
레이 인터랙터는 XR Ray Interactor
, Line Renderer
, XR Interactor Line Visual
컴포넌트들로 구성되어 있다.
XR Ray Interactor
는 Ray 상호작용을 위한 컴포넌트로 다음과 같은 설정을 할 수 있다.
Selection Configuration
)Audio/Haptic/Interactor Events
)이외에도 여러 설정을 할 수 있다.
XR Interactor Line Visual
는 인게임에서 손에서 발사되는 레이의 외형을 결정하는 컴포넌트이다.
다음과 같은 설정을 수행할 수 있다.
특정 물체를 찌르거나, 어떠한 물체를 특정 방향으로 통과할 때 이벤트가 발동되게끔 하는 상호작용이다.
포킹 상호작용은 상호작용을 수행할 손에는 XR Poke Interactor
가, 상호작용 대상 오브젝트에는 XR Simple Interactable
컴포넌트를 필요로 한다.
이 떄 XR Poke Interactor
의 Require Poke Filter
가 체크되어 있으면 상호작용 대상 오브젝트에 XR Poke Filter
컴포넌트도 추가해야 한다.
다른 인터랙터와 다르게 콜라이더를 사용하지 않고 컴포넌트 내의 크기 변수들을 이용해 상호작용 가능 범위를 조절할 수 있다.
또한 Poke Filter과 UI Interaction 여부를 설정할 수 있다.
상호작용을 받을 오브젝트에 필요한 컴포넌트이다.
위에서 사용한 그랩 인터랙터블이 Simple Interactable을 상속받는다.
찔러지는 오브젝트의 이벤트가 트리거되는 방향 및 강도를 설정할 수 있다.
밸브 인덱스와 같은 VR 기기에서 자유로운 손가락 움직임을 구현하기 위한 작업이다.
패키지 매니저에서 XR Hands 패키지와 해당 패키지의 샘플 다운로드
이후 Empty GameObjects들을 이용해 다음과 같이 XR Hands를 구성해준다.
이후 다음과 같이 컴포넌트들을 추가해준다.
빌드 및 수행시 이전에 사용된 손 대신 손가락을 자유롭게 움직일 수 있는 새로운 손이 스폰되는 것을 확인할 수 있다.
생성된 손은 이전의 그랩 인터렉션이 적용되지 않는다. 따라서 다음과 같이 새로운 그랩 인터랙션을 만들어주어야 한다.
손 컨트롤러 오브젝트의 XR Controller
의 입력 레퍼런스를 변경해 이동 시 좀 더 자연스러운 애니메이팅이 발생하게 수행할 수 있다.
혹은 상호작용하는 오브젝트에 붙어있는 XR Grab Interactable
컴포넌트의 use Dynamic Attach
를 활성화해 오브젝트를 자연스럽게 그랩할 수 있게 할 수 있다.
VR에서 컨트롤러 조이스틱 혹은 직접 이동으로 움직임을 구현하는 방법
유니티 XR은 Locomotion이라는 시스템으로 플레이어의 이동을 구현한다.
다음과 같이 Empty Objects를 세팅한다.
이후 다음과 같이 컴포넌트를 추가하여 움직임을 구현한다.
이후 XR Origin 오브젝트에 Character Controller
과 Character Controller Driver
를 추가해 직접적인 플레이어의 움직임에도 캐릭터가 움직일 수 있게 구현한다.
찌르기, 잡기, 레이 인터랙션 등 VR 내에서 여러 인터랙션 방식이 존재한다.
이에 대한 우선순위 부여 등의 정리 작업을 해주는 것이 XR Interaction Group
컴포넌트이다.
XR Interaction Group
컴포넌트는 XR Controller
컴포넌트가 존재하는 Left/Right Hand Component 오브젝트에 부착된다.
Interaction Manager
를 할당해 준 후 Starting Group Members
필드에 사용할 인터랙션들을 의도하는 우선순위 순서대로 추가해준다.
추가로 Interaction Override Configuration
을 이용해 어떠한 인터랙션이 다른 인터랙션보다 우위에 있는지를 체크할 수 있다.