再びジェイミーです。Murderous Pursuitsの会話とダイアログシステムについてのブログの後半です。
もしパート1を読んでいなければ、ここをクリックして読んでみて!
前回は、このゲームでSimlishを使うことになったいきさつと、どのような編集作業や処理が発生したかを説明しました。それでは、私たちが使ったオーディオミドルウェアソリューションWwiseの内部で、何が起きているのかを、みていきます。まず、こちらが会話用コンテナの階層構造ですが、大まかな内容が分かると思います。
一番上にあるのがVOX_CharConvo(ボイス、キャラクターのカンバセーション)という名前のSwitch Containerで、どのキャラクターが話すのかを決めるためにあり、そこで指名されたSwitch Containerは、再生されるSimlishオーディオ、またはカンバセーション(会話)オーディオの種類を選択します。Brute(粗野な男)用のコンテナであるVOX_BruteConvoを展開表示しています。会話の種類ごとにRandom Containerが設定され、オーディオイベントがトリガーされると、複数のサウンドが入ったグループから、ランダムに、1つのオーディオファイルが選択されます。
ただ、上図からも分かるように、Neutral、Positive、Negativeの3つのコンテナは、少し違います。これらのコンテナの場合は、中のファイルをランダムに選択して再生するだけでなく、会話の流れを維持しながらも、長さや言葉が異なるSimlishフレーズから選ぶのです。フレーズの種類や言葉をランダムに選択させる設定はとても簡単で、単純にRandom Containerを増やせばいいだけです。一方、実際のフローにおいては、もう少し細かい作業が必要でした。BruteのConvoコンテナの中にあるNeutralコンテナのProperty Editorの設定が、こちらです:
ここで、いくつかのことが起きています。まず、Initial Delayの設定を見てください。
これがループするアニメーション開始のベーシックなオフセット値として機能し、その値を選択するのにランダマイザーを使っています。何も特別なことはありません。
次に、Play Type。
Neutralコンテナの中の6つの選択肢の中から、ランダムに1つ選択するように設定されています。普通の使い方では、マシンガンのような繰り返しを避けるために、すでに再生したオーディオクリップは繰り返さないようにします。ところが、ここではすでに使われたサブコンテナも含め、どのサブコンテナが選ばれてもいいのです。なぜなら、異なるタイプ間のトランジションをカバーするのに役立ち、もっとダイナミックで変化に富んだ会話が可能になるからです。
Play Modeは、ContinuouslyのLoopに設定してあるので、継続的にループします。
キャラクターは、おしゃべりを停めるイベント、例えば、ほかの人が話し始めたり、近くで誰かが殺されてそれに反応したりするときまで、ずっと話し続けます。Admiral(司令官)などはいつまでもしゃべり続けることができるキャラクターですが、モノローグは避けたいところです。TransitionのDelayは、ランダムオフセットを考慮すると0から0.4秒になるように設定されているので、キャラクターのフレーズに入っている自然なギャップや沈黙とは別に、キャラクターが息をつける間をつくり出せます。
クリップとクリップの間をクロスフェードさせることを、最初は試みましたが、オーディオストリーミングのように聞こえてしまい、実際にはどうしても不自然でした。また、Simlishで聞くQuestionの断片 は、最後に必ず少しだけ、沈黙が入っていて、声優のしゃべりの抑揚と組み合わせると、会話が少しだけ宙に浮かび、より自然な流れになりました。
最後に、ウェイト付けについて。
キャラクターのセリフはどちらかというとSimlishになる傾向が強く、Simlishでない1つ1つの単語が目立つようにしてあり、単語が連続して流れる可能性を最小限にしながらも、可能性は残してあります。
Playback設定とは別に、WwiseのWwise Silenceを使い、Randomコンテナに必ずサイレンスのオーディオクリップを2つずつ入れました。これらのクリップは、入っているコンテナによって長さも違い、聞き疲れを軽減し、会話がもっと自然に流れるように「一時停止」の時間を投入してくれます。サイレンスのクリップが複数、連続してトリガーされる可能性もありますが、それは問題ありません。誰もがずっとしゃべり続けるわけでは、ありませんから。
Wwiseで1人のキャラクターだけを聞いてみると、こうなります。
これだけでも、悪くないです。では、インゲームだと?
結構良くなりました。人が集まっている横を通り過ぎるときに、その会話がとぎれとぎれ耳に入ってくると、ワールドに人が多いように感じられ、生き生きとしてきます。WwiseのShareset機能も活用し、音と距離の関係をコントロールしました。Sharesetsはロールオフ、つまり距離に応じた減衰の設定のことで、個別にサウンドの設定をする代わりに、複数のサウンドをグループにまとめて設定できます。Convoコンテナは、次のような設定にしました:
カーブでボリューム低減をコントロールし、遠いところでは、ハイパスやローパスのフィルターを入れます。緑のカーブは、音がサウンドフィールドのどれだけを占めるのかを決めるSpreadです。Spreadが最小のときは点音源となり、音の発生している方向が簡単に判別できます。最大のときは、プレイヤーの周りのどこにいるかに関係なく、音がサウンドフィールド全体に広がります。誰かの隣にいるときは75%に設定し、話す人の方向がまだ分かるようにして、近くにいることを強調し、音がサウンドフィールド全体に広がることで、プレイヤーも会話に参加しているかのような印象を与えます。
また、私はCone Attenuation(減衰の円錐)の機能も使い、音源の向いている方向によってボリュームを減衰させたり、フィルターを投入したりしました。音は人間の口、つまり体の前側から出るので、話者の後ろにいるときは、少し音が小さく聞こえた方が分かりやすくなります。ここで短い動画を見てください(右下に注目すると、何を変えているのかが分かります):
ゲーム中の再生は、少なくとも私にとって、比較的シンプルです。プログラマーが、UnityでAnimというカスタム設定のEventをつくってくれ、私がアニメーションにWwiseイベントを添付できるようになり、アニメーションがループしている場合は、スタート用のアニメーションを別に設け、常にオーディオを再トリガーしてしまうのを防ぎました。Wwiseイベントの中に、会話の種類を選択するSwitchアクションと、VOX_CharConvoコンテナのPlayアクションを入れています。キャラクターの選定はプログラムコードで処理します。また、すべてのダイアログタイプに使える、わずかなフェードアウト付きの汎用Stopイベントもあり、キャラクターが動き出したときや、ほかのアニメーション(攻撃など)などで、トリガーされます。美しくはありませんが、ちゃんと動きます。
AnimというEventは文字列の引数を受け取り、この場合はWwiseのイベント名ですが、それをAKSoundEngine.PostEvent コールの中で使用します。オーディオを必要とする、移動以外のすべてのアニメーションにこれを利用していて、複数のAnimイベントをアニメーションのタイムライン上にバラバラに設定するのではなく、必要な全アクションを1つのWwiseイベントにベイク(bake)しました。バラバラに設定すると、遅くなったり誤動作したり、全般的に信頼できないことに気付いたので、Audiokineticの人たちが単一イベントの方法を提案してくれ、すんなりうまくいきました(マックス、ありがとう!)。簡単な例として、Bludgeon Attackというイベントがありますが、14種類のActionsが入っています:
それでは、ここまで。ゲームオーディオは、まるでブラックボックスのように見えるかもしれないので、舞台の裏方を覗いて、プロセス全体の一部で、どのようなことが起きているのかが少し分かったと思いますし、プレイヤーの耳に届くまで、どれだけの作業が必要なのかも見えてきたと思います!Wwiseに興味があれば、無料でダウンロードできるし、たくさんのチュートリアルやリソースもそろっているので、試してみてください。 ここで 入手できます。
Unityと一緒に使ってみたければ、Berrak Nil Boyaの動画がお勧めで、Unityから出ているチュートリアルから始まり、そのあとに、もっと面白いテーマにつながっています。Unityの一部レイアウトが、あとから変更された可能性もありますが、使い方は全部一緒です!
ここで、声優さん達に大きな拍手を送りたいと思います。彼らのサイトも見てみてね:
アリー・マーフィー(Ally Murphy)
アメリア・タイラー(Amelia Tyler)
デービッド・マッカリオン(David McCallion)
ジェイ・ブリトン(Jay Britton)
ケニー・ブライス(Kenny Blyth)
キム・アラン(Kim Allan)
トニー・フルーティン(Toni Frutin)
そして、Murderous PursuitsをSteamでチェックするのも忘れずに!
読んでくれて、ありがとう。
ジェイミー
この記事は、最初にBlazing Griffinのウェブサイトに2回に分けて掲載されました。
コメント