PlayerAudio Master - mimyquality/FukuroUdon GitHub Wiki

概要

VRChatのワールドに設置して、インスタンス内の各プレイヤーの声量とアバター音量を統括管理し制御するためのギミックです。
組み合わせにより、個室、ミュート/シャウトエリア、メガホン、遠隔通話などの機能を同時に組み込むことができるようになります。

導入手順

Installation

パッケージ内容

  • プレイヤー声量、アバター音量の統括管理ギミック
  • 本ギミックを扱うための補助スクリプト
  • ギミック組み合わせ例のサンプルプレハブ

使い方

Packages > Fukuro Udon > Samples > PlayerAudioMaster フォルダーの中に、構築済みのサンプルプレハブ各種が入っています。Hierarchy に置いて Unpack し、中の設定を書き換えたり、必要に応じて複製・削除して調整してください。サンプルの各プレハブの内容については後述します。
プレハブにないものは、新たにゲームオブジェクトを作り、Add Componentから Fukuro Udon > PlayerAudio Master と辿って欲しいコンポーネントをアタッチして設定してください。
image

このギミックは、インスタンス内の全てのプレイヤーの状態を統括管理する PA Supervisor コンポーネントと、各プレイヤーとの条件マッチ状況と適用するプレイヤー声量・アバター音量を設定する PA Regulator 系コンポーネントの2種類で構成されます。
PA Supervisor コンポーネントは、ワールドのシーン中に一つだけ置くようにしてください。複数置くと競合します。
PA Regulator 系コンポーネントが付いたオブジェクトの設置が終わったら、全て PA Supervisor コンポーネントの Player Audio Regulators 配列にセットしてください。この配列での並び順が、複数の条件に適合する時の優先順になります。(上にある方が優先)
プレイヤーが Player Audio Regulators 配列の全ての条件に適合しなかった場合は、 PA Supervisor に設定したデフォルト値に書き戻されます。

[!IMPORTANT] プレイヤー声量とアバター音量の各設定値の詳細は公式ドキュメントを参照ください。
アバター音量の各種設定は、アバターの音源に元々設定されている値と Udon から設定された値のうち小さい方が採用されます。扱う際は考慮すると良いでしょう。

PA Regulator にはチャンネル機能があり、個別に有効無効を選べます。
有効にすると、条件に適合したプレイヤーにはまずチャンネル番号が割り振られるようになり、自身(ローカルプレイヤー)とチャンネル番号が一致した時のみ、その PlayerAudio Regulator の設定を適用するようになります。チャンネル番号が不一致の時の動作は Channel Unmatch Mode で選べます。

[!TIP] プライベートルーム的な設定にしたい場合、デフォルト(PA Spervisor)の音量をミュートに設定しておき、プライベートルームにチャンネル別にした PA Regulator Area を(優先度高めで)割り当て、通常会話ゾーンとして PA Regulator Base を(優先度最低で)割り当てる運用がオススメです。

PA Regulator にはホワイトリスト機能があり、White List Player Name 配列にプレイヤーの名前(Display Name)をセットすることで、その名前と一致するプレイヤーのみが条件にマッチするようになります。
主にイベントスタッフ専用の音量設定をしたい場合などに使う事を想定しています。

[!TIP] 距離減衰を無効にするには、Udon からプレイヤーの声とアバターの音を2D音源化する事ができないため、Distance Near と Distance Far を両方最大値の999,999(m)に設定して疑似的に再現します。距離減衰せずに元の音量で聞こえるようになるため、Gain(ゲイン、増幅値)は0~5くらいの小さめの値にする事をオススメします。
逆にミュートにしたい場合は Near と Far を両方0にしてください。
Volumetric Radius はこの設定のために触らないで、0のままにしておく事を推奨します。

サンプルについて

PlayerAudioMaster_Sample

このプレハブは全コンポーネントをとりあえず突っ込んだデモサンプルです。

  • Mute Area : このプレハブは PA Regulator Area を用いて、範囲内のプレイヤーをミュート状態にする設定にしてあります。
  • Channeling Area : このプレハブは PA Regulator Area を用いて、自身(ローカルプレイヤー)と同じ範囲内、もしくは同じチャンネル番号の PA Regulator に適合するプレイヤーと通話状態にする設定にしてあります。
  • Shout Switch : このプレハブは補助コンポーネントを使い、メガホン(Megaphone)オブジェクトをピックアップしてトリガーを引いている間、トリガーしているプレイヤーの声がインスタンス全域に届くギミックとして設定してあるプレハブです。(デスクトップモードの場合はピックアップして左クリック中)
  • Grouping List : このプレハブは補助コンポーネントを使い、Assign スイッチを押したプレイヤーが PlayerAudio Regulator List コンポーネントに登録されていき、同じチャンネル同士として通話状態にする設定がしてあります。
    また、スイッチを押したプレイヤーがリストから解除される Release スイッチ、スイッチを押すと登録済みの全プレイヤーを解除する Release All スイッチも同梱されています。

