This document is about: FUSION 1
SWITCH TO

수정중인 페이지 입니다.

스테이지

Level 4
Available in the Industries Circle
Circle
Fusion 스테이지 샘플은 Photon Industries Circle 구독을 하신 사용자분들만 사용하실 수 있습니다.

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

개요

FusionStage 샘플은 Fusion을 사용하여 최대 200명의 플레이어를 위한 소셜 애플리케이션을 개발하는 방법을 보여줍니다.

Photon Voice SDK 덕분에 각 플레이어는 아바타로 표시되며 같은 채팅 버블에 있으면 다른 플레이어와 대화할 수 있습니다. 그리고 한 사용자가 스테이지에 올라 콘텐츠를 발표할 수 있습니다.

이 샘플의 주요 내용은 다음과 같습니다:

  • 먼저 플레이어는 선택 아바타 화면에서 자신의 아바타를 꾸밉니다.
  • 그 후, 플레이어는 스테이지 씬에 참여할 수 있습니다. PC 또는 MAC에서 샘플을 실행하면 데스크톱 모드(키보드 및 마우스 사용) 또는 VR 모드(Meta Quest 헤드셋) 중에서 선택할 수 있습니다.
  • 플레이어는 동일한 정적 채팅 버블에 있는 경우 서로 대화할 수 있습니다. 각 정적 채팅 버블에서 잠금 버튼을 사용하여 새 플레이어가 입장하지 못하도록 할 수 있습니다.
  • 한 명의 사용자가 스테이지 오를 수 있고, 이렇게 하면 룸에 있는 모든 사용자에게 말을 걸 수 있습니다. 그런 다음 이 사용자는 스테이지에 참여할 수 있는 사용자 수를 늘릴 수 있습니다.
  • 발표자의 목소리는 더 이상 공간화되지 않기 때문에 모든 사람이 스피커를 통해 들을 수 있습니다.
  • 모든 사용자 간에 플레이가 동기화되는 비디오와 같은 콘텐츠를 공유할 수 있습니다.
  • 무대 카메라 시스템이 발표자를 따라가서 발표자가 전용 화면에 표시합니다.
  • 일단 자리에 앉으면, 사용자는 스테이지 위의 발표자와 이야기할 것을 요청할 수 있습니다. 발표자가 수락하면 발표자 또는 사용자가 대화를 중지하기로 결정할 때까지 모든 사람이 발표자와 사용자 간의 대화를 듣게 됩니다.
  • 또한, 청중들은 이모티콘을 보내 프레젠테이션에 대한 자신의 의견을 표현할 수 있습니다.

자세한 기술 세부 정보는 코드 주석에 기술되어 있습니다.

fusion stage overview

기술 정보

  • 이 샘플은 공유 모드 토폴로지를 사용합니다.
  • 빌드는 PC, Mac 및 Meta Quest에서 사용할 수 있습니다.
  • 이 프로젝트는 유니티 2021.3.10f1, Fusion 1.1.3f 599 및 Photon voice 2.31로 개발되었습니다.
  • 2개의 아바타 솔루션이 지원됩니다(홈메이드 단순 아바타 및 Ready Player Me 1.9.0 아바타).

시작하기 전에

샘플 실행하는 방법 :

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

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

  • AvatarSelection 씬을 로드하고 Play를 누릅니다.

다운로드

버전 릴리즈 일자 다운로드
0.0.18 Nov 03, 2022 Fusion Stage 0.0.18 Build 70

바이너리 다운로드

스테이지 데모 버전은 아래에서 다운로드할 수 있습니다:

입력 처리

데스크톱

키보드

  • 이동 : WASD 또는 ZQSD를 이용
  • 회전 : QE 또는 AE를 이용

마우스

  • 이동 : 마우스 왼쪽 버튼으로 클릭하여 포인터를 표시합니다. 왼쪽 버튼을 떼면 목표 대상으로 텔레포트합니다.
  • 회전 : 마우스 오른쪽 버튼을 누른 상태에서 마우스를 움직여 시점을 회전합니다.
  • 이동 & 회전 : 앞으로 이동하려면 왼쪽 및 오른쪽 버튼을 모두 누른 상태로 두십시오. 마우스를 계속 움직여 회전할 수 있습니다.
  • 잡기 : 마우스를 물체 위에 놓고 왼쪽 마우스 버튼을 사용하여 물체를 잡습니다.

Meta Quest

  • 텔레포트 : 포인터를 표시하려면 A, B, X, Y 또는 아무 스틱이나 누르십시오. 떼면 대상으로 텔레포트합니다.
  • 터치 (예, 채팅 버블 잠금 버튼) : 버튼 위에 손을 올려놓으면 전환됩니다.
  • 잡기 : 먼저 손을 물체 위에 놓고 컨트롤러 잡기 버튼을 사용하여 물체를 잡습니다.

폴더 구조

메인 폴더인 /Stage 에는 이 샘플의 모든 요소가 들어 있습니다.

/IndustriesComponents 폴더에는 Fusion Expo 샘플/과 공유하는 컴포넌트들이 들어 있습니다.

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

