스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
Unity VR 앱을 완전 몰입형 공간에 구현하기
기존 Unity VR 앱과 게임을 visionOS에 구현할 방법을 알아보세요. 작업을 시작할 때 유용한 워크플로를 살펴보고 앱과 게임에서 Unity 입력 시스템으로 손과 눈을 위해 빌드하는 법을 보여 드리겠습니다. Unity의 XR 인터랙션 툴킷과 포비티드 렌더링을 위한 팁, 모범 사례를 확인하세요.
챕터
- 0:01 - Intro
- 2:28 - Build and run workflow
- 3:15 - Prepare your graphics
- 5:56 - Input options
- 13:43 - Wrap-Up
리소스
관련 비디오
WWDC23
-
다운로드
♪ 감미로운 인스트루멘탈 힙합 ♪ ♪ 안녕하세요 크리스토퍼 피게로아입니다 Apple ARKit 소속이죠 저는 Unity에 있는 피터 쿤입니다 Unity는 자사의 엔진과 XR 생태계를 이 플랫폼에 구현해서 Unity 개발자 여러분이 프로젝트를 쉽게 가져오게 했습니다 피터와 제가 지금 보시는 Rec Room 같은 완전 몰입형 경험을 빌드하는 법을 소개할 텐데요 여러분에게 이미 익숙한 Unity 워크플로를 사용합니다 가장 먼저 Immersive Space를 완전 몰입 방식으로 만들어 주세요 그러면 앱에서 passthrough가 숨겨지고 사용자는 다른 세계로 이동하게 됩니다 완전 몰입형 경험에서 Unity는 CompositorServices를 활용해서 Metal의 강력한 렌더링 기능을 앱에 선사합니다 또 Unity는 ARKit를 사용해서 몸 위치와 주변 환경도 인식합니다 손 스켈레톤 추적도 되고요 Unity는 이런 기술을 기반으로 Unity Engine에서 동일한 서비스를 제공합니다 이 플랫폼에서 Unity로 완전 몰입형 경험을 만들 때는 크게 두 가지 접근이 가능합니다 완전 몰입형 Unity 경험을 플랫폼에 구현해서 플레이어의 주변 환경을 여러분만의 환경으로 대체할 수도 있고 passthrough로 콘텐츠를 혼합해서 주변 환경과 블렌딩되는 몰입형 경험을 만들 수도 있습니다 두 번째 방법에 관심이 간다면 '몰입형 Unity 앱 만들기'를 추천합니다 Unity 개발자가 Apple의 새로운 기술로 완전 몰입형 VR 게임을 이 플랫폼에 어떻게 구현할지를 이제 피터가 말씀드리겠습니다 고마워요, 크리스토퍼 Against Gravity의 Rec Room을 먼저 보여 드리겠습니다 이 인기 VR 소셜 플랫폼에서 사용자들은 전 세계 사람들과 함께 게임과 경험을 만들고 즐길 수 있습니다 Unity 게임 엔진으로 빌드되었는데 이는 강력하고 유연한 게임 개발 플랫폼을 제공하는 엔진입니다 여러분의 VR 콘텐츠를 Rec Room처럼 이 새로운 플랫폼에 더 쉽게 구현할 수 있는 도구와 기술을 몇 가지 소개하겠습니다 이 신규 플랫폼에 Unity 콘텐츠를 구현하려 할 때 염두에 두실 사항도 말씀드리겠습니다 Unity에서 기기로 콘텐츠를 배포할 때 사용할 워크플로부터 살펴봅시다 이 플랫폼의 그래픽과 관련해서도 기억해 두실 부분이 몇 가지 있습니다 끝으로는 컨트롤러 입력을 손 입력으로 조정할 방법과 전환에 도움이 되도록 Unity에서 제공하는 도구도 이야기해 보겠습니다 먼저 얘기할 빌드 및 실행 워크플로는 이미 익숙하실 텐데요 이 플랫폼을 위한 지원은 Unity에 완전히 빌드되어서 몇 가지 단계만 거치면 여러분의 프로젝트가 기기에서 실행되는 걸 볼 수 있습니다 첫 번째는 이 플랫폼에 맞는 빌드 타깃 선택입니다 이어서 다른 VR 플랫폼과 마찬가지로 XR 플러그인을 활성화하세요 앱이 네이티브 플러그인에 의존한다면 플러그인은 이 플랫폼에 맞게 재컴파일되어야 합니다 그렇지 않고 원시 소스 코드나 .mm 파일을 쓰면 그대로 괜찮습니다 이제 Unity에서 빌드하면 Xcode 프로젝트가 생성됩니다 iOS나 Mac, Apple TV 타깃과 마찬가지죠 다음으로 Xcode에서 기기 혹은 기기 시뮬레이터로 빌드하고 실행하면 빠른 반복이 가능합니다 사용자의 환경을 완전 몰입형 경험으로 변환하는 데 사용하는 그래픽 파이프라인 역시 익숙하겠지만 반드시 이해해야 할 새로운 개념이 몇 가지 있습니다 모든 프로젝트는 시작 단계에서부터 어떤 렌더링 파이프라인을 쓸지 택해야 합니다 유니버설 렌더 파이프라인은 이상적인 선택지죠 이 플랫폼에 고유한 특수 기능을 활성화하거든요 바로 포비티드 렌더링입니다
포비티드 렌더링은 눈이 초점을 맞출 가능성이 큰 렌즈의 중심에 픽셀을 더 많이 밀집시키고 눈이 디테일에 덜 민감해지는 화면 주변부에서 디테일을 줄이는 기술입니다 그러면 기기 사용자의 경험 품질이 더더욱 높아집니다 유니버설 렌더 파이프라인을 사용하면 정적 포비티드 렌더링이 전체 파이프라인에 적용됩니다 URP 기능과도 함께 잘 작동하죠 포스트 프로세싱과 카메라 스태킹 HDR 등의 기능요 포비티드 렌더링의 힘을 빌릴 수 있는 커스텀 렌더 패스가 있으면 Unity 2022의 새 API로 이 기술을 이용할 수 있습니다 비선형 공간에서 렌더링이 발생하니 재매핑을 처리하는 셰이더 매크로도 있습니다 정적 포비티드 렌더링을 이용하면 중요한 픽셀에 리소스를 들여서 고품질 시각 경험을 만들어 내게 됩니다 이 플랫폼에 그래픽을 최적화할 다른 방법으로는 싱글 패스 인스턴스화 렌더링이 있습니다 Unity에서 싱글 패스 인스턴스화 렌더링은 이제 Metal의 그래픽 API를 지원하며 기본으로 활성화됩니다 싱글 패스 인스턴스화 렌더링을 사용하면 엔진이 양쪽 눈에 드로우 콜을 하나만 제출해서 렌더링 파이프라인에서 컬링과 섀도잉 같은 특정 부분의 오버헤드가 줄고 스테레오로 씬을 렌더링하는 CPU 오버헤드가 감소합니다 다행히 여러분의 앱이 다른 VR 플랫폼에서도 싱글 패스 인스턴스화 렌더링으로 이미 올바르게 렌더링된다면 여기서도 셰이더 매크로 덕에 잘 작동합니다 마지막으로 고려할 게 있는데요 앱의 깊이 버퍼에 모든 픽셀의 값이 바르게 기록되고 있는지 확인하세요 시스템 컴포지터는 재투영에 깊이 버퍼를 사용합니다 깊이 정보가 빠진 곳은 시스템이 오류 색상을 렌더링해 표시해 줍니다 한 가지 예인 스카이박스는 사용자와 끝없이 떨어져 있으니 reverse Z를 써서 깊이값을 0으로 기록합니다 기기에는 수정이 표시되어야 하죠 Unity 셰이더를 모두 수정해서 깊이 버퍼에 정확한 값을 기록하게 했지만 커스텀 효과로 커스텀 스카이박스나 물 혹은 투명도 효과가 있다면 각 픽셀 깊이에 값을 꼭 기록해 주세요 그래픽을 기기에 렌더링했으면 상호 작용이 가능하게 할 차례입니다 이 기기의 상호 작용은 남다릅니다 사람들은 손과 눈을 사용해서 콘텐츠와 상호 작용하죠 이 플랫폼의 Unity 앱에는 몇 가지 방법으로 상호 작용을 추가할 수 있습니다 XR 인터랙션 툴킷으로는 손 추적을 추가해서 기존 프로젝트를 더 쉽게 조정할 수 있습니다 Unity 입력 시스템으로 내장 시스템 동작에 반응하는 것도 가능합니다 Unity Hands package로 맞춤형 상호 작용을 위한 손 관절 원시 데이터도 쓸 수 있죠 XRI라고도 하는 XR 인터랙션 툴킷은 고차원 상호 작용 시스템을 제공합니다 입력을 상호 작용으로 쉽게 바꿀 수 있도록 설계되었죠 3D 객체와 UI 객체에 모두 잘 맞습니다 XRI는 손 추적 같은 입력 유형을 추출하고 그 입력을 동작으로 바꿔 앱이 반응할 수 있게 만듭니다 그러면 여러 유형의 입력을 수용하는 플랫폼에서 입력 코드가 두루 작동하게 되죠 XRI를 사용하면 호버와 잡기, 선택과 같은 일반적인 상호 작용에 더 쉽게 응답할 수 있습니다 3D 공간은 물론 3D 공간 월드 UI에서도요 이 툴킷에는 locomotion 시스템도 있어서 완전 몰입형 공간으로 한층 편안하게 이동할 수 있습니다 사람들이 월드와 상호 작용하면 몰입을 위해 시각적 피드백이 중요해집니다 XRI를 쓰면 각 입력 제약에 대한 시각 반응을 정의할 수 있습니다 XRI의 핵심은 기초를 이루는 Interactable과 Interactor 컴포넌트입니다 Interactable은 씬의 객체로 입력을 수신합니다 Interactor를 정의하면 사람들이 Interactable과 상호 작용하는 방식이 지정됩니다 상호 작용 관리자는 이 컴포넌트를 묶어 주죠 첫 단계는 씬에서 상호 작용이 가능한 객체와 그런 상호 작용이 발생했을 때 어떻게 반응할지를 결정하는 겁니다 그러려면 Interactable 컴포넌트를 객체에 추가하면 되죠 내장된 유형은 세 가지입니다 Simple은 상호 작용이 들어오는 객체를 표시합니다 SelectEntered나 SelectExited 같은 이벤트를 이 컴포넌트로 구독할 수 있습니다 Grab으로는 선택되거나 잡힌 객체가 Interactor를 따라가면서 속도가 방출되면 그 값을 받습니다 TeleportArea와 TeleportAnchor 등 Teleport Interactable로는 플레이어가 텔레포트할 영역이나 지점을 정의할 수 있습니다 커스텀 Interactable을 만들 수도 있고요 Interactor는 Interactable로 태그한 객체의 선택이나 상호 작용을 담당합니다 호버 이펙트를 내거나 각 프레임을 선택할 수 있는 Interactable의 목록을 정의하죠 Interactor에는 몇 가지 유형이 있습니다 Direct Interactor는 터치된 Interactable을 선택합니다 이걸 사용하면 사람의 손이 상호 작용 가능한 객체를 터치하거나 그런 객체 근처에 있을 때 알 수 있습니다 Ray Interactor는 멀리서 상호 작용 할 때 쓰입니다 이 Interactor는 곡선과 직선 및 사용자화되는 시각화로 다양한 설정이 가능해서 프로젝트의 시각적 스타일에 맞게 조정할 수 있습니다 사용자가 상호 작용을 시작하면 상호 작용 실행 방식을 선택할 수 있는데요 가령 잡기 상호 작용이라면 사용자의 손을 향해 객체를 이동시키는 게 좋겠죠 Ray Interactor로는 잡기의 자유도를 제한해서 게임플레이와 매칭할 수 있습니다 완전 몰입형 경험에서 흔한 상호 작용 한 가지는 객체를 잡아서 콘텍스트상 적절한 위치에 배치하는 겁니다 소켓에 배터리를 넣는 것처럼요 Socket Interactor는 플레이어에게 객체를 받을 수 있는 특정 영역을 보여 줍니다 이런 Interactor는 손에 붙은 것이 아니라 월드 어딘가에 살아 있습니다 손 추적과 나아가 컨트롤러를 쓸 때 사용자가 당연히 수행하려 할 일반적인 상호 작용은 Poke Interactor입니다 Direct Interactor와 유사하지만 방향 필터링이 들어가서 정확한 동작이 수행되어야 상호 작용이 촉발됩니다 보기로 하는 상호 작용을 원하면 Gaze Interactor로 Ray Interactor를 일부 확장해서 시선 처리를 쉽게 할 수 있습니다 Gaze Interactor는 자동으로 Interactable의 콜라이더 크기를 키우니 선택하기가 쉬워지죠 상호 작용 관리자는 이 모든 게 모이도록 Interactor와 Interactable 사이의 중개자 역할을 하며 상호 작용이 잘 교환되게 합니다 Interactor와 Interactable이 등록된 지정 그룹 내의 상호 작용 상태에 변경을 개시하는 게 주 역할인데요 상호 작용 관리자를 단일하게 두고 전체 Interactor가 모든 Interactable에 영향을 미치도록 하는 것이 보통입니다 다른 방법으로는 보조 Interaction Manager를 다중으로 활용할 수도 있습니다 Interactor와 Interactable 모음은 관리자마다 고유합니다 이런 관리자가 활성화 혹은 비활성화되면 특정 상호 작용 집합이 활성화 혹은 비활성화됩니다 씬이나 메뉴마다 Interactable 집합을 달리할 수도 있겠죠 XR 컨트롤러 컴포넌트로는 수신할 입력 데이터를 처리할 수 있습니다 손이나 추적된 기기의 입력 동작이 들어와서 Interactor로 전달되면 입력에 따라서 대상을 선택하거나 활성화할지가 결정됩니다
각 XR 인터랙션 상태에서 Select 같은 Input Action Reference를 바인딩해야 하는데요 손이나 컨트롤러당 XR 컨트롤러 컴포넌트가 하나로 제한되지 않아서 손과 컨트롤러 모두를 독립적으로 지원할 수 있는 유연성이 확보됩니다 XRI에 번들로 들어 있는 샘플 코드에서 방법을 확인하실 수 있습니다 XRI의 고급 기능뿐 아니라 시스템 제스처 입력을 Unity 입력 시스템에서 바로 사용하는 것도 가능합니다 그러면 탭 동작처럼 플랫폼에 내장된 상호 작용을 여러분의 상호 작용 시스템에 매핑할 수 있죠 Unity 입력 시스템의 바인딩 패스로 이런 시스템 제스처에 접근하고 응답할 수 있습니다 예를 들어 핀치 제스처는 활성화되면 포지션, 회전과 더불어 값으로 나타납니다 이런 게 입력 동작에 바인딩될 수 있죠 사람의 초점이 향하는 곳이 포지션과 회전이 있는 핀치 제스처로 같은 프레임에 나타납니다 유연성을 더욱 높이려면 Unity Hands Subsystem으로 시스템에서 Unity Hands package를 통해 모든 손 관절 원시 데이터를 사용해 보세요 Unity Hands package로는 여러 플랫폼에서 일관성을 지니는 저차원 손 관절 데이터에 접근할 수 있습니다 각 관절을 확인해서 사용자가 취한 자세가 엄지 세우기나 검지 찌르기 같은 특정 제스처에 얼마나 근접한지를 판단하고 게임플레이 동작으로 바꾸는 코드를 작성할 수 있는데요 이는 강력하지만 맞추기는 어렵습니다 사람마다 손 크기가 다르고 동작도 각양각색이니까요 이 코드가 정의하는 메서드는 검지가 뻗었는지를 알려 줍니다 OnHandUpdate 이벤트에서 이 메서드를 호출하고 손 하나에서 계속 실행할 수 있죠 우선 검지가 뻗었는지 확인할 관절을 가져옵니다 유효하지 않은 관절은 false를 반환합니다 관절이 모두 유효하면 간단한 검사로 검지가 구부러지지 않았는지 확인합니다 다른 손가락으로 로직을 확장해서 기본적인 제스처 감지를 구현할 수 있습니다 손 관절 원시 데이터의 다른 용도로는 커스텀 손 메시 비주얼 매핑이 있습니다 게임의 아트 스타일에 더 어울리는 손을 만들 수 있죠 Rec Room은 손 관절 원시 데이터를 사용해서 시각적 스타일에 어울리는 양식화된 손 모델을 보여 줍니다 다른 플레이어의 손 모델도 보여 몰입감이 더 높아지죠 Unity Hands package의 샘플 코드로 시작하면 원시 손 관절 접근을 더 살펴보실 수 있습니다 새로운 플랫폼에 펼쳐질 여러분의 VR 경험이 무척 기대됩니다 이 플랫폼에 제공되는 Unity 지원을 더 알아보고 얼리 베타 액세스에 등록하실 분들은 unity.com/spatial을 방문해 주세요 이런 도구를 활용하면 완전 몰입형 VR 경험을 새 플랫폼에 구현할 수 있습니다 이미 익숙한 Unity 워크플로를 사용해서요 요약하자면 이번 세션에서는 새로운 플랫폼에 Rec Room과 같은 여러분의 VR 콘텐츠를 쉽게 구현하기 위한 도구와 기술을 소개했습니다 새로운 프로젝트를 시작하신다면 Unity 2022나 이후 버전을 사용하세요 기존 프로젝트가 있다면 2022로 업그레이드하시고요 유니버설 렌더 파이프라인을 도입하는 것도 고려해 보세요 내장 그래픽 파이프라인도 지원은 되지만 유니버설 파이프라인에서 모든 향후 개선이 이뤄질 겁니다 컨트롤러 기반 상호 작용을 손에 적용해 보세요 XR 인터랙션 툴킷과 Unity Hands package로 지금 바로 시작할 수 있습니다 마지막으로 Unity를 사용해서 passthrough가 있는 몰입형 경험을 어떻게 만들지 더 알아보고 싶다면 '몰입형 Unity 앱 만들기'를 추천합니다 '공간 컴퓨팅을 위한 멋진 게임 빌드하기'를 보시면 게임 개발자가 이 플랫폼에서 무엇을 할 수 있는지 개략적으로 알 수 있습니다 여러분이 플랫폼에 무엇을 구현하실지 기대됩니다 시청해 주셔서 감사합니다 ♪
-
-
12:46 - Translate raw joints into gameplay actions
// Translate raw joints into gameplay actions static bool IsIndexExtended(XRHand hand) { if (!(hand.GetJoint(XRHandJointID.Wrist).TryGetPose(out var wristPose) && hand.GetJoint(XRHandJointID.IndexTip).TryGetPose(out var tipPose) && hand.GetJoint(XRHandJointID.IndexIntermediate).TryGetPose(out var intermediatePose))) { return false; } var wristToTip = tipPose.position - wristPose.position; var wristToIntermediate = intermediatePose.position - wristPose.position; return wristToTip.sqrMagnitude > wristToIntermediate.sqrMagnitude; }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.