Dynamic Audio group
Dynamic Audio group
Dynamic Audio Group機能によって、余計な帯域消費や遠くのユーザーからのノイズを無くし、自身の周りのすべてのリモートユーザーと会話することができます。
定義された距離以上のユーザーの音声は聞こえません。
音声の空間化と減衰の適応を組み合わせているため、自然な感覚で音声が聞き取れるようになっています。
現在の実装は、Photon Voice インタレストグループに基づいています。
各ユーザーは1つのインタレストグループの中で話し、この値は決して変更されません。
ただし、聞き取るグループのリストは、近接する他のプレイヤーによって動的に変更され、帯域消費を抑えます。
さらに、孤立している人はネットワークを通して音声を送信しないため、さらに帯域消費を抑えられます。
この機能は、DynamicAudioGroupMember
クラスに依存しています。
DynamicAudioGroupMember
DynamicAudioGroupMember
は、各ネットワークプレイヤープレハブに付いています。
Spawned()
では、プレイヤーのユニークな音声GroupId
が計算されます(言い換えれば、各プレイヤーが自身のGroupId
を持ちます)。
それから、ローカルプレイヤーのRecorder
のインタレストグループにGroupId
が設定され、Photon Voiceクライアントがそれを聞き取るように設定されます。
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()
は他のプレイヤーの聞き取りを停止するかどうかをチェックします。
そのため、DynamicAudioGroupMember
はadditionalFilter
パラメーターを提供しています。互いの音声を聞き取れるようにするため、2つのグループメンバーは同じadditionalFilter
値を持つ必要があります。
例えば、Audio Roomアドオンでは、ユーザーが孤立したルームにいる場合、AudioRoomMember
でadditionalFilter
パラメーターが設定されます。
特別な追加フィルター値NEVER_MATCHING_GROUP_FILTER
は他のグループメンバーの参加を防ぐため、2つのグループメンバーがマッチングすることは決してありません。
C#
if (additionalFilter == NEVER_MATCHING_GROUP_FILTER || additionalFilter != member.additionalFilter)
{
// No matching filter
StopListeningToMember(member);
}
デモ
使用方法を示すデモシーンはAssets\Photon\FusionAddons\DynamicAudioGroup\Demo\Scenes\DynamicAudioGroup.unity
にあります。
複数のクライアントを接続して、各プレイヤーの情報パネルを確認できます。
各プレイヤーは2つの球に囲まれています。
緑の球は、他のプレイヤーの聞き取りを開始するエリアです。
赤の球から離れると、聞き取りを停止します。
依存関係
- Photon Voice SDK
ダウンロード
このアドオンの最新バージョンは、Industries アドオンのプロジェクトに含まれています。
対応するトポロジー
- 共有モード
更新履歴
- 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