/Photon/FusionXRShared 폴더에는 다른 프로젝트와 공유할 수 있는 FusionXRShared light SDK를 생성하는 VR shared 샘플에 있는 리그와 잡기 로직이 포함되어 있습니다.

/Photon/FusionXRShared/Extensions 폴더에는 동기화된 레이, 로코모션 검증과 같은 재사용할 수 있는 기능에 대한 FusionXRShared용 확장 팩이 들어 있습니다.

/Plugins 폴더에는 Ready Player Me SDK가 들어 있습니다.

/StreamingAssets 폴더에는 사전 구축된 ReadyPlayerMe 아바타가 들어 있습니다. 이러한 사전 구축된 아바타를 사용하지 않으면 자유롭게 제거해도 됩니다.

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

아키텍처 개요

Fusion 스테이지는 특히 Rig 동기화를 위해 VR Shared 페이지에 설명된 것과 동일한 코드 기반에 의존합니다.

여기서 사용되는 잡기 시스템은 VR Shared - 로컬 리그 잡기 페이지에 설명된 대체 "로컬 리그 잡기" 구현입니다.

이 기반 외에도 Expo 샘플과 마찬가지로 샘플에는 FusionX에 대한 일부 확장팩이 포함되어 있습니다. 동기화된 레이, 이동 검증, 터치, 텔레포트 평활화 또는 시선 시스템과 같은 재사용 가능한 기능을 처리하기 위해 공유됩니다.

또한, Fusion 스테이지 샘플은 채팅 버블을 포함하여 Fusion Expo 샘플 코드의 상당 부분을 공유합니다.

stage architecture overview

스테이지

스테이지는 채팅 버블에 사용된 것과 같은 Zone을 사용합니다( Fusion Expo 샘플참고).

기본적으로 이 스테이지는 1명의 사용자로 제한되므로 발표자가 이미 스테이지에 있을 때 다른 사용자가 스테이지에 설 수 없습니다. 그러나 발표자는 스테이지 콘솔을 사용하여 이 값을 변경할 수 있습니다.

사용자가 모든 사용자에 대해 올바르게 표시되는지 확인하고 LOD가 트리거 되지 않도록 보장하기 위해 StageZone.ForceUserLOD()에서 단계에 진입하는 모든 사용자에 대해서도 LODGroup이 비활성화됩니다.

control desk

보이스

스테이지 구역과 관련된 오디오 그룹은 모든 플레이어가 들을 수 있는 특수 오디오 그룹 "0"입니다.

존에 들어갈 때 오디오 그룹 전환을 처리하는 ZoneAudioInterestChanger도 이 특별한 글로벌 그룹의 사용 여부를 결정합니다. ZoneAudioInterestChanger.ManageAudioSources()에서 Zone.IsGlobalAudioGroup()이 true를 리턴하는 경우:

  • 이 존에 들어오는 모든 사용자의 오디오 소스를 강제로 활성화합니다.
  • 오디오 소스 공간화를 제거하여 이 사용자의 음성을 룸 구석구석에서 들을 수 있습니다.

발표자 카메라

발표자 카메라가 무대 위의 사용자를 따라갑니다. 이를 위해 StageZone 클래스는 스테이지 영역의 IZoneListener리스너로 등록하고 사용자가 무대에 있을 때 카메라 추적 및 녹화를 트리거 합니다.

StageZone은 여러 대의 카메라를 처리할 수 있으며 각 카메라에 대해 발표자를 따라 이동하는 것을 트리거 하면서 가장 관련성이 높은 카메라에 대해서만 실제 렌더링을 활성화합니다. 이 카메라들은 카메라 움직임과 함께 스테이지 카메라 클래스에서 렌더링 되는 프레임 수가 초 단위로 줄어듭니다. 카메라는 카메라 리그 Transform에 상대적으로 배치되며 이 트랜스폼의 x축을 따라 이동합니다.

좌석

사용자가 공유하는 데이터 양을 줄이기 위해 사용자가 앉아 있을 때 아바타 동기화 주기를 줄일 수 있습니다. 이를 위해 HardwareRig 하위 클래스인 StageHardwareRig는 좌석 요청을 수신할 수 있습니다(사용자가 좌석에 앉아 텔레포트할 때를 관찰하는 SeatDetector 클래스에 의해 트리거 됨). 사용자가 좌석에 앉아 있을 때 입력이 업데이트되는 빈도가 적습니다. 이렇게 하면 StageNetworkRig NetworkRig 하위 클래스에서 NetworkTransform 위치를 자주 업데이트하지 않아 전송되는 데이터가 줄어듭니다.

이 옵션 최적화를 사용하지 않도록 설정하려면 StageHardwareRig에서 freezeForRemoteClientsWhenSeated를 false로 설정할 수 있습니다.

참가자 스테이지 보이스 접근

컨퍼런스 참석자는 스테이지 마이크에 대한 접근 권한을 요청할 수 있습니다. 스테이지 위의 발표자는 요청을 허용하거나 거절할 수 있습니다.

