はじめに
これはWildlife Studiosが作成したゲーム、『Suspects: Mystery Mansion』のボイスチャットシステムについてのブログです。執筆している私たちはテクニカルサウンドデザイナーのレオ・ペラントーニ(Leo Perantoni)と、オーディオプログラマーのフェリペ・ロペス(Felippe Lopes)です。
私たちは既存のボイスシステムAPIをGMEに置き換える作業を担当しました。目的はオーディオ品質を上げること、Wwise内部のシグナルフローやスペーシャリゼーション構造、そしてエフェクトチェインを活用してボイスチャンネルで送信する内容を制御する能力でした。
『Suspects: Mystery Mansion』はネイティブボイスチャット機能、たくさんのユニークなゲームモード、定期的な新規コンテンツが特長のソーシャル推理ゲームです。
このゲームのボイスチャットはシチュエーションによって変わるルールがたくさんあり、これらのルールがチャット機能に影響してくるため、正しくセットアップするのがなかなか大変でした。2Dチャットと3Dチャットを織り交ぜて使い、プレイヤーのステートによってそのプレイヤーに聞こえるチャンネルが変わります。例えば死んだプレイヤーには生きているプレイヤーの声がアテニュエーション付き3Dで聞こえ、ほかの死んだプレイヤーの声がアテニュエーションなしの2Dで聞こえる一方、生きているプレイヤーにはほかの生きているプレイヤーの声しか聞こえません。このように、かなり複雑になっています。
それでは TencentのWwise向けGMEプラグイン を使用して、ボイスチャットを実装した方法をご紹介します。
さまざまなGMEの使用方法
『Suspects: Mystery Mansion』にはボイスチャットのステートを左右するシステムがたくさんあります。
- 自分や他人のミュート、アンミュートといったプレイヤーアクション
- 緊急ミーティングの開始、終了などのゲームプレイアクション
- 信頼性、安全性などのシステムアクション
これらのシステムが一斉にボイスチャットのステートを変えようとするかもしれません。例えばプレイヤーが自分のマイクをミュートにし、「サイレンスシステム」がほかのプレイヤーの声が聞こえてくるのを防ぎ、「信頼性と安全性のシステム」が誰も話せないようにする場合などが考えられます
そこで複数のシステムを重ねたこのアプローチの問題を解消するために、意図に基づく設計を採用しました。それぞれのシステムが希望のボイスチャットステートを宣言します。次に宣言されたさまざまなステートを合体させ、1つのチャンネルまたはルームを使いボイスチャットに適用します。
ロビーと緊急ミーティング
ロビー内や緊急ミーティングの場ではプレイヤー同士が2D空間で話すことができます。この時は通常のReceiveやSendイベントを呼び出します。このゲームステートではプレイヤーがほかの特定プレイヤーをミュート・アンミュートしたり(ステートシステムを使用)、自分自身をミュート・アンミュートしたりできます。
私たちはこれらのプレイヤーアクションを処理するためにGMEイベント AddAudioBlockList と RemoveAudioBlockList を使い、ミュートされたプレイヤーのリストをローカル保存して、ほかのすべてのタイプのボイスチャットでも同一のアクションを適用できるようにしました。
ゴーストチャットのゲームモード
追放されたり偽善者に殺されたりしたプレイヤーは、死んだプレイヤーたち全員が参加するゴーストモードチャットに入ります。ゴースト同士はお互いの声が(ゲームモードによっては生きているプレイヤーの声も)聞こえますが、緊急ミーティングが招集されると、ミーティング中の生きているプレイヤー同士の議論しか聞こえません。
これを実現するために死んだプレイヤーをマッチ(試合)中だけアンミュートして2Dでお互いに話せるようにし、緊急ミーティングがはじまったら再び彼らをミュートにします。
Chit Chatゲームモード
Chit Chatゲームモードの時は、プレイヤーの近くにいるほかのプレイヤーと会話ができます。この機能を実現するために次のことを行いました。
1. 近接半径値でGMEイベントメソッド SetRangeAudioRecvRange を呼び出します。
2. Wwiseでアテニュエーション付き3Dレシーバーイベントを作成します。
3. このイベントをロビー内の生存中のほかのすべてのプレイヤーに関して呼び出します。
4. GMEイベント SetReceiveOpenIDWithGameObjectID を、 SetUserID メソッドの時と同じuserIDで呼び出します。
以上のステップが完了すると、Chit Chatのやり取りを開始できます。プレイヤーが動くたびに SetSelfPosition メソッドを使いGMEのローカルポジションを更新します。
Chit Chatモードの緊急ミーティング
緊急ミーティングをChit Chatゲームモードで開催する時と標準ゲームモードで開催する時の違いは、プレイヤーをアンミュートする前に3Dレシーバーイベント(Chit Chatモード)または2Dレシーバーイベント(標準モード)にトグルする点です。同じことをミーティング終了時にも行い、その時は空の値でGMEイベント SetReceiveOpenIDWithGameObjectID を呼び出します。
Chit Chatモードのゴースト同士のチャット
これが一番難しかったです。ゴーストになると2D空間でほかのゴーストと話したり聞いたりすることができるのと同時に、生きているプレイヤーの会話もアテニュエーション付き3D空間で聞くことができます。
Chit Chatモードのゴーストチャットを実現するために次のことを行いました。
1. 2Dレシーバーイベントを呼び出します。
2. 死んだプレイヤーたちだけの3Dレシーバーイベントを停止します。
3. 死んだプレイヤーたちだけに関して、空の値でGMEイベント SetReceiveOpenIDWithGameObjectID を呼び出します。
ミュート対象者のリストはローカルで保持するため、生きているプレイヤーはゴーストチャットの会話を聞くことは絶対にありません。
下図は『Suspects: Mystery Mansion』のボイスチャットでよくあるケースです。やり取りはすべて1つのチャンネル上で行われ、クライアント側で制御します。
- プレイヤーAとBは生きていてお互いとしか話ができません。
- プレイヤーCとDは死んでいてお互いと話ができ、プレイヤーAとBの会話を聞くことができます。
- プレイヤーEとFは生きていてプレイヤーAやBのアテニュエーション範囲外にいるため、お互いとしか話ができません。
Wwiseインテグレーション
GMEオーディオエフェクトに対応するためのWwiseのセットアップはとても簡単です。Wwiseセッションにプラグインをインポートした後に作成されるワークユニットは、ほとんどそのまま使える状態でした。ただしシチュエーション対応のボイスチャットだけはニーズが異なるため、少しだけカスタマイズしました。
基本的な構造は上から下へと次のようになっています。
- エフェクトチェインの最後でインスタンス化されるTencent GME Sendエフェクト付きのオーディオオブジェクト
- Tencent GME Receiveエフェクトのあるオーディオオブジェクト(Sendエフェクトを受け取るリスナー)
- Tencent GME SessionエフェクトのあるMain Systemオーディオデバイス(ルームやユーザIDを作成)
ファクトリ設定で達成されるボイス品質だけでも充分すばらしいのですが、ルームで最大10人のプレイヤーがお互いの話を同時に聞くような場面も考えられるため、そのような動的な状況を制御する方法が必要でした。ボイスチャットを扱う際の最大の問題点の1つは、その予測不可能性です。プレイヤーはとても静かな人もいればうるさい人もいますし、静かな部屋にいたりガヤガヤとざわついた環境にいたりします。このような予測不可能な事態には、Wwiseプラグインで対応することにしました。
頻繁に発生する特定の耳障りな周波数に対応し、高域をブーストしてこもったマイクの対処をするために、私たちはテスト結果や方針に基づいてWwise Parametric EQを使うことを決めました。さらに複数のプレイヤーが怒鳴り合っているような状況にも対応できるよう、このシステムのシグナルパスの複数のステージでWwise Peak Limiterを使用しています。最後にGME Sendの直前でキャラクターのスプライト周りの光り輝くエフェクトをキャラクターのボイス音量に基づいて、Wwise Meterで制御し誰がしゃべっているのか一目で分かるようにしています。
Unityの GetRTPCValue メソッドでWwise Meter値を読み込み、その値をサーバに送信すると、その値がほかのプレイヤーのクライアントで再現されて光り輝くエフェクトが制御されます。
このGME Send後にGME Receiveエフェクトのあるオーディオオブジェクトが2つありますが、1つはアテニュエーションもスピーカーパンニングもない2Dチャット用のオーディオオブジェクト、もう1つはアテニュエーションやポジショニングのある3Dチャット用のオーディオエフェクトで、後者は共通エミッタのように使われます。最後のステップは、メインシステムの出力オブジェクトのGME Sessionエフェクトとなります。
将来のために私たちが検討中で、GMEシステムで実現可能なアイディアとして、ボイスチャットのシグナルパスでもっとクリエイティブなオーディオ処理を行うという計画があります。例えばゴーストチャット(死んだプレイヤーたちのチャンネル)にいる時は、GME Sendに若干の遅延とリバーブを追加することを考えています。GMEを使用すると、このようなことはとても簡単に実装することができます。
ボイスチャットのクリエイティブな使用例をもう1つ挙げると、チームメートとの距離に応じてクリーンボイスと無線ボイスをブレンドできます。エフェクトのDry/WetパラメータをGMEで距離RTPCを使って制御すれば簡単です。クリーンボイスから無線ボイスに切り替わるRTPC閾値のところで無線通信機のクリック音をトリガーさせると、没入感がさらに高まります。
以上が今回のWwise側の実装でした。
まとめ
ボイスチャットのイテレーションをすばやく行いたい時にGMEは非常に便利で、そのためのツールがWwiseにすべて揃っていることはリアルタイムでボイス品質を制御する上でとても役に立ちます。
ボイスチャットのプレイテストセッションで大いに協力してくれたWildlife Studiosオーディオチームの仲間たち、エンジニアリングとQAをサポートしてくれた『Suspects: Mystery Mansion』の開発チーム、そしてすばらしき『Suspects: Mystery Mansion』コミュニティのみなさまに、ここでお礼を申し上げたいと思います。新しいボイスチャット機能をどうぞお楽しみください。
Wwise GMEを試してみる
|
レオ・ペラントーニ(LEO PERANTONI) |
コメント