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