유니티 VR 시작하기

정선호·2023년 9월 12일
0

Unity Features

목록 보기
19/27

튜토리얼 재생목록

OpenXR 플러그인으로 오큘러스 퀘스트 2를 비롯한 여러 VR기기 애플리케이션을 구현하는 작업
자세한 내용은 재생목록 확인

목차

  1. 초기 설정 및 시작
  2. 입력과 손 애니메이팅
  3. 오브젝트 붙잡기
  4. 레이 상호작용
  5. 포킹 상호작용
  6. XR 손
  7. 움직임
  8. 인터랙션 그룹

초기 설정 및 시작

영문 튜토리얼

유니티 패키지 다운로드

유니티 패키지 매니저에서 다음 패키지들을 다운받는다

  • XR Plugin Management : 각종 XR기기들(오큘러스, vive 등)에 대한 패키지를 자동으로 설치 및 관리해준다.
  • XR Interaction Toolkit : XR 환경에서 필요한 작업들(물건 들기, XR UI 등)에 대한 컴포넌트들의 모음이다.
    • 패키지를 다운로드한 후 Samples - Starter Assets도 추가 임포트하여 샘플 VR 인터랙션 키트를 다운로드 받을 수 있다.

OpenXR 설정

OpenXR은 모든 XR 기기들에 대한 표준 SDK 플러그인이다.
Edit - Project Settings - XR Plug-in Management에서 OpenXR을 체크해 플러그인을 다운로드 및 적용한다.

이후 다음과 같이 세팅해준다.

  • 프로젝트 세팅에 추가된 OpenXR탭에서 Interaction Profiles에서 타겟 기기의 입출력 프로파일을, OpenXR Feature Groups에서 추가적인 지원 그룹을 설정한다.
  • 프로젝트 세팅의 Player에서 모바일 관련 설정을 해준다.
    • Minimum API Level을 24(Android 7.0 Nougat)로 지정한다.
    • Scripting Backend를 IL2CPP로 지정한 후 Target Architectures를 ARM64만 지정한다.

XR 플레이어

유니티 씬에 XR Origin을 추가하여 VR 플레이어를 씬에 소환할 수 있다.
VR 플레이어는 기본적으로 카메라와 왼손, 오른손을 갖고 있다.

카메라

  • Tracked Pose Driver를 기본적으로 갖고 있으며 해당 컴포넌트를 통해 기어의 이동과 회전을 적용한다.

양손

  • 기본적으로 XR Controller를 갖고 있다.
    • XR ControllerInput SystemInput Action Manager Refernce를 할당해 원하는 입력에 동작을 할당할 수 있다.
    • Model에 개발자가 원하는 프리팹을 추가하여 손을 대신할 게임오브젝트를 배치할 수 있다.

입력과 손 애니메이팅

입력

XR Interaction ToolkitSample Package에 손과 카메라를 포함한 모은 XR 관련 입력 매핑이 되어있는 인풋 시스템이 존재한다.
이 인풋 시스템에 매핑된 입력값을 바탕으로 추후 구현하는 입력 및 애니메이션을 구현한다.

손을 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를 추가하여 구현할수 있다.

XR Direct Interaction

잡기를 수행할 손 오브젝트에 추가한다.
해당 컴포넌트는 Is trigger가 체크된 콜라이더를 필요로 한다.
또한 Interaction Manager에 씬에 설정된 인터랙션 매니저를 추가해야 한다.

해당 컴포넌트에서는 다음과 같은 작업을 할 수 있다.

  • Interaction Layer Mask : 레이어 마스크를 추가해 원하는 레이어를 지닌 오브젝트만 인터랙션할 수 있게 설정할 수 있다.
  • Attach Transform : 오브젝트를 잡을 때 오브젝트가 달려있는 위치, 없으면 기본 손 위치를 사용한다.
  • Select Action Trigger : 입력 트리거(그랩 트리거 등)의 입력 방식에 따라 물건을 집고 놓는 방식을 다르게 한다.

이 외에도 여러 설정을 할 수 있다.

XR Grab Manager

잡기의 대상인 물체 오브젝트에 추가한다.
해당 컴포넌트는 콜라이더와 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

