동적 오디오 그룹
동적 오디오 그룹
동적 오디오 그룹 기능을 사용하면 대역폭을 사용하거나 사용자의 거리에서 노이즈를 추가하지 않고도 로컬 사용자 주변의 모든 원격 사용자와 대화할 수 있습니다.
정의된 거리를 초과하는 사용자는 들리지 않습니다.
적응된 사운드 공간화 및 감쇠와 함께 이는 자연스러운 듣기를 제공합니다.
현재 구현은 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
를 듣기 시작합니다.
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()
메소드 덕분에 더 이상 듣지 않습니다.
모든 플레이어가 수행하기 때문에 각 플레이어가 자신의 GroupId
로만 음성을 보내더라도 양방향 대화가 가능합니다.
또한 플레이어는 다른 플레이어와 친할 수 있지만 다른 닫힌 룸에 있기 때문에 CheckProximity()
는 해당 방이 고립된 경우 다른 멤버의 청취를 중단해야 하는지 여부를 확인합니다(사용자가 고립된 방에 있을 경우 AudioRoomMember
에 additionalGroupFilter
파라미터가 설정됩니다).
C#
if(additionalGroupFilter != member.additionalGroupFilter)
{
// No matching filter
StopListeningToMember(member);
}
다운로드
이 애드온의 최신 버전은 애드온 프로젝트에 포함되어 있습니다.
지원하는 토폴로지
- 공유 모드
- 호스트 모드
변경 내역
- 버전 1.0.0(2023/07/06) : 최초 릴리즈