Notice
Recent Posts
Recent Comments
Link
12-26 00:51
«   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) 유니티에서 오큘러스 Intergration 샘플 씬 탐구 (feat. MacOS' tears) 본문

Unity

VR) 유니티에서 오큘러스 Intergration 샘플 씬 탐구 (feat. MacOS' tears)

KingMUffin 2021. 4. 2. 16:11

우선 조작이 가능해서 탐구를 하든말든 하므로, 유니티에서 빌드 없이 바로 에디터에서 오큘러스로 조작할 수 있는 방법을 찾아보았다.

먼저 오큘러스에서 제공하는 '오큘러스 링크'라는 프로그램이 있다. 지금으로써는 가장 확실한 방법인데, 맥OS를 지원하지 않는다.

두 번째 방법은 아래 영상대로라면 오큘러스 링크 없이도 가능하다!

물론 윈도라면 말이다. 내가 해봤는데 맥OS에서는 안 된다. ㅎㅎ
가끔 이렇게 맥 미니를 구입한 걸 후회한다. 백만원짜리가 되는 게 지지리 없다.

그렇다면 매일 윈도로 재부팅해서 유니티를 사용하거나, 실행 한 번에 10분씩 걸리는 빌드로 테스트하는 수밖에 없다.

또 한참 고민하던 찰나, 빌드 시간을 단축하는 법을 알려주는 매뉴얼이 있다는 사실을 깨달았다.

 

Optimize Build Iterations for Android apps | Oculus Developers

Optimize Build Iterations for Android apps Build process is one of the significant processes of the app development lifecycle. The time the system takes to build...deploy...run...repeat is known as iteration time. For developers, faster iteration time is p

developer.oculus.com

맥OS는 못 한다. ㅎㅎㅎ

망할, 이 정도면 윈도우즈만이 유일하다는 오큘러스의 전언이다. 

혹시나 해서 OVROveray 씬을 다시 빌드해봤는데, 144초(2분 반 정도)(12의 제곱 ㅋ) 걸렸다. 실행까지 3~4분 걸리는 셈. 우쿨렐레 한 번 연주할 시간이다.

다시 빌드해보니 1분 정도로 줄었다. 흠.. 할 만한데? 그냥 맥으로 하기로 했다.

 


 

또 몇 시간동안 Oculus Intergration을 쓸지, Unity XR Interaction Toolkit을 쓸지 고민했다.

지금 7시 반이 되기 전인데, 빌드하기 전부터 고민하고 있었으니 대충 4~5시간째다. 지금 맥아리가 없다. 캡스톤디자인 보고서 제출 기간도 그 정도 남았다. 이제라도 글을 쓰며 정리해보자.

 

일단 직접 써보자. XR Interaction Toolkit 패키지는 설치해도 샘플 씬이 없다. 아래 유니티 공식 깃허브에서 다운로드해야 한다.

 

Unity-Technologies/XR-Interaction-Toolkit-Examples

This repository contains various examples to use with the XR Interaction Toolkit - Unity-Technologies/XR-Interaction-Toolkit-Examples

github.com

이 게시글 작성일 기준 프로젝트 파일이 2019 버전이었는데 다행히 2020 버전으로 업그레이드해도 아무 오류가 없었다.

빌드 후 실행해보았는데, 이 예제 씬은 정말 잘 만들었다. 한 씬에 필수 기능을 모두 모았다. 이런 통합 정신을 모두가 본받았음 좋겠다. 오큘러스 퀘스트의 입력도 잘 받는다.

 

 

한편, Oculus Intergration의 샘플 씬을 실행할 때마다 같은 오류가 발생한다.

NullReferenceException: Object reference not set to an instance of an object OculusSampleFrameworkUtil.HandlePlayModeState (UnityEditor.PlayModeStateChange state) (at Assets/Oculus/SampleFramework/Editor/OculusSampleFrameworkUtil.cs:43) UnityEditor.EditorApplication.Internal_PlayModeStateChanged (UnityEditor.PlayModeStateChange state) (at /Users/bokken/buildslave/unity/build/Editor/Mono/EditorApplication.cs:404)
 

Developing for the Oculus Quest

Everyone wants to talk about consumer VR. I just want to make some games.

jeffrafter.com

찾아보니 보통 맥OS용 유니티에서 발생하는 오류고, OVRPlugin을 지원하지 않기 때문이며, 본질적으로 해결할 수 없다고 한다. ㅋㅋㅋㅋㅋㅋ

그럼 이건 뭣하러 있는 건데?

위의 링크에서 가르쳐주는 대로 해결하면 OVR Headset Emulator script를 사용할 수 없게 된다. 이런 편한 기능의 존재는 몰랐지만 맘에 안 드네? 심지어 2019년부터 있었던 오류다.

 

하지만 이 오류가 어떤 문제를 일으키는지는 아직 모르겠다. Locomotion Sample Scene에서 텔레포트 스크립트가 제대로 작동하지 않는 문제와 관련이 있을까? Parabolic Ray(포물선)로는 아무데나 이동할 수 없는 건 NavMesh나 충돌 인식이 없어서 그렇다 해도, 텔레포트 노드로도 이동할 수 없는 건 왤까? (경고 : 여기서부터 환장파티가 시작됩니다)

심지어 위의 출처에서 보여주는 예시 이미지에서는 아무데나 이동할 수 있다. 

또, TeleportTransitionInstant 스크립트를 비활성화하고 TeleportTransitionWarp를 활성화해도 텔레포트 방식이 그대로인 건 왤까?

 

위의 출처

아, 에디터에서 활성화하지 말고 LocomotionSampleSupport 스크립트를 수정해야 하는구나. 그래서 일단 유일하게 텔레포트가 가능한 노드 텔레포트 설정 함수에서 텔레포트 방식을 바꾸어보기로 했다.

// Teleport between node with A buttons. Display laser to node. Allow snap turns.
    void SetupNodeTeleport()
    {
        SetupTeleportDefaults();
        SetupNonCap();
        //lc.PlayerController.SnapRotation = true;
        //lc.PlayerController.FixedSpeedSteps = 1;
        lc.PlayerController.RotationEitherThumbstick = true;
        TeleportController.EnableRotation(true, false, false, true);
        ActivateHandlers<TeleportInputHandlerTouch, TeleportAimHandlerLaser, TeleportTargetHandlerNode, TeleportOrientationHandlerThumbstick, TeleportTransitionBlink>();
        var input = TeleportController.GetComponent<TeleportInputHandlerTouch>();
        input.AimingController = OVRInput.Controller.RTouch;
        //var input = TeleportController.GetComponent<TeleportAimHandlerLaser>();
        //input.AimingController = OVRInput.Controller.RTouch;
    }

음, 메뉴얼에서 설명한 부분이 있다! 근데, 그대로 있다! 완전 똑같다. 하나도 다르지 않다. 텔레포트 방식이 Blink다. 그런데 실제로 보이는 방식은 Instant다. 아무 시각 효과도 없다. 잠깐.. 혹시 텔레포트 방식은 잘 적용되었는데 시각 효과만 안 보이는 걸 수도 있지 않을까?

바로 오큘러스를 뒤집어 쓰고 노드 텔레포트를 시도했다. 딜레이가 있다. Instant 방식이었다면 딜레이가 없어야 한다.

에디터에서 미리 지정한 시간인 0.5초 만큼 기다린 후 텔레포트를 수행한다. 즉 깜빡이는 시각 효과만 보이지 않는 것이다. 왜 안 보여?

 

그냥 샘플 씬이 겁나게 허술하다. 다른 샘플 씬도 그렇다.
CustomHands Sample Scene이나 HandsInteractionTrainScene와 같은 손을 이용하는 샘플 씬은 빌드 후 실행하면 손이 보이지도 않는다! 환장하겄네.

정말로 샘플 씬을 겁나 못 만든 것뿐이라면 이 문서를 보면서 직접 하나하나 만들면 된다. 근데, 그렇게까지 해야하나?? 이미 잘 만들어진 XR Interaction Toolkit이 있는데?
그렇게 직접 만든다 해도 또 문제가 안 생길 거란 신뢰도 없다. 게다가 멀티 플랫폼 3D 엔진인 유니티의 플러그인이 윈도만 편애한다? 이건 유니티와 사용자에 대한 모욕이다. 텔레포트 후에 바라볼 방향을 조작하는 기능도 겁나 쓸데없어 보인다. (이건 개인적인 의견)

 

 

결론을 내리겠다. Oculus Intergration아주 잘 만든 폐기물이다.

이 에셋에서 제공하는 특별하고 유용한 기능이 분명 있다.

  • 아바타와 같은 오큘러스 플랫폼,
  • OculusNativeSpatializer,
  • OVROverlay(씬 로딩 도중 표시할 공간. And the difference between rendering to a compositor layer vs directly to an eye buffer에 대한 이해. 근데 프레임과 입력 지연이 처참히 감소해서 뭘 보여주려는 건지 잘 모르겠다..) 등.

그것들은 아직은 필요하지 않다. 만약 언젠가 필요해졌을 땐, 지금까지 마주한 모든 결함이 사라져있길 바라며.. 이제부터는 XR Interaction Toolkit을 탐구하도록 하겠다.