동적 오디오 그룹
동적 오디오 그룹
동적 오디오 그룹 기능을 사용하면 대역폭을 사용하거나 사용자가 멀리서 오는 노이즈를 추가하지 않고도 로컬 사용자 주변의 모든 원격 사용자와 대화할 수 있습니다.
정의된 거리를 초과하는 사용자는 들리지 않습니다.
적응된 사운드 공간화 및 감쇠와 결합하여 자연스러운 청취 감각을 제공합니다.
현재 구현은 Photon Voice 관심 그룹을 기반으로 합니다.
각 사용자는 하나의 고유한 관심 그룹에서 이야기하며 절대 변경되지 않습니다.
그러나 사용자가 듣는 그룹 목록은 필요한 대역폭을 제한하는 다른 플레이어의 근접성에 따라 동적으로 수정됩니다.
게다가 고립된 사람들은 대역폭 소비를 더 피하기 위해 네트워크를 통해 음성을 보내지 않습니다.
이 기능은 DynamicAudioGroupMember
클래스에 의존합니다.
DynamicAudioGroupMember
DynamicAudioGroupMember
는 각 네트워크 플레이어 프리팹에 있습니다
Spawned()
에서는 플레이어에 대해 고유한 오디오인 GroupId
가 계산됩니다(즉, 각 플레이어는 고유한 GroupId
를 가집니다).
그런 다음 로컬 플레이어 Recorder
오디오 관심 그룹이 이 GroupId
로 구성되고 음성 클라이언트가 이를 듣도록 구성됩니다.
C#
async void SpeakAndListenOnlyToGroup(byte groupId)
{
...
recorder.InterestGroup = groupId;
fusionVoiceClient.Client.OpChangeGroups(groupsToRemove: new byte[] { }, groupsToAdd: new byte[] { groupId });
...
}
플레이어가 듣는 그룹을 업데이트하기 위해 Update()
동안 다른 플레이어가 정의된 거리 내에 있는지 확인합니다.
C#
private void Update()
{
CheckProximity();
}
근접한 각 플레이어에 대해 로컬 플레이어는 원격 플레이어의 GroupId
를 듣기 시작합니다(GroupId
는 네트워크 변수입니다).
C#
private void CheckProximity()
{
...
if(DistanceSqr(member) < proximityDistanceSqr)
{
...
ListentoGroupId(member.GroupId);
}
...
}
C#
async void ListentoGroupId(byte groupId)
{
if (!Object.HasStateAuthority) return;
while (!IsPhotonVoiceready || !isSpeakInitialized) await Task.Delay(10);
fusionVoiceClient.Client.OpChangeGroups(groupsToRemove: null, groupsToAdd: new byte[] { groupId });
}
반대로 원격 플레이어가 근접 경계에 더 이상 존재하지 않으면 StopListeningToGroupId()
메소드 덕분에 더 이상 수신을 받지 못합니다.
이러한 작업은 모든 플레이어가 수행하기 때문에 각 플레이어가 자신의 그룹 아이디에서만 음성을 보내도 양방향 대화가 가능합니다.
추가 필터
또한 플레이어가 다른 플레이어와 가까울 수 있지만 다른 폐쇄된 룸에 있을 수 있기 때문에 CheckProximity()
는 룸이 격리된 경우 다른 멤버의 말을 듣지 않아야 하는지 여부를 확인합니다.
따라서 DynamicAudioGroupMember
클래스는 additionalFilter
매개 변수를 제공합니다. 즉, 두 오디오 그룹 멤버가 서로 들을 수 있으려면 동일한 additionalFilter
값을 가져야 합니다.
예를 들어 오디오 룸 추가 기능에서는 사용자가 격리된 방에 있을 때 AudioRoomMember
에서 additionalFilter
파라미터를 설정합니다.
특별한 추가 필터 값인 NEVER_MATCHING_GROUP_FILTER
는 두 멤버 간에 절대 일치하지 않는 것으로 간주되기 때문에 어떤 멤버 그룹(아무도 듣지 않음)에 가입하는 것을 방지합니다.
C#
if (additionalFilter == NEVER_MATCHING_GROUP_FILTER || additionalFilter != member.additionalFilter)
{
// No matching filter
StopListeningToMember(member);
}
데모
사용법을 설명하기 위해 데모 씬은 Assets\Photon\FusionAddons\DynamicAudioGroup\Demo\Scenes\DynamicAudioGroup.unity
에서 확인할 수 있습니다.
여러 클라이언트를 연결하고 각 플레이어와 관련된 정보 패널을 관찰합니다.
각 플레이어는 두 개의 구로 둘러싸여 있습니다.
녹색 구는 플레이어 머리가 들어가는 순간 다른 플레이어의 말을 듣기 시작할 영역입니다.
머리가 붉은 구를 벗어나자마자 듣는 것이 멈출 것입니다.
의존성
- Photon Voice SDK
다운로드
애드온의 최신 버전은 애드온 프로젝트에 있습니다.
지원하는 토폴로지
- 공유 모드
변경 내역
- 버전 2.0.1: DynamicAudioGroup에 NEVER_MATCHING_GROUP_FILTER 추가 필터 추가(아무도 듣지 않음)
- 버전 2.0.0: Fusion 2.0 지원
- 버전 1.0.2: 수신된 멤버 연결이 끊겼을 때 DisplayDynamicAudioGroupInfos 오류 수정
- 버전 1.0.1: 데모 씬 + 네임스페이스 추가
- 버전 1.0.0: 최초 릴리즈