Audio Room
AudioRoom
ケースによっては、プレイヤー間の距離にかかわらず、プレイヤーを異なるオーディオ「ルーム」に分けられると便利です。
つまり、同じオーディオルームにいるプレイヤー同士でのみ会話が可能で、ドアによってルームが区切られるものです。そのために4つのクラスが提供されます。
AudioRoomManagerAudioRoomAudioRoomMemberAudioDoor
AudioRoomManager
AudioRoomManagerは、シーン内のルームとプレイヤーのリストを管理します。
プレイヤーが移動するごとに、プレイヤーがいるルームのリストを取得するために、MatchingRooms()メソッドが呼び出されます。(ルームは互いに重なることがあります)
AudioRoom
オーディオルームは、Audioコンポーネントで定義されます。
ルームの空間的な位置は、ボックスの中心点に設定されます(シーンビューで立方体のギズモが表示されます)。
各AudioRoomは固有Idを持ち、AudioRoomManagerのAwake()内で登録されます。
IsIsolatedブール値は、プレイヤーがいるルームが他のプレイヤーとドアで区切られているかを定義するために使用されます。
ルームに関連したドアが動くと、AudioDoorでIsolate()メソッドが呼び出され、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()メソッドは、ドアで区切られたルームの隔離ステータスを変更します。
それから、そのルームにいるプレイヤーに隔離ステータスが通知されます。ルームが区切られていたら、DynamicAudioGroupMemberのadditionalGroupFilterにroomIdが設定されます。
これによって、定義された距離内にいるかにかかわらず、ルームにいるプレイヤー同士のみが音声を聞き取ることができます。
ドアのステータスが変更された時、OnStatusChange()イベントが発生します。
依存関係
Dynamic Audio Group version 2.0.1
デモ
使用方法を示すデモシーンはAssets\Photon\FusionAddons\AudioRoom\Demo\Scenes\AudioRoom.unityにあります。
シーンには、ドアで区切られた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