VRクラブワールドなどを構築するにあたり、DJの告知を聞き取りやすくするために特定のプレイヤーのボイスを大きくしたい場面があると思います。今回は私のワールド「VUG Studio Tokyo」でも導入している、「特定のエリアに入った時そのプレイヤーのボイスを大きくする」方法について簡単に解説します。Udon Graphで作成できるため、コーディングの必要もなく手軽に作成できます。
マイクなどにボイスを大きくするギミックを実装するのと比較して、プレイヤーはただそのエリアに入るだけでボイスが増幅されるため、マイクをGrabし続ける必要がなく楽です。一方で、そのエリアに入っている間プレイヤーのボイスは常に増幅された状態になり、環境音やわずかな声も大きな音で拾ってしまうため、不必要なときはボイスをミュートにするか、今回解説するギミックをオンオフできる別のギミックを実装するなどして対処する必要があります。
①ボイスを増幅したいエリアを設定する
Hierarchyに適当なオブジェクトを新規作成し、Box Colliderをボイスを増幅させたいエリアに設定します。また、Is Triggerにチェックを入れます(チェック入れないとColliderの中に入れないため)。
②Udon Graph Programを作成する
①で作成したオブジェクトのInspectorでUdon BehaviourコンポーネントをAddします。今回はUdon Graphで実装していきますので、赤枠で示しているプルダウンで「Udon Graph Program Asset」を選択してNew Programを押します。Program Sourceが作成されたら「Open Udon Graph」を押して編集画面を開きます。
③Variablesを設定する
GameObjectの変数をpublicで作成します。変数名はなんでもいいですが、ここではわかりやすさのため「voiceBoostArea」としています。
④エリアに入った時、エリアから出た時の処理を記述する
以下、どんな処理をやっているかだけ解説します。
まず、プレイヤーがColliderの中に入ったかどうかをOnPlayerTriggerEnterで拾います。
今回重要になるのがVRCPlayerApiのSetVoiceGainとSetVoiceDistanceNearです。
SetVoiceGainはその名の通りボイスのゲインを設定するもので、0~24の間で設定します(既定値は15)。この値を15より大きくすればエリア内のプレイヤーのボイスを増幅させることができ、逆に15より小さくすればエリア内のプレイヤーのボイスを小さくすることもできます。例えば私語絶対許さないマンなエリアを作りたければ、OnPlayerTriggerEnterでSetVoiceGainを0にすればエリア内のプレイヤーのボイスは聞こえなくなります(のはず)。
SetVoiceDistanceNearはボイスの減衰が始まる距離を設定するもので、0~1,000,000の間で設定します(既定値は0)。せっかくSetVoiceGainでゲインを大きくしても、フロアの後ろのほうなどエリアから離れてしまうと結局ボイスが減衰して聞き取りにくくなるので、この値を大きくしてフロアの後ろのほうでもほとんど減衰しないようにします。値をいくつにするかはフロアの大きさやどこから減衰させたいかによって決めるとよいでしょう。私のワールドではフロア中央付近より前側のプレイヤーには聞こえやすく、後ろのほうのプレイヤーには雑談の邪魔をしない配慮で15に設定しています。
ところで、ここまでの実装だけではプレイヤーがエリアの外に出てもボイスが増幅されたままとなってしまいます(そのような実装をしていないので自分では検証できていないがおそらく増幅されたままになるはず)。そのため、プレイヤーがエリアの外に出た時VoiceGainとVoiceDistanceNearの値を既定値に戻す処理を行うのがOnPlayerTriggerExit以降となります。
⑤変数にエリアのオブジェクトを紐づける
InspectorのUdon Behaviourコンポーネントを確認すると、Public Variablesに先ほど手順③で設定した変数が出てきていると思います(出ていない場合はCompileやReloadをする)。ここに、手順①で作成したオブジェクトをHierarchyからドラッグ&ドロップして紐づけます。
これで実装完了です!Build&Testでクライアントを2つ立ち上げ、一方でボイスを話し、もう一方でボイスを聞いて、正しく実装されているかを確認します(Testをスキップしてワールドをアップロードし、フレンドに確認してもらってもよいです)。
以上、ご参考になれば!
最後までご覧いただきまして、ありがとうございました。
※この記事は自分の環境ではこの方法で実装できたということを共有するもので、すべての環境での動作を保証するものではありません。
SetVoiceGain・SetVoiceDistanceNearを含む、Player Audioの詳細な仕様はVRChatのドキュメント(英語)をご確認ください。