ダイナミックオーディオグループ
ダイナミックオーディオグループ
ダイナミックオーディオグループ機能は、遠くのユーザーからの帯域幅やノイズを使用せずに、ローカルユーザーの周囲にいるすべてのリモートユーザーと話すことを可能にします。
定義された距離を超えたユーザーの声は聞こえません。
適切な音の空間化と減衰と組み合わせることで、自然なリスニング体験を提供します。
現在の実装は、Photon Voice interest groupsに基づいています。
各ユーザーはユニークなインタレストグループで話し、そのグループは決して変更されません。
ただし、他のプレイヤーとの近接に応じて、聞いているグループのリストは動的に変更され、必要な帯域幅を制限します。
さらに、グループに入っていないユーザーは、ネットワーク上で声を送信せず、さらなる帯域幅の消費を避けることができます。
この機能は 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);
}
デモ
こちらの使用例として参照できるデモシーンが Assets\Photon\FusionAddons\DynamicAudioGroup\Demo\Scenes\DynamicAudioGroup.unity
にあります。
複数のクライアントを接続し、各プレイヤーに関連付けられた情報パネルを観察します。
各プレイヤーは2つの球体に囲まれています。
緑の球体は、他のプレイヤーの頭がその中に入るとすぐに聞き始める領域です。
頭が赤い球体から出ると、聞くのを停止します。
ダウンロード
このアドオン最新バージョンはaddon projectに含まれています。
サポートされているトポロジ
- shared mode
Changelog
- 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