PlayerAudioMaster_PrivateRoom_Sample

このプレハブはプライベートルーム内外との会話を遮断する設定がされたサンプルです。
PA Supervisor のプレイヤー声量をミュートになるよう設定しておき、各 PA Regulator Area のチャンネル機能を使って、プライベートルームはルーム内の人同士と、ルーム外の人はルーム外の人同士と会話できるようプレイヤー声量を戻す設定になっています。

  • Room Area : チャンネル機能を有効にして、同じルーム内に居る人同士で会話できる設定にしています。
  • Room Outside : チャンネル機能を有効にして、ルーム外の人同士が会話できるように設定しています。 PA Supervisor 上の優先順位を最下位にする事で、プライベートルームと範囲が被っていてもプライベートルームのチャンネルが優先される仕掛けです。

PlayerAudioMaster_Telephone_Sample

このプレハブは、電信(Telephone)をピックアップして Use している間、同色(チャンネル)設定のエリアにいる人に対しては必ず声が届く設定のサンプルです。それ以外のプレイヤー同士は通常声量のままです。
チャンネル番号を同じにすれば、一つの電信で複数のエリアに対して声を届ける設定にしたり、一つのエリアに対して複数の電信をリンクさせる事も可能です。

PlayerAudioMaster_List_Sample

このプレハブは、予め1~5でチャンネル設定された PA Regulator List とそれを操作するメニューで構成されたサンプルです。
同じチャンネルに登録した人同士は距離を無視して会話できるようになります。

[!NOTE] (ver 3.0.0以降)
操作メニュー内の PlayerName プレハブに VRC Enable Persistence コンポーネントを追加する事で、プレイヤーのチャンネル登録状態がインスタンスを跨いで保持されるようになります。
image

高度な使い方

PA Supervisor

このコンポーネントでインスタンス内の全てのプレイヤーを走査し、Player Audio Regulators 配列の中から条件に適合した PA Regulator コンポーネントの設定値で、プレイヤーの声量とアバター音量を上書きします。また、配列の全ての条件に適合しなかった際に書き戻されるデフォルト値を設定します。
負荷対策のため、プレイヤーの走査は1フレームにつき一人ずつ実行されます。そのためインスタンス人数が多かったりfpsが低下していると、条件判定処理の反応に1秒前後の遅延が出てきます。

  • Player Audio Regulators :ここにセットした PA Regulator 系コンポーネントが条件判定対象になります。同時に複数の条件に適合した場合は、配列の上にあるものが優先されます。
  • Default Voice Gain : デフォルトにするプレイヤー声量のゲイン(増幅値)
  • Default Voice Distance Near : デフォルトにするプレイヤー声量の距離減衰開始距離 (単位meter)
  • Default Voice Distance Far : デフォルトにするプレイヤー声量の発音限界距離 (単位meter)
  • Default Voice Volumetric Radius : デフォルトにするプレイヤー声量の音源サイズ半径 (単位meter) ※基本的に0のままにしてください
  • Default Voice Lowpass : デフォルトにするプレイヤー音声のローパスフィルター設定
  • Default AvatarAudio Gain : デフォルトにするアバター音量のゲイン(増幅値)
  • Default AvatarAudio Distance Near : デフォルトにするアバター音量の距離減衰開始距離 (単位meter)、アバターの設定値と小さい方が採用されます
  • Default AvatarAudio Distance Far : デフォルトにするアバター音量の発音限界距離 (単位meter)、アバターの設定値と小さい方が採用されます
  • Default AvatarAudio Volumetric Radius : デフォルトにするアバター音量の音源サイズ半径 (単位meter)、アバターの設定値と小さい方が採用されます
  • Default AvatarAudio Force Spatial : デフォルトにするアバター音源の Spatialize 設定、オフの場合アバターの設定値が採用されます
  • Default AvatarAudio Custom Curve : デフォルトにするアバター音源の設定済みカスタムカーブを使うかどうかの設定、オフの場合アバターの設定値が採用されます

