혼합 현실 (로컬 멀티플레이어)
개요
이 샘플은 다음을 허용하는 프로젝트를 설정하는 방법을 보여줍니다:
- Meta 공유 공간 앵커를 사용한 동일 공간 멀티플레이어
- 핸드 트래킹 동기화 및 컨트롤러 기반 핸드 포지셔닝에서 핑거 트래킹으로의 전환
기술 정보
- 이 샘플은 공유 모드 토폴로지를 사용합니다.
- 이 프로젝트는 유니티 2022.3, Fusion 2, 그리고 Photon Voice 2.53으로 개발되었습니다.
시작하기 전에
샘플 실행을 위해서:
PhotonEngine 관리 화면에서 Fusion AppId를 생성하고 Real Time 설정 (Fusion 메뉴에서 접근 가능)의
App Id Fusion
필드에 붙여 넣습니다.PhotonEngine 관리 화면에서 Voice AppId를 생성하고 Real Time 설정의
App Id Voice
필드에 붙여 넣습니다.SampleSceneWithNetworkRig
씬으로 로드하고Play
를 누릅니다.
다운로드
버전 | 릴리즈 일자 | 다운로드 | |
---|---|---|---|
2.0.0 | May 07, 2024 | Fusion mixedreality 2.0.0 Build 534 |
테스팅
코로컬라이제이션을 테스트하기 위해서는 메타 릴리즈 채널을 통해 애플리케이션을 배포해야 합니다.
애플리케이션을 테스트하는 데 문제가 있는 경우 주저하지 말고 Discord에 참여하십시오.
입력 처리
메타 퀘스트 (컨트롤러 추적)
- 잡기 : 먼저 물건 위에 손을 올리고 컨트롤러 그랩 버튼을 사용하여 잡습니다
- 그리기: 손이 잡을 수 있는 물체 위에 있지 않다면, 컨트롤러의 트리거 버튼을 사용하여 그림을 그리기 시작합니다. 마지막 선이 그려진 후 몇 초 후에, 그림이 완성되고, 앵커가 그것을 잡을 수 있게 할 것입니다.
메타 퀘스트 (손 추적)
- 잡기 : 손가락을 접는 동안 물건 위에 검지와 엄지손가락을 대고 잡습니다
- 그리기: 손이 잡히는 물체 위에 있지 않다면, 그림을 그리기 시작하기 위해 손가락을 핀치 하세요. 마지막 선이 그려진 후 몇 초 후에, 그림이 완성되고, 닻이 그것을 잡을 수 있게 할 것입니다.
폴더 구조
메인 폴더인 /MixedReality
에는 이 샘플의 모든 요소를 포함하고 있습니다.
/IndustriesComponents
폴더에는 Fusion 미팅 샘플, 또는 Fusion 메타버스 샘플 과 같은 인더스트리 샘플과 공유하는 컴포넌트가 들어 있습니다.
/Photon
폴더에는 Fusion 및 Photon Voice SDK가 들어 있습니다.
/Photon/FusionXRShared
폴더에는 VR 공유 샘플에서 가져온 리그 및 그립 로직이 포함되어 있어 다른 프로젝트와 공유할 수 있는 FusionXRShared 라이트 SDK를 만듭니다.
/Photon/FusionAddons
폴더에는 이 샘플에서 사용하는 인더스트리 애드온이 포함되어 있습니다.
/XR
폴더에는 가상 현실용 구성 파일들이 포함되어 있습니다.
아키텍처 개요
혼합 현실 샘플은 특히 리그 동기화를 위해 VR 공유 페이지에 설명된 것과 동일한 코드 기반에 의존합니다.
여기에 사용된 그립 시스템은 VR 공유 - 로컬 리그 찾기에 설명된 대체 "로컬 리그 그립" 구현입니다.
공유 공간 앵커를 통한 코로컬라이제이션
혼합 현실에서는 여러 사용자가 같은 룸에 있으면 실제 위치에서 아바타를 보는 것이 더 편합니다. 이를 위해 연결 시 사용자가 이미 룸에 있는 경우 새로운 사용자가 원격 이동되고 유니티 룸에서 방향이 변경되어 실제 보는 것이 네트워크 방의 위치와 일치합니다.
이를 위해 공유 공간 앵커를 사용합니다.
공유된 실제 룸 클라우드 포인트를 기반으로 하며 메타 백엔드에서 동기화 및 공유되며 엔드 개발자가 ID로 사용할 수 있습니다.
전체적인 과정은 다음과 같습니다:
- 룸에 연결할 때 메타의 백엔드에 저장된 앵커를 생성하고 Fusion에서 동기화되는 Id를 생성합니다
- 다른 사용자가 접속하면 Fusion the anchor Id를 통해 수신합니다
- 그런 다음 메타 SDK에 이 ID가 자신의 방에 있는지 묻습니다(현장 뒤에서 Oculus 백엔드에서 ID를 요청하고 로컬 검색을 수행합니다)
- 앵커가 발견되면 새 사용자의 순간 이동/회전이 수행됩니다
이 샘플은 SSAManager
, OculusUserInfo
그리고 ReferenceAnchor
컴포넌트를 통해 수행됩니다.
네트워크 데이터
OculusUserInfo
는 사용자 리그에 배치된 네트워크 동작으로, 사용자 Oculus Id, 이 사용자의 코로컬라이제이션 상태 및 다른 사용자와 코로컬라이제이션 된 상태를 동기화합니다.
ReferenceAnchor
는 공유 공간 앵커마다 생성되는 네트워크 동작으로, 앵커 ID("UUID")와 공유되고 있던 오큘러스 사용자 ID의 목록을 동기화합니다. 게임 객체에 위치를 동기화하기 위한 NetworkTransform
도 포함되어 있습니다.
SSAManager
는 메타 백엔드와의 동기화, 생성, 룩업, 공유 공간 앵커를 처리하는 모든 작업을 구현합니다. 또한 모든 앵커와 사용자를 추적하고 코로컬라이제이션이 발견되면 로컬 사용자에게 최종적인 순간 이동/회전을 적용합니다.
공유 앵커 동기화 프로세스 상세
공유 공간 앵커를 처리하는 기본 프로세스는 문서SSA에 대한 "큰 그림"에 설명되어 있습니다.
샘플에서 SSA를 구현하는 3개 클래스 간의 로직과 작업 재분할을 더 잘 이해하기 위해 공유 공간 앵커를 처리하는 데 사용되는 전체 프로세스와 각 단계를 처리하는 클래스가 있습니다:
모든 사용자:
- [
OculusUserInfo
] Oculus Platform Core SDK 초기화 대기 - [
OculusUserInfo
] 사용자가 응용프로그램을 사용할 수 있는지 확인 - [
OculusUserInfo
] 로그인한 사용자의 Oculus 사용자 ID 가져오기 - [
OculusUserInfo
] Fusion 네트워킹: 다른 사용자가 액세스할 수 있도록 네트워크로 연결된 var에 Oculus ID를 저장
앵커를 작성하는 사용자의 경우:
- [
ReferenceAnchor
] 로컬 Oculus 사용자 ID가 사용 가능할 때까지 대기 - [
ReferenceAnchor
] 공유 공간 앵커 작성(SSAManager
사용) - [
ReferenceAnchor
] 공간 앵커에 UUID가 할당되고 준비될 때까지 대기 - [
ReferenceAnchor
] 메타의 백엔드에 앵커 저장 (SSAManager
사용) - [
ReferenceAnchor
] Fusion 네트워킹: 앵커 UUID를 네트워크 변수에 저장 - [
ReferenceAnchor
] 룸의 모든 Oculus 사용자 ID가 메타의 백엔드에 있는 앵커 위치에 액세스할 수 있도록 권한 부여(SSAManager
사용) - [
ReferenceAnchor
] Fusion 네트워킹: 네트워크 배열에서 앵커에 접근할 수 있는 Oculus 사용자 ID의 목록을 저장
원격 앵커를 찾는 사용자
- [
ReferenceAnchor
] Fusion 네트워킹: 앵커 UUID를 수신 - [
ReferenceAnchor
] Fusion 네트워킹: 사용자 목록을 확인하여 메타 백엔드의 앵커 액세스가 로컬 Oculus 사용자 ID에 대해 언제 승인되었는지 확인 - [
ReferenceAnchor
] 메타 SDK에 의뢰하여 실생활 앵커를 검색(SSAManager
사용) - [
ReferenceAnchor
] 룸에서 앵커가 실제로 검색된 경우 공유 공간 앵커를 생성하여 검출된 데이터에 바인딩(SSAManager
사용) - [
ReferenceAnchor
] 공유 공간 앵커가 로컬화될 때까지 대기(SSAManager
사용) - [
SSAManager
] 사용자 하드웨어 리그의 위치를 재배치하여 앵커 네트워크 위치(형제NetworkTransform
컴포넌트에서 수신됨)가 실제 앵커 위치와 일치하도록 합니다.
여기에 설명된 코로컬라이제이션 과정에 대한 이해를 돕기 위해 룸 중앙에 정보 패널이 표시됩니다.
Oculus 관리 화면 요건
공유 공간 앵커를 사용하기 위해서는 오큘러스 사용자 ID가 필요합니다.
액세스하려면 Oculus 관리 화면에서 애플리케이션을 만들어야 합니다.
그런 다음 데이터 사용 확인에 사용자 ID 및 사용자 프로필 액세스가 요청된 상태로 작성해야 합니다.
마지막으로, Quest에서 Oculus 사용자 ID에 실제로 액세스하려면 채널 릴리즈를 통해 애플리케이션을 배포해야 합니다(그렇지 않으면, 사용자 ID에 대해 항상 0을 받을 수 있습니다).
코로컬라이제이션 팁
SSA 앵커 기반의 코로컬라이제이션 과정은 상당히 민감할 수 있습니다. 가장 중요한 것은 코로컬라이제이션 경험에 관련된 각 장치의 룸 스캔 품질입니다.
또한 동일한 사용자가 룸에 처음 있을 때마다 코로컬라이제이션이 전혀 작동하지 않을 수도 있습니다. 클라우드 포인트 데이터 공유 설정에 헤드셋에 문제가 있는 경우 발생할 수 있습니다(이것이 true로 설정된 것처럼 보이지만 이것은 고려되지 않습니다).
수정하려면 퀘스트에서 Parameters > Confidentiality > Device authorizations로 이동하고 "클라우드 포인트"를 선택 해제하고 다시 확인하십시오. Parameters > Confidentiality > Authorizations >
사용한 인더스트리 애드온
우리는 3D/XR 애플리케이션 프로토타이핑 속도를 높이기 위해 재사용 가능한 애드온 목록을 인더스트리 서클 회원들에게 제공합니다.
상세 내용은 인더스트리 애드온을 참고하세요.
다음은 이 샘플에서 사용한 애드온입니다(이 애드온 중 일부는 필요한 종속성으로 다른 추가 기능을 가지고 있으며 여기에 나열되지 않고 추가 기능 페이지에 나열되어 있음에 유의하십시오).
메타의 손을 위한 손가락 동기화
손가락은 손가락 추적 데이터에 대한 높은 수준의 압축을 제공하는 Meta OVR 손 동기화 애드온에 의해 추적됩니다.
그리기
손가락으로 그리기 위해, 드로잉 애드온의 Drawer
의 하위 클래스인 FingerDrawer
가 생성되었습니다.
이 버전은 HandIndexTipDetector
컴포넌트를 사용하여 인덱스 위치를 수신하고(손가락 추적 골격 또는 컨트롤러 추적 핸드 골격에서 온 것과 상관없이) 현재 모드를 기반으로 그리기를 트리거 합니다.
ConnectionManager
연결 시작을 관리하고 사용자 표현을 생성을 위해 ConnectionManager
애드온을 사용합니다.
상세 내용은 ConnectionManager 애드온을 참고하세요.
동적 오디오 그룹
동적 오디오 그룹 애드온을 사용하여 사용자 간의 거리를 고려하여 편안함과 대역폭 소비를 최적화하면서 사용자가 함께 채팅할 수 있습니다.
상세 내용은 동적 오디오 그룹 인더스트리 애드온을 참고하세요.
Avatar 및 RPMAvatar
샘플의 현재 상태는 아바타 선택 화면을 제공하지 않지만 아바타 애드온이 통합되어 있어 Ready Player Me 또는 간단한 아바타를 사용하기 위해 선택 화면을 쉽게 추가할 수 있습니다.
현재 로컬 사용자 설정은 장면에 존재하는 RPMAvatarLibrary
에서 임의의 아바타를 선택하는 것입니다.
타사 컴포넌트
- Oculus Integration
- Oculus Lipsync
- Oculus 샘플 프레임워크
- Ready player me
- 사운드