This document is about: FUSION 1
SWITCH TO

수정중인 페이지 입니다.

VR Shared - Meta Avatars integration

Level 4
Available in the Industries Circle
Circle
Fusion Meta Avatars integration 샘플은 현재 Photon Industries Circle을 구독하고 계신 사용자분께서 만 사용하실 수 있습니다.

Industries Circle 멤버십은 전체 제품군과 독점 라이선스 옵션을 제공합니다.

개요

이 샘플의 범위는 공유 토폴로지를 사용하여 Fusion 응용 프로그램에서 메타 아바타를 통합하는 방법입니다. 주요 초점은 다음과 같습니다:

  • Fusion 네트워크 변수를 사용한 아바타 동기화
  • 립싱크와 Fusion Voice의 통합
fusion oculus meta avatar

기술 정보

이 샘플에서는 Shared Mode 토폴로지를 사용합니다.

프로젝트 개발 구성:

  • 유니티 2021.3.7f1
  • Oculus XR 플러그인 3.0.2
  • Meta Avatars SDK 18.0
  • Photon Fusion 1.1.3f 599
  • Photon Voice 2.50

시작하기 전에

샘플 실행 방법 :

  • PhotonEngine 관리 화면에서 Fusion AppId를 생성하고 Real Time 설정의 App Id Fusion 필드에 붙여 넣습니다(Fusion 메뉴에서 이동 가능).

  • PhotonEngine 관리 화면에서 Voice AppId를 생성하고 Real Time 설정의 App Id Voice 필드에 붙여 넣습니다.

  • Scenes\OculusDemo\Demo 씬을 로드하고 Play를 누릅니다.

다운로드

버전 릴리즈 일자 다운로드
1.1.3 May 05, 2023 Fusion VR Shared Meta Avatar Integration 1.1.3 Build 191

입력 처리

메타 퀘스트

  • 텔레포트 : 포인터를 표시하려면 A, B, X, Y 또는 아무 스틱이나 누르십시오. 떼었을 때 허용된 목표물에 텔레포트하게 됩니다.
  • 잡기 : 먼저 손을 물체 위에 놓고 컨트롤러 잡기 버튼을 사용하여 물체를 잡습니다.

이 샘플은 메타 핸드 트래킹을 지원합니다. 그래서, 핀치 동작을 통해서 순간 이동시키거나 물체를 잡을 수 있습니다.

폴더 구조

/Oculus 폴더에는 Meta SDK가 있습니다.

/Photon 폴더에는 Fusion 및 Photon Voice SDK가 들어 있습니다.

The /Photon/FusionXRShared 폴더에는 VR 공유 샘플에서 제공되는 리그 및 잡기 로직이 포함되어 있으며, 다른 프로젝트와 공유할 수 있는 FusionXRShared 라이트 SDK가 들어 있습니다.

/Photon/FusionXRShared/Extensions 폴더에는 동기화된 레이, 로코모션 검증 등 재사용 가능한 기능을 제공하는 FusionXRShared에 대한 확장팩이 포함되어 있습니다.

/Photon/FusionXRShared/Extensions/OculusIntegration 폴더에는 Meta SDK 통합을 위해 개발된 프리팹 및 스크립트가 포함되어 있습니다.

/StreamingAssets 폴더에는 사전 빌드 된 메타 아바타들이 포함되어 있습니다.

/XR 폴더에는 가상 현실에 대한 구성 파일이 들어 있습니다.

아키텍처 개요

이 페이지에서는 VR 공유 기술 샘플에 메타 아바타를 통합하는 방법을 설명합니다.

리그 설정 방법 또는 이 샘플에 대한 상세 내용에 대해서는 먼저 VR Shared 페이지를 참고하시기 바랍니다.

씬 설정

OVR 하드웨어 리그

씬에는 Oculus SDK와 호환되는 하드웨어 리그가 포함되어 있습니다. 하위 객체 MetaAvatar는 메타아바타와 관련된 모든 것을 포함하고 있습니다.

  • AvatarManager에는 OVRAvatarManager 컴포넌트가 있습니다: 메타아바타를 로드하는 데 사용

ConnectionManager

ConnectionManager는 Photon Fusion 서버에 대한 연결을 처리하고 OnPlayerJoined 콜백이 호출될 때 사용자 네트워크 프리팹을 스폰 합니다. 네트워크를 통해 음성을 스트리밍 하려면 Fusion Voice Client가 필요합니다. 기본 레코더 필드는 ConnectionManager 아래에 있는 Recorder 게임 오브젝트를 나타냅니다.

Photon Voice와 Fusion의 통합에 대한 자세한 내용은 다음 페이지 Voice - Fusion Integration를 참조하세요.

MicrophoneAuthorization 컴포넌트 덕분에 ConnectionManager 게임 오브젝트도 마이크 허가를 요청하는 역할을 합니다. 마이크 접근이 허용되면 Recorder 객체를 활성화합니다.

Recorder 하위 개체는 마이크 연결을 담당합니다. 여기에는 Recorder에서 오디오 스트림을 수신하여 OVRAvatarLipSyncContext로 전달하는 AudioLipSyncConnector 컴포넌트가 포함되어 있습니다.

AudioSourceUpdateConnectionStatus는 선택 사항입니다. 이것은 INetworkRunner 콜백 이벤트에 대한 오디오 피드백을 제공합니다.

사용자가 스폰 한 네트워크 프리팹

ConnectionManagerOnPlayerJoined 콜백이 호출될 때 사용자 네트워크 프리팹 OculusAvatarNetworkRig Variant를 생성합니다.

