오디오 룸
AudioRoom
경우에 따라서는 플레이어 사이의 거리에 관계없이 다른 오디오 "방"으로 분할하는 것이 유용할 수 있습니다.
이것은 문 덕분에 방이 고립되었을 때 같은 오디오 룸에 있는 플레이어들끼리만 대화할 수 있다는 것을 의미합니다. 그렇게 하기 위해 우리는 4가지 클래스를 제공합니다:
AudioRoomManager
AudioRoom
AudioRoomMember
AudioDoor
AudioRoomManager
AudioRoomManager
는 현장에 있는 룸과 플레이어의 목록을 관리합니다.
MatchingRooms()
메소드는 플레이어가 이동할 때마다 자신이 있는 룸의 목록을 얻기 위해 호출됩니다(룸은 서로 겹칠 수 있음에 유의하십시오).
AudioRoom
오디오 룸은 AudioRoom
컴포넌트로 정의됩니다.
룸의 공간 위치는 중심점과 상자(기즈모 큐브가 씬 뷰에 표시)로 설정됩니다.
AudioRoom
은 각각 특정 Id
를 가지고 있으며 Awake()
중 AudioRoomManager
에 등록됩니다.
IsIsolated
bool은 실내에 위치한 플레이어들이 문 덕분에 다른 플레이어들과 격리되는지 여부를 정의하는 데 사용됩니다.
룸과 관련된 문이 움직이면 (AudioDoor
로) Isolate()
메소드를 호출하여 플레이어가 방에 있는지 확인하고 OnCurrentRoomIsolationChange()
메소드를 통해 오디오 그룹 필터링을 업데이트하도록 요청합니다.
AudioRoomMember
각 네트워크 플레이어 프리팹에는 AudioRoomMember
클래스가 있어 시작할 때 AudioRoomManager
에 등록할 수 있습니다.
이동할 때마다 DidMove()
의 콜백 덕분에 AudioRoomMember
는 사용자가 다른 방으로 이동했는지 여부를 확인합니다.
그런 다음 룸 상태(격리 여부)에 따라 오디오 그룹(DynamicAudioGroupMember
)을 설정합니다.
룸에서 나갈 때 그룹 필터링은 다음으로 재설정됩니다:
OutOfRoomFilterMode.NoFilter
로 설정된 경우 기본값(누구나 들을 수 있음)- 또는
OutOfRoomFilterMode.NeverMatchingGroupFilter
를 사용하여 사용자가 아무도 들을 수 없게 만듭니다.
멤버 또는 룸에 IAudioRoomListener를 구현하는 자식이 있는 경우 플레이어가 방에 들어가거나 나갈 때 OnIsInRoom
콜백을 받게 됩니다.
AudioDoor
오디오 룸을 구분하는 도어 게임 오브젝트에 AudioDoor
클래스를 추가해야 합니다.
이 문은 ToogleDoor()
및 Open()
public 메소드 덕분에 열 수도 있고 닫힐 수도 있습니다.
문을 열고 닫을 것을 요청한 플레이어가 권한이 없으면 StateAuthority에 RPC를 보냅니다.
C#
public void ToogleDoor()
{
Open(!IsOpened);
}
public void Open(bool isOpen)
{
if (Object.HasStateAuthority)
{
IsOpened = isOpen;
}
else
{
RPC_Open(isOpen);
}
}
[Rpc(sources:RpcSources.All, targets: RpcTargets.StateAuthority)]
public void RPC_Open(bool isOpen)
{
IsOpened = isOpen;
}
네트워크 부울 변수인 IsOpened
를 통해 도어 상태(열리거나 닫힘)는 네트워크를 통해 동기화됩니다.
변경은 ChangeDetector
를 사용하여 Render()
의 변경을 감지합니다.
C#
[Networked]
public NetworkBool IsOpened { get; set; } = true;
ChangeDetector renderChangeDetector;
public override void Spawned()
{
base.Spawned();
OnIsOpenedChange();
renderChangeDetector = GetChangeDetector(ChangeDetector.Source.SnapshotFrom);
}
public override void Render()
{
// Check if the IsOpened changed
if (TryDetectIsOpenedChange())
{
OnIsOpenedChange();
}
}
OnIsOpenedChange()
메소드는 문으로 분리된 방의 격리 상태를 변경합니다.
그러면 방 안에 있는 플레이어에게 격리 상태를 알려줍니다. 방이 격리되면 DynamicAudioGroupMember
의 additionalGroupFilter
가 roomId
로 설정됩니다.
이렇게 하면 방 안에 있는 플레이어들은 정해진 거리 제한 안에 있더라도 룸 안에 있는 멤버들의 말만 듣고 다른 플레이어들의 말은 듣지 않습니다.
도어 상태가 변경되면 OnStatusChange()
이벤트가 발생합니다.
의존성
동적 오디오 그룹 버전 2.0.1
데모
사용법 설명을 위하여 Assets\Photon\FusionAddons\AudioRoom\Demo\Scenes\AudioRoom.unity
에 데모 씬이 있습니다.
씬은 문으로 분리된 두 개의 룸이 있습니다.
Door
게임 객체에 있는 AudioDoor
컴포넌트의 Toggle is opened
버튼을 이용해 도어를 여닫을 수 있습니다.
여러 클라이언트를 연결하고 각 플레이어와 관련된 정보 패널을 관찰합니다.
각 플레이어는 두 개의 구로 둘러싸여 있습니다.
도어가 열린 경우:
- 녹색 구는 같은 룸에 있지 않더라도 머리가 들어가는 순간 다른 플레이어의 말을 듣기 시작하는 영역입니다.
- 머리가 붉은 구를 벗어나자마자 듣기가 중단됩니다.
도어가 닫힌 경우:
- 같은 룸과 가까운 곳에 위치한 플레이어만 서로 채팅할 수 있습니다.
다운로드
이 애드온의 최신 버전은 애드온 프로젝트에 포함되어 있습니다.
지원되는 토폴로지
- 공유 모드
변경 내역
- 버전 2.0.1: 룸을 나갈 때 새 옵션 추가(누구의 말을 듣든 듣지 않든) + AudioRoom & AudioRoomMember 등록 방법 추가(해제) + IAudioRoomListener 콜백 추가
- 버전 2.0.0: Fusion 2.0 지원
- 버전 1.0.3: MoveDoorWithAudioRoomStatus를 NetworkBehaviour에서 MonoBehavior로 변경
- 버전 1.0.2: 네임 스페이서 변경
- 버전 1.0.1: 데모 씬, 네임스페이스 추가
- 버전 1.0.0: 최초 릴리즈