This document is about: FUSION 2
SWITCH TO

Audio Room


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

AudioRoom

ケースによっては、プレイヤー間の距離にかかわらず、プレイヤーを異なるオーディオ「ルーム」に分けられると便利です。
つまり、同じオーディオルームにいるプレイヤー同士でのみ会話が可能で、ドアによってルームが区切られるものです。そのために4つのクラスが提供されます。

  • AudioRoomManager
  • AudioRoom
  • AudioRoomMember
  • AudioDoor

AudioRoomManager

AudioRoomManagerは、シーン内のルームとプレイヤーのリストを管理します。

プレイヤーが移動するごとに、プレイヤーがいるルームのリストを取得するために、MatchingRooms()メソッドが呼び出されます。(ルームは互いに重なることがあります)

AudioRoom

オーディオルームは、Audioコンポーネントで定義されます。
ルームの空間的な位置は、ボックスの中心点に設定されます(シーンビューで立方体のギズモが表示されます)。
AudioRoomは固有Idを持ち、AudioRoomManagerAwake()内で登録されます。

IsIsolatedブール値は、プレイヤーがいるルームが他のプレイヤーとドアで区切られているかを定義するために使用されます。
ルームに関連したドアが動くと、AudioDoorIsolate()メソッドが呼び出され、OnCurrentRoomIsolationChange()メソッドによってグループのフィルタリングを更新するかどうかをチェックします。

AudioRoomMember

各ネットワークプレイヤープレハブはAudioRoomMemberクラスを持ち、開始時にAudioRoomManagerに登録されます。
移動するたびにDidMove()コールバックにより、AudioRoomMemberはユーザーが他のルームに移動したかどうかをチェックします。
そして、ルームのステータス(区切られているかどうか)によってグループ(DynamicAudioGroupMember)を設定します。

ルームを離れる時、グループのフィルタリングが以下のどちらかにリセットされます。

  • OutOfRoomFilterMode.NoFilterの場合、デフォルト値(全員の音声を聞き取る)
  • OutOfRoomFilterMode.NeverMatchingGroupFilterの場合、誰の音声も聞き取らない

プレイヤーかルームがIAudioRoomListenerを実装している場合、プレイヤーが入室/退室した時にOnIsInRoomコールバックを受け取ります。

AudioDoor

AudioDoorクラスは、オーディオルームを分けるドアのゲームオブジェクトに追加されている必要があります。

ドアは、ToogleDoor()Open()メソッドで開閉できます。
権限を持たないプレイヤーがドアの開閉をリクエストすると、RPCが状態権限者に送信されます。

C#

    public void ToogleDoor()
    {
        Open(!IsOpened);
    }

    public void Open(bool isOpen)
    {
        if (Object.HasStateAuthority)
        {
            IsOpened = isOpen;
        }
        else
        {
            RPC_Open(isOpen);
        }
    }

    [Rpc(sources:RpcSources.All, targets: RpcTargets.StateAuthority)]
    public void RPC_Open(bool isOpen)
    {
        IsOpened = isOpen;
    }

ドアのステータス(開/閉)は、IsOpenedブール値によってネットワークを通して同期されます。
ChangeDetectorを使用して、Render()内で変更を検知します。

C#

    [Networked]
    public NetworkBool IsOpened { get; set; } = true;

    ChangeDetector renderChangeDetector;

    public override void Spawned()
    {
    base.Spawned();
    OnIsOpenedChange();
    renderChangeDetector = GetChangeDetector(ChangeDetector.Source.SnapshotFrom);
    }

    public override void Render()
    {
        // Check if the IsOpened changed
        if (TryDetectIsOpenedChange())
        {
            OnIsOpenedChange();
        }
    }

OnIsOpenedChange()メソッドは、ドアで区切られたルームの隔離ステータスを変更します。
それから、そのルームにいるプレイヤーに隔離ステータスが通知されます。ルームが区切られていたら、DynamicAudioGroupMemberadditionalGroupFilterroomIdが設定されます。
これによって、定義された距離内にいるかにかかわらず、ルームにいるプレイヤー同士のみが音声を聞き取ることができます。

ドアのステータスが変更された時、OnStatusChange()イベントが発生します。

依存関係

Dynamic Audio Group version 2.0.1

デモ

使用方法を示すデモシーンはAssets\Photon\FusionAddons\AudioRoom\Demo\Scenes\AudioRoom.unityにあります。

Fusion Industries Addon AudioRoom

シーンには、ドアで区切られた2つのルームがあります。
DoorゲームオブジェクトにあるAudioDoorコンポーネントのToggle is openedボタンを使用して、ドアを開閉できます。
複数のクライアントを接続して、各プレイヤーの情報パネルを確認できます。
各プレイヤーは2つの球に囲まれています。

ドアが開いていたら:

  • 緑の球は、他のプレイヤーの聞き取りを開始するエリアになります(プレイヤー同士が同じルームにいなくても)
  • 赤の球から離れると、聞き取りを停止します

ドアが閉まっていたら:

  • 同じルームにいる近接したプレイヤーのみが互いにチャット可能になります

ダウンロード

このアドオンの最新バージョンは、Industries アドオンのプロジェクトに含まれています。

対応するトポロジー

  • 共有モード

更新履歴

  • Version 2.0.1: Add new option when leaving a room (listen to anybody or not) + add (un)register methods for AudioRoom & AudioRoomMember + add IAudioRoomListener callback
  • Version 2.0.0: Fusion 2.0 support
  • Version 1.0.3: Change MoveDoorWithAudioRoomStatus from NetworkBehaviour to MonoBehavior
  • Version 1.0.2: Namespace modification
  • Version 1.0.1: Add demo scene + add namespace
  • Version 1.0.0: First release
Back to top