Dynamic Audio group
Dynamic Audio group
The dynamic audio group feature allows to discuss with all the remote users around the local one, without using bandwidth or adding noise from user afar.
Users beyond a defined distance are not heard.
Coupled with a adapted sound spatialization and attenuation, this provides a natural listening sensation.
The current implementation is based on Photon Voice interest groups.
Each user will speak in one unique interest group and it will never be changed.
However, the list of groups he listens to is dynamically modified according to the proximity of the other players limiting the needed bandwidth.
Moreover, isolated people don't send their voice over the network to even further avoid consuming bandwidth.
This feature rely on the DynamicAudioGroupMember
class.
DynamicAudioGroupMember
DynamicAudioGroupMember
is located on each network player prefab
In the Spawned()
, a unique audio GroupId
is computed for the player (in other words, each player has it own GroupId
).
Then, the local player Recorder
audio interest group is configured with this GroupId
and the voice client is configured to listen it.
C#
async void SpeakAndListenOnlyToGroup(byte groupId)
{
...
recorder.InterestGroup = groupId;
fusionVoiceClient.Client.OpChangeGroups(groupsToRemove: new byte[] { }, groupsToAdd: new byte[] { groupId });
...
}
To update the groups the player listens to, we check if other players are within the defined distance during the Update()
.
C#
private void Update()
{
CheckProximity();
}
For each player found at proximity, the local player starts to listen the GroupId
of the remote player (GroupId
is a networked variable).
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 });
}
Conversely, if a remote player is no longer in the proximity perimeter, then he is no longer listened to thanks to the StopListeningToGroupId()
method.
Because these operations are performed by all the players, a two-way conversation is possible although each player sends his voice only in his own GroupId
.
Additional Filter
Also, because the player may be close to another player but in a different closed room, CheckProximity()
checks whether the member should stop listening to another member if the room is isolated.
So, the DynamicAudioGroupMember
class provides an additionalFilter
parameter : to be abble to listen to each other, two audio group members must have the same additionalFilter
value.
For instance, in the audio room addon, the additionalFilter
parameter is set in AudioRoomMember
when a user is in an isolated room.
The special additionnal filter value NEVER_MATCHING_GROUP_FILTER
prevent joining any member group (listening to no one), as this special filter will be consider never matching between two members.
C#
if (additionalFilter == NEVER_MATCHING_GROUP_FILTER || additionalFilter != member.additionalFilter)
{
// No matching filter
StopListeningToMember(member);
}
Demo
To illustrate the usage, a demo scene can be found in Assets\Photon\FusionAddons\DynamicAudioGroup\Demo\Scenes\DynamicAudioGroup.unity
.
Connect multiple clients and observe the information panel associated with each player.
Each player is surrounded by two spheres.
The green sphere is the area that will start listening to another player as soon as his head enters it.
Listening will stop as soon as the head leaves the red sphere.
Dependencies
- Photon Voice SDK
Download
This addon latest version is included into the Industries addon project
Supported topologies
- shared mode
Changelog
- Version 2.0.2: Improve extendability (notably for not listenable member - for bot testing purposes for example)
- Version 2.0.1: Add NEVER_MATCHING_GROUP_FILTER to DynamicAudioGroup additional filters to prevent joining any member group (listening to no one)
- Version 2.0.0: Fusion 2.0 support
- Version 1.0.2: Fix error in DisplayDynamicAudioGroupInfos when listened member disconnected
- Version 1.0.1: Add demo scene + add namespace
- Version 1.0.0: First release