PA Regulator (共通項)

  • Enable Channel Mode : チャンネル機能を有効にします
  • Channel : チャンネル番号
  • Channel Unmatch Mode : 自身(ローカルプレイヤー)と適合したプレイヤーのチャンネル番号が不一致だった時の動作
    • Default : PA Supervisor のデフォルト値を適用します
    • Fallback : Unmatch Fallback にセットされた PA Regulator の値を適用します
    • Passthrough : この条件に適合しなかったことにして、次の条件判断に移ります。逆に言うと、条件判断にチャンネルの一致も含むようになります
    • Pretend : この PA Regulator 自身の値を適用します。つまり、チャンネルにマッチしているかのように振る舞います
  • Unmatch Fallback : Channel Unmatch Mode が Fallback の時に、フォールバック先として参照される PA Regulator 。ここにセットしたものが PA Supervisor にセットされている必要はありません
  • White List Player Name : この配列に登録された名前のプレイヤーのみが条件に適合するようになります。配列 Size が0ならこの機能は使われません
  • Voice Gain : プレイヤー声量のゲイン(増幅値)
  • Voice Distance Near : プレイヤー声量の距離減衰開始距離 (単位meter)
  • Voice Distance Far : プレイヤー声量の発音限界距離 (単位meter)
  • Voice Volumetric Radius : プレイヤー声量の音源サイズ半径 (単位meter) ※基本的に0のままにしてください
  • Voice Lowpass : プレイヤー音声のローパスフィルター設定
  • Avatar Audio Gain : アバター音量のゲイン(増幅値)
  • Avatar Audio Distance Near : アバター音量の距離減衰開始距離 (単位meter)、アバターの設定値と小さい方が採用されます
  • Avatar Audio Distance Far : アバター音量の発音限界距離 (単位meter)、アバターの設定値と小さい方が採用されます
  • Avatar Audio Volumetric Radius : アバター音量の音源サイズ半径 (単位meter)、アバターの設定値と小さい方が採用されます
  • Avatar Audio Force Spatial : アバター音源のSpatialize設定、オフの場合アバターの設定値が採用されます
  • Avatar Audio Custom Curve : アバター音源の設定済みカスタムカーブを使うかどうかの設定、オフの場合アバターの設定値が採用されます

PA Regulator Base

このコンポーネントは固有の条件を持たず、必ず条件に適合します。
チャンネル機能やホワイトリスト機能等の共通項の判定は有効です。

PA Regulator Area

このコンポーネントと一緒に付いたコライダーの範囲に居るプレイヤーとマッチするようになります。
使えるコライダーの種類は Box Collider, Sphere Collider, Capsule Collider, Convexにチェックを入れた Mesh Collider の4つです。

範囲の指定にはコライダーを使用しますが、プレイヤー側の判定はカプセル形状ではなく、プレイヤーの原点(概ねアバターの足元)、つまり"点"で見ます。
そのため、床に多少埋まってるくらいの範囲で指定すると丁度良くなります。
image

コライダーが他のピックアップオブジェクトや uGUI 操作を阻害しないように、このオブジェクトはUIレイヤーにする事を推奨します。

PA Regulator Switch

このコンポーネントにはプレイヤーを一人だけ登録することができ、登録されたプレイヤーが適合するようになります。
このコンポーネントと一緒にコライダーも付けると、インタラクトしたプレイヤーを登録するスイッチになります。
下記のメソッドを使って、他のU#スクリプトからプレイヤーを指定して登録する事もできます。(実行にはオーナー権が必要です)

  • Switch Mode : このオブジェクトをインタラクトした時の挙動です
    • Toggle : インタラクトする度にこのコンポーネントにプレイヤーを登録⇔解除するかを切り替えます。既に誰かが登録済みの場合は登録できません
    • Button On : インタラクトしたプレイヤーをこのコンポーネントに登録します。既に誰かが登録済みの場合は上書き登録されます
    • Button Off : インタラクトしたプレイヤーをこのコンポーネントから解除します
返り値 名前 説明
void AssignPlayer(VRCPlayerApi target) 引数に指定したプレイヤーを登録します。
void ReleasePlayer() このコンポーネントに登録されたプレイヤーを解除します。

PA Regulator List

このコンポーネントには複数のプレイヤーを登録することができ、登録されたプレイヤーが適合するようになります。
プレイヤーの登録には、別途連携するU#スクリプトから、オーナー権のある状態で以下メソッドを実行してください。

返り値 名前 説明
bool AssignPlayer(VRCPlayerApi target) 引数に指定したプレイヤーを登録します。返り値には登録の成否が入ります。
void ReleasePlayer(VRCPlayerApi target) 引数に指定したプレイヤーを解除します。
void ReleaseAllPlayer() このコンポーネントから全プレイヤーの登録を解除します。