이 프리팹은 다음을 포함합니다:

  • MetaAvatarSync : 시작할 때 임의의 아바타를 선택하여 네트워크를 통해 아바타를 스트리밍 하는 기능을 담당합니다.

  • NetworkedAvatarEntity : OvrAvatarEntity 엔터티로부터 상속되었습니다. 네트워크 리그가 로컬 사용자를 나타내는지 원격 사용자를 나타내는지에 따라 아바타 엔티티를 구성하는 데 사용됩니다.

아바타 동기화

fusion oculus meta avatar

사용자가 네트워크로 연결된 프리팹이 생성되면 MetaAvatarSync에 의해 임의의 아바타가 선택됩니다.

C#

AvatarIndex = UnityEngine.Random.Range(0, 31);
Debug.Log($"Loading avatar index {AvatarIndex}");
avatarEntity.SetAvatarIndex(AvatarIndex);

AvatarIndex가 네트워크 된 변수이므로, 모든 플레이어들은 이 값이 변경되면 업데이트됩니다.

C#

    [Networked(OnChanged = nameof(OnAvatarIndexChanged))]
    int AvatarIndex { get; set; } = -1;

C#

    static void OnAvatarIndexChanged(Changed<MetaAvatarSync> changed)
    {
        changed.Behaviour.ChangeAvatarIndex();
    }

하드웨어 리그의 SampleInputManager 컴포넌트는 사용자의 움직임을 추적합니다. 플레이어 네트워크 리그가 로컬 사용자를 나타내는 경우 NetworkedAvatarEntity에서 참조됩니다. 이 설정은 MetaAvatarSync (ConfigureAsLocalAvatar())에 의해 수행됩니다.

LateUpdate()에서, MetaAvatarSync는 로컬 플레이어의 아바타 데이터를 캡처합니다.

C#

private void LateUpdate()
{
// Local avatar has fully updated this frame and can send data to the network
    if (Object.HasInputAuthority)
    {
        CaptureAvatarData();
    }
}

CaptureLODAvatar 메소드는 아바타 엔티티 스트림 버퍼를 가져와 AvatarData라는 네트워크 변수에 복사합니다. 중간 또는 높은 LOD에서 메타 아바타를 스트리밍 하기에 충분하기 때문에 용량이 1200으로 제한됩니다. 단순성을 위해 본 샘플에서는 중간 LOD만 스트리밍 합니다.

버퍼 크기 AvatarDataCount도 네트워크를 통해 동기화됩니다.

C#

[Networked(OnChanged = nameof(OnAvatarDataChanged)), Capacity(1200)]
public NetworkArray<byte> AvatarData { get; }
 
[Networked]
public uint AvatarDataCount { get; set; }

따라서 아바타 스트림 버퍼가 업데이트되면 원격 사용자에게 정보를 제공하고 원격 플레이어를 나타내는 네트워크 리그에 수신된 데이터를 적용합니다.

C#

static void OnAvatarDataChanged(Changed<MetaAvatarSync> changed)
{
    changed.Behaviour.ApplyAvatarData();
}

LipSync

마이크 초기화는 Photon Voice Recorder에서 수행됩니다.

OVRHardwareRigOvrAvatarLipSyncContext는 오디오 버퍼와 함께 공급하기 위한 직접 호출을 예상하도록 구성되어 있습니다. 아래에 자세히 설명된 것처럼 OvrAvatarLipSyncContext로 전달하기 위해 클래스는 레코드 오디오 리드를 후크 합니다.

Recorder 클래스는 읽은 오디오 버퍼를 IProcessor 인터페이스를 구현하는 클래스로 전달할 수 있습니다. 사용자 지정 오디오 프로세서를 만드는 방법에 대한 자세한 내용은 다음 페이지Photon Voice - 자주 하는 질문를 참조하십시오.

이러한 프로세서를 음성 연결에 등록하기 위해 AudioLipSyncConnector라는 VoiceComponent 하위 클래스가 Recorder와 동일한 게임 객체에 추가됩니다. 이로 인해 PhotonVoiceCreatedPhotonVoiceRemoved 콜백이 수신되어 연결된 음성에 포스트 프로세서를 추가할 수 있게 되었습니다. 연결된 후처리기는 AvatarAudioProcessor이며 IProcessor<float>를 구현합니다.

플레이어 연결 중에 MetaAvatarSync 컴포넌트는 Recorder에 있는 AudioLipSyncConnector를 검색하여 이 프로세서의 lipSyncContext 필드를 설정합니다.

이렇게 하면 AvatarAudioProcessor Process 콜백은 Recorder에 의해서 매번 호출되며, ProcessAudioSamples은 수신된 오디오 버퍼와 함께 OvrAvatarLipSyncContext에서 호출되어 립 동기화가 아바타 모델에서 계산되도록 합니다.

이런 식으로, 립싱크는 MetaAvatarSync의 레이트 업데이트를 하는 동안 아바타 엔티티의 RecordStreamData_AutoBuffer와 같이 캡처될 때 다른 아바타 바디 정보와 함께 스트리밍 됩니다.

다시 하기 위해

따라서 다시 시작하려면 MetaAvatarSync ConfigureAsLocalAvatar() 메소드를 사용하여 로컬 사용자에 대해 사용자 네트워크 프리팹이 스폰 될 때 연결된 NetworkAvatarEntity에서 다음으로부터 데이터를 받습니다.

  • 립 씽크를 위한 OvrAvatarLipSyncContext
  • 바디 트래킹을 위한 SampleInputManager

네트워크 변수 덕분에 데이터가 네트워크를 통해 스트리밍 됩니다.

원격 사용자를 위해 사용자 네트워크 프리팹이 스폰 되면 MetaAvatarSync ConfigureAsRemoteAvatar()가 호출되고 관련 NetworkAvatarEntity 클래스가 데이터 스트리밍을 통해 아바타를 구축하고 애니메이션화합니다.

Back to top