attendee system

사용자의 네트워크 장치에는 [Networked] 변수 AttendeeStatus를 호스트 하는 VoiceableAttendee 컴포넌트가 포함되어 있습니다. 이 상태는 다음과 같습니다.

  • 요청이 아직 이루어지지 않은 경우
  • 관객이 스테이지에 보이스 접근을 요청하는 경우
  • 요청이 받아들여진 경우
  • 승인되었지만 순간적으로 음소거된 경우
  • 또는 요청이 거부된 경우
attendee system

사용자가 UI *(1)*를 사용하여 보이스 접근을 요청하면 (2) 상태가 업데이트되고 네트워크 변수가 이를 모든 사용자 *(3)*와 동기화합니다. 이는 모든 참석자를 저장하는 AttendeeRegistry 컴포넌트에 경고하는 콜백 *(4)*을 모든 클라이언트에 트리거 하여 모든 리스너 *(5)*에게 이 변경 정보를 브로드캐스트 합니다.

이렇게 하면 스테이지의 데스크에 연결된 AttendeeRequestHandler는 요청하는 참석자 목록을 저장하고 그에 따라 UI를 업데이트할 수 있습니다. [Networked] 변수인 SelectedRequestingAttendeeInfo는 각 클라이언트의 모든 UI가 동기화되도록 UI에 선택된 참석자에 대한 정보를 보유합니다.

발표자가 음성 요청을 확인할 때 (6), SelectedRequestingAttendeeInfo의 참석자 상태 정보가 변경됩니다. 발표자가 요청자가 아닐 가능성이 높고 리그의 네트워크 객체에 대한 상태 권한이 없기 때문에 VoiceableAttendee AttendeeStatus를 직접 변경할 수 없습니다. 그러나 SelectedRequestingAttendeeInfo[Networked] 변수로, 발표자에 대해 로컬로 변경 (7) 모든 클라이언트에 대한 업데이트를 트리거 합니다. 이 업데이트 중에 각 사용자는 VoiceableAttendee 네트워크 개체의 상태 권한이 있는지 확인하고, 업데이트된 경우 참석자 상태 *(9)*를 변경합니다.

마지막으로 이 상태를 변경하면 모든 클라이언트에서 VoiceableAttendee AttendeeStatus 업데이트가 트리거 되며, 관객이 이제 말하는 관객임을 보면 *(10)*할 수 있습니다.

  • ZoneAudioInterestChanger(발표자 단계의 채팅 버블에 이미 사용됨: 무대는 특별한 'Zone일 뿐입니다)를 통해 모든 사용자의 목소리를 사용할 수 있습니다. 마치 Zone 스테이지에 들어간 것처럼 참석한 음성에 대해 OnZoneChanged가 트리거 되어 음성이 활성화됩니다.
  • AvatarRepresentation에서 이 사용자에 대한 LOD 그룹을 비활성화하여 무대의 발표자와 같이 모든 사용자에게 최대 세부 정보로 표시되도록 합니다.

비디오 동기화

비디오 플레이어는 현재 단순한 유니티 Video Player이지만 모든 비디오 라이브러리를 사용할 수 있습니다.

무대에 있는 발표자는 시작하거나, 특정 시간으로 이동하거나, 무대 콘솔에서 비디오를 일시 중지할 수 있습니다. 모든 사용자에 대해 이를 동기화하기 위해 VideoControl NetworkBehaviourPlayState [Networked] 구조체를 포함하고 있으며, 이 구조체는 플레이 상태와 위치를 유지합니다. 발표자가 UI를 사용할 때 변경하면 모든 클라이언트에서 변경 콜백이 트리거 되어 자신의 플레이어에서 변경 사항을 적용할 수 있습니다.

attendee system

이모티콘

음성 요청 외에도 관객들은 언제든지 이모티콘을 보내 의견을 표현할 수 있습니다.

attendee system

이 사용 사례에서 이 기능은 중요하지 않기 때문에 사용자가 이모티콘 UI 버튼을 클릭하면 RPC를 사용하여 관련 프리팹을 생성합니다. 이것은 룸에 들어오는 새로운 사용자가 이전에 생성된 이모티콘을 볼 수 없다는 것을 의미합니다(어쨌든 이모티콘은 몇 초 후에 사라집니다). 또한, 우리는 공간에서 이모티콘의 위치를 동기화할 필요가 없으므로 이모티콘 프리팹은 네트워크 객체가 아니라고 생각합니다.

스피커 UI에 있는 EmotesRequest 클래스는 EmotesSpawner 클래스에 사용자 위치에 이모티콘을 생성하도록 요청하는 역할을 합니다. 네트워크 객체가 필요하기 때문에 EmotesSpawner는 사용자의 네트워크 리그에 위치합니다.

타사 컴포넌트

변경 사항

  • Fusion Stage 0.0.18

    • 네트워크 문제가 발생할 때 오류 메시지 표시 수정
  • Fusion Stage 0.0.17

    • Fusion SDK 1.1.3 F 빌드 599로 업데이트
Back to top