PA Regulator AvatarScale

このコンポーネント固有の条件を持たず、共通項の判定のみで適合します。
設定項目のうち、プレイヤー声量とアバター音量の Gain, Distance Near, Distance Far, Volumetric Radius が、アバターの身長(EyeHeight)に応じて変動します。
変化量は、設定項目にある Base EyeHeight を基準として、アバターの身長(EyeHeight)倍だけ変化します。
Base EyeHeight より大きい時は OverScale Multiplier によって拡大倍率を調整出来ます。同様に、 Base EyeHeight より小さい時は UnderScale Multiplier によって縮小倍率を調整できます。
つまり、基準身長より大きいときだけプレイヤー声量を拡大させる、といった使い方ができます。(デフォルト設定がそうなっています)

変化量(倍率)の計算式を以下に示します。

対象プレイヤーの現在のAvatar EyeHeightが Base EyeHeight より大きい時

倍率 = OverScaleMultiplier * AvatarEyeHeight / BaseEyeHeight

対象プレイヤーの現在のAvatar EyeHeightが Base EyeHeight より小さい時

倍率 = 1 - UnderScaleMultiplier * (1 - AvatarEyeHeight / BaseEyeHeight)

PAR Switch Controller for Pickup

ピックアップオブジェクトから PA Regulator Switch を操作できるようにする補助コンポーネントです。
PA Regulator Switch が Manual Sync のため、VRC ObjectSync と共存するための措置です。

  • Linked Switch : ここに指定した PA Regulator Switch に向けてプレイヤーを登録/解除します
  • Assign Event : ローカルプレイヤーを登録するイベントを指定します
    • On Pickup : このピックアップオブジェクトをピックアップした時
    • On Pickup Use Down : このピックアップオブジェクトをピックアップ中にトリガーした時
    • On Pickup Use Up : このピックアップオブジェクトをピックアップ中、トリガーを解放した時
    • On Drop : このピックアップオブジェクトを手放した時
  • Release Event : 登録されたプレイヤーを解除するイベントを指定します
    • On Pickup : このピックアップオブジェクトをピックアップした時
    • On Pickup Use Down : このピックアップオブジェクトをピックアップ中にトリガーした時
    • On Pickup Use Up : このピックアップオブジェクトをピックアップ中、トリガーを解放した時
    • On Drop : このピックアップオブジェクトを手放した時

PAR List Controller

このコンポーネントと一緒にコライダーを付けて、インタラクトスイッチとして PA Regulator List を操作できるようにする補助コンポーネントです。

  • Target List : ここに指定した PA Regulator List に向けてプレイヤーを登録/解除します
  • Switch Mode : このオブジェクトをインタラクトした時の挙動です
    • Assign : インタラクトしたプレイヤーを指定した PA Regulator List に登録します
    • Release : インタラクトしたプレイヤーを指定した PA Regulator List から解除します
    • Release All : 指定した PA Regulator List に登録されている全プレイヤーを解除します

VoiceChannel Selecter

このコンポーネントは uGUI の Button と連携し、 PA Regulator List に自身を登録できるようにする補助コンポーネントです。
具体的な構造は、サンプルの PlayerChannelSettingMenuプレハブを見てもらうのが早いかと思います。

  • Target Regulator : ここに指定した PA Regulator List に向けて自身を登録/解除します
  • Button Channel OFF : 同じ要素番号にセットされた PA Regulator List に自身が居ない時用の Button コンポーネントをセットします
  • Button Channel ON : 同じ要素番号にセットされた PA Regulator List に自身が登録済みの時用の Button コンポーネントをセットします

VoiceChannel PlayerList

このコンポーネントは uGUI に表示用の補助コンポーネントで、指定のチャンネルに存在するプレイヤーを一覧表示します。
具体的な構造は、サンプルの PlayerChannelSettingMenu プレハブを見てもらうのが早いかと思います。

  • Player Prefab : プレイヤー名表示 uGUI パーツのインスタンス化用
  • Channel Slot : プレイヤー名表示 uGUI パーツのインスタンス化用
  • Channel List : この配列に登録した数字と一致するチャンネルに居るプレイヤーを、同じ要素番号の Channel Slot パーツ内に表示させます

サンプル

以下のワールドにサンプルを設置しています。
https://vrchat.com/home/world/wrld_4b7ed36e-c436-409f-9f87-8a6f4c80e79b