This document is about: FUSION 1
SWITCH TO

このページは編集中です。更新が保留になっている可能性があります。

ダイナミックオーディオグループ


Available in the Industries Circle
Circle
Fusion Industriesプロトタイピングアドオン

ダイナミックオーディオグループ

ダイナミックオーディオグループ機能は、遠くのユーザーからの帯域幅やノイズを使用せずに、ローカルユーザーの周囲にいるすべてのリモートユーザーと話すことを可能にします。
定義された距離を超えたユーザーの声は聞こえません。
適切な音の空間化と減衰と組み合わせることで、自然なリスニング体験を提供します。

現在の実装は、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にあります。

Fusion Industries Addon Dynamic Audio Group

複数のクライアントを接続し、各プレイヤーに関連付けられた情報パネルを観察します。
各プレイヤーは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
Back to top