미팅
기술 정보
- 이 샘플은 공유 모드 토폴로지를 사용합니다.
- PC, Mac, 메타 퀘스트 및 WebGL용 빌드를 사용할 수 있습니다.
- 이 프로젝트는 유니티 2021.3, Fusion 2, Photon Voice 2.53로 개발되었습니다.
- 2개의 아바타 솔루션이 지원됩니다(홈 메이드 심플 아바타 및 Ready Player Me 아바타).
시작하기 전에
샘플 실행 :
PhotonEngine 관리 화면에서 Fusion AppId를 생성하고 Real Time 설정의
App Id Fusion
필드에 붙여 넣습니다 (Fusion 메뉴에서 이동 가능).PhotonEngine 관리 화면에서 Voice AppId를 생성하고 Real Time 설정의
App Id Voice
필드에 붙여 넣습니다.AvatarSelection
씬을 로드하고Play
를 누릅니다.
다운로드
버전 | 릴리즈 일자 | 다운로드 | |
---|---|---|---|
2.0.1 | May 31, 2024 | Fusion meeting 2.0.1 Build 563 |
WebGL
미팅 샘플은 WebGL 타깃으로 빌드 할 수 있습니다.
Metaverse WebGL 빌드 여기를 테스트할 수 있습니다.
그러나 WebGL 빌드와 관련된 일부 유니티 제한으로 인해 몇 가지 사항이 제대로 작동하려면 구체적인 관리가 필요하며 여기에 자세히 나와 있습니다.
이 WebGL 빌드는 WebXR(브라우저내 가상 현실)을 지원하지 않습니다. unity-webxr-export와 같은 일부 오픈 소스 라이브러리에서 구현할 수 있지만 유니티에서는 아직 기본적으로 지원되지 않으므로 여기에서는 설명하지 않습니다.
입력 처리
데스크톱
키보드
- 이동 : WASD 또는 ZQSD
- 회전 : QE 또는 AE
- 펜 색 : C로 펜 색상 변경
- 메뉴 : ESC 키로 애플리케이션 오픈 또는 닫기
마우스
- 이동 : 마우스로 왼쪽 클릭하여 포인터를 표시합니다. 해제 시 허용된 대상으로 순간 이동합니다
- 회전 : 마우스 오른쪽 버튼을 누른 상태로 마우스를 움직여 시점을 회전합니다
- 이동 & 회전 : 앞으로 이동하려면 왼쪽 버튼과 오른쪽 버튼을 모두 누른 상태로 유지하되 회전하려면 마우스를 움직일 수 있습니다
- 잡기 : 마우스를 물건 위에 놓고 마우스 왼쪽 버튼을 사용하여 잡습니다.
메타 퀘스트
- 텔레포트: A, B, X, Y 또는 임의의 스틱을 눌러 포인터를 표시합니다. 해제 시 허용된 대상으로 텔레포트합니다
- 터치(채팅 버블 잠금 버튼의 경우): 버튼 위에 손을 올려놓으면 전환됩니다
- 잡기: 먼저 손을 물건 위에 얹고 컨트롤러 그랩 버튼을 사용
- 펜 색상 : 조이스틱을 위 또는 아래로 이동하여 펜 색 변경
폴더 구조
메인 폴더 /MeetingRoom
에는 이 샘플의 모든 요소들이 포함되어 있습니다.
/IndustriesComponents
폴더에는 Fusion 메타버스 샘플과 같은 인더스트리 샘플과 공유하는 컴포넌트가 들어 있습니다.
/Photon
폴더에는 Fusion 그리고 Photon Voice SDK가 들어 있습니다.
/Photon/FusionXRShared
폴더에는 다른 프로젝트와 공유할 수 있는 FusionXRS Shared Light SDK를 생성하는 VR 공유 샘플에서 가져온 리그 및 캡처 로직이 포함되어 있습니다.
/Photon/FusionAddons
폴더에는 이 샘플에서 사용하는 인더스트리 샘플이 포함되어 있습니다.
/XR
폴더에는 가상 현실에 필요한 구성 파일들이 들어 있습니다.
아키텍처 개요
Meeting 샘플은 특히 리그 동기화를 위해 VR 공유 페이지에 설명된 것과 동일한 코드 기반에 의존합니다.
여기서 사용되는 잡기 시스템은 VR 공유 - 로컬 리그 잡기 페이지에 설명된 대체 "로컬 리그 잡기" 구현입니다.
이 기반 외에도 다른 산업 샘플과 마찬가지로 샘플에는 동기화된 광선, 이동 유효성 검사, 터치, 순간 이동 평활 또는 게이징 시스템과 같은 재사용 가능한 기능을 처리하기 위한 FusionXR 공유 또는 XR 모듈의 일부 확장이 포함되어 있습니다.
스페이스
메타버스 샘플에 사용된 접근 방식과 동일한 접근 방식을 재사용하여 동일한 방의 여러 인스턴스를 허용했습니다. 따라서 사용자는 룸 번호를 지정하여 공개 또는 비밀 미팅 룸에 참여할 수 있습니다. 이 선택은 아바타 선택 화면 또는 나중에 애플리케이션 메뉴에서 할 수 있습니다.
상세 내용은 Space 인더스트리 애드온을 참고하세요.
ConnectionManager
ConnectionManager
애드온을 사용하여 연결 시작을 관리하고 사용자 모습을 생성합니다.
상세 내용은 ConnectionManager 애드온을 참조하세요.
확장 리그 선택
우리는 이 애드온을 사용하여 이 샘플에서 필요한 다양한 리그들을 바꿉니다. 실제로 우리는 이 샘플에서 다음과 같은 세 가지 구성이 필요합니다:
- 메타 빌드용 VR 장비
- Windows 및 Mac 클라이언트용 데스크톱 리그
- 화면에서 데스크톱을 스트리밍 하기 위해 담당하는 Windows 레코더 애플리케이션을 구축할 리그 없음(실제로 이 모드에서는 네트워크 장비를 생성할 필요가 없습니다).
따라서 확장 리그 선택 설정은 다음과 같습니다:
상세 내용은 확장 리그 선택 인더스트리 애드온을 참조하세요.
아바타
이 애드온은 간단한 아바타 세트를 포함한 아바타 기능을 지원합니다.
상세 내용은 아바타 인더스트리 애드온을 참조하세요.
Ready Player Me 아바타
이 애드온은 Ready Player Me 아바타 통합을 처리합니다.
상세 내용은 Ready Player Me 아바타 인더스트리 애드온을 참조하세요.
사회적 거리 두기
공간의 편안함과 비밀을 보장하기 위해, 우리는 사회적 거리 두기 애드온을 사용합니다.
상세 내용은 사회적 거리 두기 인더스트리 애드온을 참조하세요.
로코모션 검증
우리는 플레이어의 움직임을 제한하기 위해 로코모션 검증 애드온을 사용합니다(룸에 머무르거나 가구를 피하는 등).
상세 내용은 로코모션 검증 인더스트리 애드온을 참조하세요.
동적 오디오 그룹
동적 오디오 그룹 애드온을 사용하여 사용자 간의 거리를 고려하여 편안함과 대역폭 소비를 최적화하면서 사용자가 함께 채팅할 수 있습니다.
상세 내용은 동적 오디오 그룹 인더스트리 애드온을 참고하세요.
오디오 룸
게다가, 우리는 같은 룸에 있지 않은 사람들에게는 들을 수 없도록 하는 설명하고 싶었습니다.
그래서 우리는 문으로 분리된 씬에 두 개의 룸을 만들었습니다.
AudioRoom
모듈을 사용하여 문 상태에 따라 동적 오디오 그룹 업데이트를 관리합니다. 문 개폐는 AudioDoor.ToogleDoor()
메소를 호출하는 버튼에 따라 트리거 됩니다.
문 애니메이션은 AudioDoor
클래스에서 수신한 OnStatusChange()
이벤트를 청취하는 TriggerDoorAnimation
클래스에서 관리합니다.
상세 내용은 오디오 룸 인더스트리 애드온을 참고하세요.
화면 공유
사용자는 컴퓨터 화면을 공유하고 미팅룸의 큰 화면으로 브로드캐스트 할 수 있습니다.
"Stage ScreenSharing" 샘플과 달리, 여기에는 권한 관리가 없습니다: 방송을 시작한 마지막 사용자가 화면을 제어합니다. 이것은 IEmitterListener
인터페이스를 구현하는 EmissionOrchestrator
에 의해 관리됩니다.
따라서 클라이언트가 화면 공유를 시작하면 PlayerId
가 저장됩니다:
- 화면에 대하여 상태 권한이 있는 경우 클라이언트가 직접 사용할 수도 있습니다,
- 또는 클라이언트가 상태 권한을 가지고 있지 않은 경우 RPC를 사용합니다.
C#
public void SetEmitter(PlayerRef emitter, string name)
{
if (Object.HasStateAuthority)
{
EmittingPlayer = emitter;
EmittingPlayerName = name;
}
else
{
RPC_SetEmitter(emitter, name);
}
}
[Rpc(sources: RpcSources.All, targets: RpcTargets.StateAuthority)]
public void RPC_SetEmitter(PlayerRef emitter, string name)
{
EmittingPlayer = emitter;
EmittingPlayerName = name;
}
다른 플레이어가 화면 공유를 시작하는 즉시 StopEmitting()
으로 화면 공유를 중지하여 자원과 대역폭을 절약합니다.
상세 내용은 화면 공유 인더스트리 애드온을 참고하세요.
주의하세요 :
- FullHD 해상도(1920x1080)의 화면 공유는 Quest2 및 Quest3 장치에서 올바르게 작동합니다.
- 일부 고해상도(예: 3440x1440)는 Quest2에서는 잘 작동하지만 운영체제 업데이트로 인해 Quest3에서는 더 이상 지원되지 않습니다.
그리기
룸에는 2D 펜과 여러 개의 3D 펜이 있는 화이트보드가 있습니다. 그리기가 완료되면(즉, 사용자가 "트리거" 버튼을 해제하면) 핸들이 표시됩니다. 이를 통해 사용자는 2D 또는 3D 그리기를 이동할 수 있습니다.
상세 내용은 3D & 2D 그리기 인더스트리 애드온을 참고하세요.
데이터 동기화 헬퍼
이 추가 기능은 3D/2D 그리기 포인트를 동기화하는 데 사용됩니다.
상세 내용은 데이터 동기화 헬퍼 인더스트리 애드온을 참조하세요.
접촉 차단
이 애드온을 사용하여 화이트보드 표면의 2D 펜과 드로잉 핀을 차단합니다.
상세 내용은 접촉 차단 인더스트리 애드온을 참조하세요.
대화형 메뉴
이 모듈은 그리기에 펜 또는 삭제 버튼을 사용하는 방법에 대한 팁을 표시하는 데 사용됩니다.
상세 내용은 대화형 메뉴 인더스트리 애드온을 참고하세요.
데스크톱 포커스 모드
3D 상태에서 화이트보드에 2D 펜으로 그림을 그리는 것은 어렵기 때문에 ScreenDrawing
클래스는 "Desktop Focus Mode" 모듈에 의존해 포커스 모드를 활성화하고 특정 사용자 인터페이스를 표시합니다.
상세 내용은 데스크톱 포커스 인더스트리 애드온을 참고하세요.
피드백
Feedback
애드온을 사용하여 애플리케이션에서 사용되는 사운드를 중앙 집중화하고 햅틱 및 오디오 피드백을 관리합니다.
상세 내용은 피드백 애드온을 참조하세요.
레코드 클라이언트 컴파일
따라서 레코더 애플리케이션을 컴파일하려면 다음 두 단계를 수행해야 합니다:
1/ AvatarSelection
씬 열기 : LoadMainSceneInRecorderMode
게임 오브젝트에서 Is Recorder Compilation Mode
체크박스를 선택하여 아바타 셀렉션 씬을 로드하지 않고 메인 씬을 직접 로드합니다.
일반 클라이언트와 레코더에 대해 씬 목록이 동일해야 하기 때문에 이 팁이 필요합니다.
2/ MeetingRoom
씬 열기 : 게임 객체인 ExtendedRigSelection
클래스에서 Selection Mode
파라미터를 Selected by User Pref
로 설정합니다.
3/ 일부 유니티 파라미터 변경:
Project Settings
/Player
:Product name
변경 : 예를 들어 'Recorder' 추가
Project Settings
/Player
/Resolution and Presentation
/Resolution
- Fullscreen 모드 : Windowed
- 기본 화면 너비 : 640
- 기본 화면 높이 : 380
- 화면 크기 조정 : No
- 전체 화면 허용 : No
일반 클라이언트 컴파일
따라서 일반 클라이언트 애플리케이션을 컴파일하려면 다음 세 단계를 수행해야 합니다:
1/ AvatarSelection
씬을 엽니다: LoadMainSceneInRecorderMode
게임 객체에서 Is Recorder Compilation Mode
의 선택을 취소합니다.
2/ MeetingRoom
씬 열기 : 게임 객체인 ExtendedRigSelection
클래스에서 Selection Mode
파라미터를 Selected by User Pref
로 설정합니다.
3/ 일부 유니티 파라미터 변경:
Project Settings
/Player
:Product name
변경 : 예를 들어 'Client' 추가
Project Settings
/Player
/Resolution and Presentation
/Resolution
- Fullscreen 모드 : Fullscreen Windows
- 화면 크기 조정 : Yes
- 전체 화면 허용 : Yes