XR Ray Interactor는 Ray 상호작용을 위한 컴포넌트로 다음과 같은 설정을 할 수 있다.

  • 인터랙션 매니저와 레이어 마스크 설정
  • UI와의 상호작용 허용 여부
  • 오브젝트가 멀리 떨어져도 강제로 잡을 수 있는지 여부
  • 발사되는 레이에 대한 옵션
  • 잡거나 집었을 때 수행할 상호작용 선택(Selection Configuration)
  • 상호작용이 수행되었을 때 실시될 이벤트 선택(Audio/Haptic/Interactor Events)

이외에도 여러 설정을 할 수 있다.

XR Interactor Line Visual

XR Interactor Line Visual는 인게임에서 손에서 발사되는 레이의 외형을 결정하는 컴포넌트이다.
다음과 같은 설정을 수행할 수 있다.

  • 라인의 두께와 색
  • 라인의 길이 및 상황에 따른 길이 변화
  • 라인의 구부러진 정도 등

포킹 상호작용

특정 물체를 찌르거나, 어떠한 물체를 특정 방향으로 통과할 때 이벤트가 발동되게끔 하는 상호작용이다.

포킹 상호작용은 상호작용을 수행할 손에는 XR Poke Interactor가, 상호작용 대상 오브젝트에는 XR Simple Interactable 컴포넌트를 필요로 한다.
이 떄 XR Poke InteractorRequire Poke Filter가 체크되어 있으면 상호작용 대상 오브젝트에 XR Poke Filter컴포넌트도 추가해야 한다.

XR Poke Interactor

다른 인터랙터와 다르게 콜라이더를 사용하지 않고 컴포넌트 내의 크기 변수들을 이용해 상호작용 가능 범위를 조절할 수 있다.

또한 Poke Filter과 UI Interaction 여부를 설정할 수 있다.

XR Simple Interactable

상호작용을 받을 오브젝트에 필요한 컴포넌트이다.
위에서 사용한 그랩 인터랙터블이 Simple Interactable을 상속받는다.

XR Poke Filter

찔러지는 오브젝트의 이벤트가 트리거되는 방향 및 강도를 설정할 수 있다.


XR 손

밸브 인덱스와 같은 VR 기기에서 자유로운 손가락 움직임을 구현하기 위한 작업이다.

XR Hands 패키지 설치 및 적용

패키지 매니저에서 XR Hands 패키지와 해당 패키지의 샘플 다운로드

이후 Empty GameObjects들을 이용해 다음과 같이 XR Hands를 구성해준다.

이후 다음과 같이 컴포넌트들을 추가해준다.


빌드 및 수행시 이전에 사용된 손 대신 손가락을 자유롭게 움직일 수 있는 새로운 손이 스폰되는 것을 확인할 수 있다.

그랩 인터랙션 재적용

생성된 손은 이전의 그랩 인터렉션이 적용되지 않는다. 따라서 다음과 같이 새로운 그랩 인터랙션을 만들어주어야 한다.

손 컨트롤러 오브젝트의 XR Controller의 입력 레퍼런스를 변경해 이동 시 좀 더 자연스러운 애니메이팅이 발생하게 수행할 수 있다.

혹은 상호작용하는 오브젝트에 붙어있는 XR Grab Interactable 컴포넌트의 use Dynamic Attach를 활성화해 오브젝트를 자연스럽게 그랩할 수 있게 할 수 있다.


움직임

VR에서 컨트롤러 조이스틱 혹은 직접 이동으로 움직임을 구현하는 방법

Locomotion 적용

유니티 XR은 Locomotion이라는 시스템으로 플레이어의 이동을 구현한다.
다음과 같이 Empty Objects를 세팅한다.

이후 다음과 같이 컴포넌트를 추가하여 움직임을 구현한다.

이후 XR Origin 오브젝트에 Character ControllerCharacter Controller Driver를 추가해 직접적인 플레이어의 움직임에도 캐릭터가 움직일 수 있게 구현한다.


인터랙션 그룹

찌르기, 잡기, 레이 인터랙션 등 VR 내에서 여러 인터랙션 방식이 존재한다.
이에 대한 우선순위 부여 등의 정리 작업을 해주는 것이 XR Interaction Group 컴포넌트이다.

XR Interaction Group 컴포넌트는 XR Controller 컴포넌트가 존재하는 Left/Right Hand Component 오브젝트에 부착된다.
Interaction Manager를 할당해 준 후 Starting Group Members 필드에 사용할 인터랙션들을 의도하는 우선순위 순서대로 추가해준다.
추가로 Interaction Override Configuration을 이용해 어떠한 인터랙션이 다른 인터랙션보다 우위에 있는지를 체크할 수 있다.

profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글