はじめに
新しいツールを習得したい時に、本来の使い方に反することをしてみるのも効果的です。特にインタラクティブオーディオをゲームエンジンに実装するための複雑なソフトウェアであるWwiseのように幅広い機能のあるツールは、その限界を超えた時に可能性が広がります。はたしてWwiseをゲームエンジンそのものとして使用できるのでしょうか?Wwiseの中にゲームをつくることができると思いますか?
これを自分の課題とし、詳しく調べてみました。私にとってゲームエンジン以外のエンジンでゲームをつくることは珍しくなく、マンガ本用に音楽をつくったり、 レベルがランダムに生成されるゲームをReaper内につくったり と、変わったプロジェクトに取り組むのが大好きです。
Wwiseにはすばらしい可能性があり、劇場公演やインスタレーションアートなど、ゲーム以外の目的に利用されるたびに私は非常に興味深く読んでいます。以前私はスティーヴ・ライヒ やアルヴォ・ペルトなどの セリエル 音楽向けに、自動運転方式をWwiseでつくることを試みました。具体的にはアルヴォ・ペルトの作品『鏡の中の鏡』をWwiseでプログラミングする方法を模索し、その中でイベントキューを軸とした自動運転のしくみをつくりました。こちらのプロジェクトはまだ最終的な微調整中のため、ここでは詳しく説明しませんが、ポイントは疑似的な スイッチプレイリスト を複数設定してあることで、これらのプレイリストは音を再生することが目的ではなく、特定のスイッチを設定したり、ほかのプレイリストをアクティブにするイベントをトリガーしたり、RTPC値を設定したりするだけです。これらのスイッチを使いプレイリストの再生順序を決めることができ、RTPCを送信して、Actor-Mixer階層で構築したサンプラーインストゥルメントのためのMIDIへと転換できます。プロジェクト全体がたった1つのPlayイベントからできていて、このPlayイベントがActor-Mixer階層やInteractive Music階層のさまざまな場所にあるほかのイベントをトリガーし、アクティブにします。
図01. Wwiseの中で『鏡の中の鏡(Spiegel Im Spiegel)』
ゲームエンジンとしてのWwise
私はReaperでゲームを構築した経験から確固とした意志を持ち、前のWwiseプロジェクトで得た自己展開型のしくみのツールもあり、Wwiseで本物のゲームをつくることができるのかどうかに興味がありました。長い間それは絶対に不可能だと思っていました。私がどうしても解決できなかった問題は、いかにゲームの情報を表示するかでした。そこでゲームの表示画面に使える部分を探しはじめました。Wwiseは華やかな色使いや楽しいインターフェースこそないものの、多数のエディタ画面やプロファイラー画面があります。ゲーム情報を表示する当然の選択肢としてプロファイラー画面が出てきます。それではどのようなゲーム情報を表示し、どのプロファイラー画面を使うべきでしょうか?
実はWwiseをゲームに仕立てようと考えた時の最初のアイデアは、Wwiseのリソース管理機能に目を向けたもので、サウンドキャスター画面をゲームのコントローラにし、Advanced Profiler画面のVoices Graphをゲームのメイン画面に使うことを考えました。最初はVoices Graphをいじりながら、同時に表示される情報が多すぎることに苛立ちを覚えました。例えばイベント、デバイス、ターゲット、バーチャルボイス、ボリューム、LPF、HPF、エフェクトなどが表示されます。情報が入り乱れていて、どこに注目すればよいのか分かりにくいのですが、すぐにそれを逆手に取ろうと考えました。実はオーディオバスやオーディオデバイスの名前が、ゲームプレイの様子をうまく表現してくれるのです。例えば1つのオーディオデバイスを GreatCountryOfDenmark (偉大な国デンマーク)という名前にし、もう1つを SadCountryOfSweden (悲しい国スウェーデン)とすることで、一瞬にしてデンマーク対スウェーデンという2つの敵対国の壮絶なライバル関係が浮かび上がります。
このゲームの基本的な目標はスウェーデン人よりも多くの市民を生み出すという単純なもので、 クッキークリッカー 的な要素とリソース管理機能を組み合わせています。イベントをクリックするとデンマーク人が1人生まれ、3~4秒ほど生きます。スウェーデン人側はAIを使い、3秒ごとに1つのミュージックセグメントを再生するシンプルなループをミュージックプレイリストで実行し、これがトリガーとなりスウェーデン人が3秒ごとに1人生まれます。ゲームが1本できあがり、これでようやくデンマーク人がスウェーデン人に子弟扱いされなくなります(笑)。このゲームのプロファイラー画面のイメージはこちらです。
図02. デンマーク人vs.スウェーデン人のライバル関係のボイスプロファイラー画面
少し見づらいですね…。まだVoices Graphの表示がゴチャゴチャしていて、何が起きているのかがよく分かりません。あまりにも複雑な結果となってしまい、私はこのアイデアを放棄することにしました。読者の中でこのゲームをさらに発展させたいという方がいましたら、どうぞご自由に制作を楽しんでください!
こうした試行錯誤から学び、私はついにVoices Graphのシンプルな情報だけで成立するゲームを開発し、簡単に操作できて面白みのあるゲームコントローラをつくりました。
ゲームのしくみを決めるまで
お祭りゲーム モグラ叩き は誰でも知っていると思います。プレイヤーがハンマーを使い、4個から6個ほどの穴からランダムに顔を出すモグラを叩く遊びです。すばやく叩かなければ、モグラはまた穴の中に戻ってしまいます。プレイヤーはモグラを叩くたびにポイントをもらい、すばやい反射神経を特に評価するモグラ叩きゲームもあり、プレイヤーの反応の速さに応じてスコアが高くなります。
実はWwiseのProfiler画面やサウンドキャスター機能でつくるゲームとして、モグラ叩きが条件にぴったり合ったのです。物理的なハンマーや実際のモグラがないとしても、モグラ叩きはWwiseで再現できます。うまく機能させるためには、いくつかのシステムをつくり相互に接続させる必要がありました。
まずランダムな間隔でモグラが飛び出る MoleGenerator (モグラ生成機)を構築します。最初の作業はわりと単純で、ミュージックプレイリストコンテナをつくり再生をRandom Continuousに設定します。このプレイリストが再生するのは4つのモグラ音のファイルと、オーディオバスに送信されない空っぽの NoMole (モールなし)ファイルです。前述のリソース管理ゲームの実験と同じで、これは後で詳しく説明します。
NoMole ファイルの長さを短くしてプレイリスト内にいくつも複製しておくことで、モグラが隠れてから再び飛び出すタイミングをランダムにできます。モグラファイル01~04のウェイト付けを意図的に50未満にし、NoMole ファイルはすべてウェイト付けを50以上とすることで、モグラとモグラの間に必ず待ち時間が入ります。間の長さは NoMole ファイルの再生回数によって変わります。
図03. MoleGenerator(モグラ生成システム)
01から04はすべて同じ長さです。それぞれにオーディオバスに表示されるためだけが目的の、空のミュージックセグメントがあります。しくみを詳しく見る前に、イベントキューの使い方を説明します。ご存知でない方のために、イベントキューはミュージックセグメント内にプログラミングして設定できるマーカーで、配置したタイミングでイベントをトリガーします。一般的なゲームプロジェクトでは音楽スティンガーをトリガーしたり、ちょうどよいビートにSFXを再生したり、一番肝心な戦闘ミュージック中にアンビエンスをミュートしたりするために使います。今回の場合、イベントキューでモグラの位置が上か下かを示すスイッチを切り替え、どのモグラを対象としているのかをシステムに通知します。ミュージックセグメントの最初にイベント MoleUp (モグラ上)をトリガーし、最後にイベント MoleDown (モグラ下)をトリガーします。
図04. MoleUpとMoleDownをイベントキューでシステムに伝える
モグラが出たり入ったりするようになったところで、次にハンマーのメカニズムを説明します。ハンマーの動きのロジックはそれほど難しくありません。ハンマーが命中するか外れるかはスイッチで制御します。色々と試したところ、バグの発生率が最も低い解決策がモグラの穴ごとにスイッチを4個ずつ設定することだと分かりました。ハンマーの各スイッチをそのスイッチ専用のイベントでトリガーします。例えばプレイヤーがイベント Wack01 (叩き01)を押すと、下図のスイッチ Hammer01 (ハンマー01)が再生されます。ご覧の通り結果はHit(ヒット)とMiss(ミス)のどちらしかなく、ほかのハンマーでも同じように設定しました。画面のPath欄を見ると、Hitにつながるような結果は1つしかなく、Missにつながる機会はいくつかの種類があります。モグラに当たった時は勝利を表すサウンドエフェクトを再生し、外れた時はシンプルな風切り音を鳴らします。
後でゲーム全体で敗北や勝利の状態を出せるように、スコアシステムやライフをつくる目的でHitやMissのイベントキューを追加しましたヒットした時はイベント Score_1up (スコア得点1)をトリガーさせ、ミスした時はイベント Life_1down (ライフ減点1)をトリガーさせます。
図05. ミュージックスイッチコンテナでHitとMissを実装
以上が『 Wwack-A-Mole 』(モグラ叩き)の基本機能です。ゲームのメカニズムが計画通りに動くようになったところで、ゲーム画面としてサウンドキャスターやプロファイラーを利用する方法を説明します。
サウンドキャスターがジョイスティック代わり、プロファイラーがゲーム画面代わり
ゲームパッドには4つのボタンWack01~04があり、これらのボタンが前セクションで説明したミュージックプレイリストをアクティブにします。各イベントの色をモグラの色に合わせてあるため、簡単に見分けることができます。例えば画面に緑色のモグラが出てきた時は、緑色のWack(叩き)ボタンを押します。
ゲームパッド部分の隣にゲームステート関連のボタンが2つあります。StartGame ボタンは誰もが知るサーカス音楽のミュージックセグメントを再生するだけです。これでゲーム全体がトリガーされます。音楽のイントロ部分でいくつかの空のイベントキューがトリガーされ、 Readme というオーディオバスに送られます。複数のオーディオファイルをファイル名を変えてイベントキューで順番に再生すると、ゲームの遊び方の文面(チュートリアル)をサウンドキャスター画面に表示できることを私は発見しました。各ファイルを2秒ほどの長さにすることで、音楽のテンポとぴったり合わせて表示できます。以下がイントロの時に順番に表示されるテキストです:
"Welcome // to Wwack a Mole // SMASH those events // and hit the moles // They will pop up randomly // and disappear quickly // So get ready //" (ようこそ // Wwack a Moleへ // イベントをヒットして // モグラを叩こう // ランダムに飛び出して // すばやく隠れます // さっそくはじめよう //)
このスクリーンショットで一番最後に表示されているイベントキュー MoleGenerator が、イントロが終わり音楽がはじまる時にアクティブになります。サウンドキャスターを見ると SkipTutorial (チュートリアルをスキップ)というボタンがあります。これを押すと音楽のオーディオファイルのシークを行い、イントロ部分を飛ばして MoleGenerator イベントのすぐ前のところから再生をはじめます。私が一番時間をかけなかったのが音楽だということに後から気づいたのですが、結果的に単純なWAVファイルをA点からB点まで再生するだけのインタラクティブでないサウンドトラックとなってしまいました。この点は私にとってゲーム開発のよい教訓になったと言えます。
図06. イベントキュー名でチュートリアル文を表示
ゲーム画面の表示内容を最適化するために、Advanced Profilerタブ(F6)でVoices Graph画面に不要なオブジェクトが表示されないようにしました。Master-Mixer階層のワークユニットWwackAMoleをオブジェクトフィルターで指定することで、Voices Graphに表示されるオーディオバスは Readme(ゲームのチュートリアル)、 Enjoy and Listen (ゲームの音楽)、そして Wack it! だけとなります。なおWack it!に入っているゲームオブジェクトは、プレイヤーが反応するものです。ほかにも InvisibleProfiler というオーディオバスがあり、カテゴリーが指定されずプロファイラに表示しないサウンドが入ります。例えばゲームシステム、サンプラー、SFX、アンビエンスなどです。
サウンドキャスターを見ると便利な情報がもう1セットあります。Switchesセクションに、モグラの出入り状況(UpOrDown)やアクティブなモグラ名(Mole)が表示されています。技術的にはボイスプロファイラー画面がなくても、サウンドキャスター画面だけでゲームシステムが成立するはずです。この後に私は難しい要素、ライフ、スコアをプロジェクトに追加していきました。プレイヤーに関係するグローバルゲームシステムはできるだけStatesで対応するようにし、プレイヤーに見せる必要のないローカルのゲーム機能にはSwitchesを使うようにしました。ライフ や スコア のしくみはまだ開発中で最終調整が終わっていないため、ここでは構築方法の詳細を説明しません。
TLDR;(要約)
まとめると、 StartGame イベントを押してゲーム音楽の入ったミュージックプレイリストをアクティブにすることで、このゲームがはじまります。ゲーム音楽は Enjoy And Listenというオーディオバスに送られます。
音楽ファイルのイントロ部分にある複数のイベントキューが、Actor-Mixer階層の無音のオーディオファイルをトリガーします。無音のオーディオファイルの目的は、ファイル名と同じ文字をボイスプロファイラーに表示することだけです。これらのテキストファイルは Readmeというバスに送られます。テキストとは、例えば"WWelcome to Wwac-A-Mole"や"Get ready"などです。
チュートリアルの文面がすべて画面に表示された後に、ミュージックセグメントの最後のイベントキューがトリガーされます 。この "MoleGenerator"というイベントキューがミュージックプレイリストをトリガーし、ミュージックプレイリストが Mole01、Mole02、Mole03、Mole04 、またはランダムな長さの無音セグメントをスポーンします。Mole イベントで、どのモグラをアクティブにするのか、そしてステータスが MoleUp (モグラ上)なのか MoleDown (モグラ下)なのかがシステムに伝わります。これが Hit(あたり)とMiss(はずれ)のシステムの基礎となります。Mole イベントは Wack It! というオーディオバスに表示されます。
サウンドキャスターに Wack01、Wack02、Wack03、Wack04 の4つのボタンが表示されます。ボタンを押すとそれぞれ Hammer01、Hammer02、Hammer03、Hammer04 というミュージックスイッチコンテナが再生されます。モグラの上下に応じてハンマースイッチでHitイベントまたはMissイベントが再生されます。例えば Mole01 のHitをアクティブにするためには、ボイスプロファイラーでMole01が表示された時に Wack01 を押す必要があります。ここで Wack02、03、04 を押してもミスとなり、 Wack01 を押したとしてもタイミングがずれて Mole01 が下にいってしまえば、ミスです。ヒットすると鐘が鳴り、ミスすると 風切り音 が鳴ります。
正しいモグラをちょうどよいタイミングで叩くというゲームのループです。外れるとやり直しとなり、飽きるまで遊べます。実験的な機能として、スコアやライフのStateに組み込まれた Game Over (ゲームオーバー)ステートとWin(勝利)ステートがあります。モグラをヒットするとスコアが1点増え、3回続けてミスするとライフが1つ減ります。曲が終わるまでモグラを1回も外さなければ、あなたの勝ちです。
今後の予定
このようにしてWwiseの中にゲームをつくることができます。単純だと思いませんか?そうとも言えないかもしれませんが、みなさんが理解してくださり、私のように自分の変わったアイデアをWwiseの中でつくり境界を打ち破る気になってくれたようであれば嬉しいです。結局は自分の技量の限界に挑み、その領域の不可能を可能にすることがすべてだと思います。これこそWwiseでゲームプロジェクトや『鏡の中の鏡』に取り組んでみて、1番よかった点です。型にはまらず考えて今までできなかったことに挑む気になりました。
枠にとらわれないWwiseの活用法といえば、私はAudiokineticコミュニティで名の知られたレッサ・シュヴァルツヴァルト(Ressa Schwarzwald)氏に大変感謝しています。彼女の最初のアイデアやクレイジーな試みへの愛情をなくして、私はWwiseの中にゲームをつくろうなんておかしなことを考えませんでした。ロボットオーケストラの指揮者である彼女は私のゲームをプレイして、当然ながらさらに一歩先を求めました。このゲームをiPadでTouchOSCを使ってプレイすることを思いついたのです。私は彼女のiPadとハンマーでやってみようと提案しましたが、不思議とこれはヒットしませんでした(笑)。しかし彼女は核心をついていると思いました。
『Wwack-A-Mole』はゲームオーディオ関係者の集まりで楽しいお遊びゲームとなりました。コペンハーゲンでゲームオーディオのクリスマスパーティーがあり、私がエンタメとして持参したところ、とても楽しんでもらえました。ゲームのプレイテストのよい機会となり、コアユーザの感想を聞くことができました。なかには私のやろうとしているアイデアが理解できてもゲームの遊び方が分かりにくく、全体的にコンセプトがまぎらわしいと言う人もいました。また業界内で 巨匠 として知られる方もパーティに来ていて(お名前は伏せておきます)、モグラの出入りが速すぎて叩けないということだったため、ヒットの時間を延長したシニアモードを私たちが実装したところ、結果的に勝ったのは彼でした!
このゲームはたくさんの可能性をまだ秘めていて、想像力さえあればさまざまな追加機能ができるはずです。タイトなスケジュールや日常生活の責任などに制約されるすべてのゲームと同様に、『Wwack-A-Mole』も未完成であり、発表しただけです。ゲームエクスペリエンスを向上させる機能が山ほど思いつきます。例えばサウンドトラックです。私はコンポーザーでサウンドデザイナーですが、皮肉にも一番手を抜いたのが、充実した音楽体験の確保でした。Wwiseでゲームデザインをしてプログラミングまがいのことに熱中するあまり、音楽をパイプラインの最後まで後回ししてしまい、締め切り直前の数時間でにわか仕立ての音楽をつくりました。多くのコンポーザーやサウンドデザイナーが身に覚えのある状況ではないでしょうか。私が思い描いているのはゲームプレイに完璧に対応するMIDI生成のサウンドトラックであり、テンポの変化や、サンプルから制作したインストゥルメントや、複数のレイヤーのインタラクティブ性などが欲しいです。アダプティブサウンドトラックをつくるソフトウェアとしてWwise以上のものはないと思うため、これを実装できなかったことは心苦しいです。今回はできるだけオープンソースのコラボレーション型プロジェクトにしたいため、あなたもゲーム制作のプロセスにぜひ参加してください。私のゲームWwiseプロジェクトは Githubで全面的にアクセス可能 で、プロジェクトを自由に変更したり改善したりすることは大歓迎です。サウンドトラック制作やサウンドエフェクトデザインをしたいですか?ぜひどうぞ!ハイスコアシステムの構築や、私が1/4ほどすすめたストーリーモードの続きをしたいですか?遠慮なくどうぞ。このようなゲームのクラウドソースにゲームオーディオコミュニティが一体となることはとても嬉しいです。
最後にもう1つ……
Wwiseの中にゲームをつくることができたため、これで終わりにしてもよいのですが、まだあります。実は当時Netflixで人気だったドラマ『 イカゲーム 』から発想を得た 別のゲーム をWwiseの中でつくりました。ドラマでは参加者がタイマーの制限時間内にゴールまで走ろうとしますが、動けるのは恐ろしいロボットが見ていない間だけで、見つかると撃たれます。恐ろしいですね…。
詳しくは書きませんが、『Wwack-A-Mole』よりもシンプルなしくみのゲームとなりました。ゲームのエンジンは『Wwack-A-Mole』と同じくInteractive Music階層の中にあります。スイッチトラックを巧みに利用して、ロボットが背を向けていて走ることができるのか、ロボットがレベル全体を見渡していてサウンドキャスターのWalkボタンを押すと危険なのかを見極めます。サウンドキャスターで Walk ボタンを5回押すと、プレイヤーは距離を1つ分すすむことができますが、制限時間内に20メートルすすむ必要があり、どちらも20個または60個の子のあるステートスイッチで稼働します。音楽が再開されるたびに音楽が少しだけ速くなるため、そのたびに緊張感が増します。
このプロジェクトは https://github.com/Gminorscale/Wwack-A-Mole/wiki でダウンロードできますので、ぜひプレイしてみてください。
みなさんも私のプロジェクトに刺激されてWwiseで奇抜な実験をつくり上げて欲しいと謙虚に願っていますし、つくったクレイジーなプロジェクトを見せてもらえるのが楽しみです。今回Wwiseの中の私の創造力は間違いなく広がり、普段とは違う角度からWwiseの機能を試すことができました。私たちサウンドデザイナーやオーディオテクニシャンは使うプログラムの機能に制約されることが多く、自分たちの目標を達成するためにカスタムコードを書いたり、追加のアドオンソフトを利用したりすることがよくあります。私は今回のプロジェクトでWwise以外のツールは一切使わずに、Wwise内だけでどこまでやれるのかを探りました。
ご質問、あるいは意見交換をしたい際は、ぜひTwitterでメッセージを送ってください。私のブログを読んでいただきありがとうございます。Wwonderfulな1日をお過ごしください。
コメント