ラバーダック・ゲームスが『イービル・ウィザード』のボス戦を開発するまで

GDC 2023 Best in Playを受賞したRubber Duck Gamesが、魅力的なボス戦の作り方を紹介する。このゲスト・ブログでは、チーム・メンバーのバンキとセルジオ・ワジスウォルが、デザイン、プロトタイピングからアニメーション、テスト、バランス調整、そして「 Evil Wizard」のビジュアル・エフェクトとオーディオの最終調整までの全行程をご紹介します。
読者の皆さん!私はRubber Duck Gamesのゲームデザイナー兼プロデューサーのバンキです。ユーモア満載のアクションRPG イービル・ウィザードがSteamとXboxで発売されたので、ボス戦の開発舞台裏をお見せしたいと思います。
邪悪な魔法使い 』はメトロイドヴァニアにインスパイアされたゲームで、敗北した "ラスボス "の立場となり、呪われたヒーローへの復讐の旅に出る。
この復讐のためのクエストでは、魅力的なピクセルアートの環境の中を進み、敵の大群に打ち勝ち、自分のものを取り戻す必要がある。主人公はかつて強力な魔法使いだったが、主人公の手による負け戦で力を奪われ、城に潜入して壊滅的な復讐を繰り広げるために、それぞれの力を取り戻さなければならない。
このゲームで最初に倒すべきヒーローは、強力な氷の魔術師ハイルガだ。このディープ・ダイブでは、彼女を例のボスとして使うことにする。
最初から始めよう。イービル・ウィザードの ボス(とすべての敵)をデザインするのはちょっと難しかった。プレイヤーは善人と戦っているとはいえ、敵として認識されるほど威嚇的であるべきだと考えていた。
ボスについては、有名なゲームのヒーローからインスピレーションを得て、参考にした。ヘイルガについては、『ウォークラフト』のジャイナから多くのインスピレーションを得た。
最初のステップは、スプレッドシートを用意することだった(ゲーム内のすべてのボスに使用したものだ)。そこには、キャラクターの主な特徴、メカニズム、そしていくつかの参考文献を詳細に記した。

メカニズムが設計されたことで、私たちは次のステップ、つまりプロトタイピングに進むことができた。
新しいボスのデザインをチームに提示する時が来たので、ミーティングに飛び込み、私はドキュメントを見ながら私の決定事項をいくつか説明した。
場合によっては、メカニックの開発が難しすぎたり、アニメーションの作画が複雑すぎたりすることもある。私たちは時間内に物事を終わらせようとするので、時間内に最高のボスを作るために考慮すべきことがいくつかある。
プロトタイピングに関しては、リード・プログラマーのディエゴ・オルドニェスが次のように語っている:ハイルガは『イービル・ウィザード』での最初のボスであり、人生で初めてボスのプログラミングをした。難しい仕事だとわかっていたので、プログラマーなら誰でもやるように、攻撃を単純なタスクに分割して別々にやることから始めた。このボスの攻撃は、弾丸を再利用することで簡単にできるものだった」。
「氷の弾丸と氷のミサイルの攻撃は、プレイヤーにとってまったく違うものに感じられる。一方はかわすのが簡単だが、もう一方は戦いの中でチャレンジとなる」と彼は続けた。"重要な違いは、攻撃コンポーネントがどのように氷の投射物をスポーンさせるかと、プレイヤーに投射される投射物の量である。簡単な調整で、システム全体を再利用して2つの異なる攻撃を見せることができた。ブリザード・アタックを始めるまでは、すべてうまくいった。
ヘイルガの試合では、何か新しい出会いをもたらしたかったし、風は面白いと思った。これはイービル・ウィザードでやってきたこととはまったく違っていたので、ゼロから始めなければならなかった。基本的なアイデアは、ランダムな方向から風を起こし、ダメージを与えるトゲだらけの壁に向かってプレーヤーを移動させるというものだった。この攻撃に対抗するには身を隠すのが一番なので、風よけとして戦場に鍾乳石をいくつも産み出す。氷の鍾乳石の陰に入ると、風がプレイヤーに当たらなくなる。
私たちはまず、私たちが使用するさまざまなシステムの管理を担当する攻撃コンポーネントを作ることから始めた。鍾乳石、ウィンドエミッター、ブリザードのVFXを使用した。VFXについては、このブログの後半でセルジオ・ワジスウォルが取り上げる。
鍾乳石は、サークルコライダーを使ってその中にランダムなポイントを取得し、その位置を使ってY軸にオフセットを持つ鍾乳石を作成する。コルーチンを適用し、Y軸を下げてオブジェクトを落下させる。鍾乳石の産卵が終わると、ウィンドコントローラーに移った。このコンポーネントは、円の縁を回転する長方形の形をした大きな扇風機として機能する。

ランダムな方向から風を吹かせる必要があるので、エミッターを中心に向けて、エリア内のすべてに影響を与える必要があった。ウインド・コントローラーは、風の回転、方向、位置を記憶するウインド・エミッターを備えている。コンポーネントを回転させると、エミッターがこれらの値を計算し、風(これは単なる方向と力である)に適用する。基本的にはVector3とfloat。
また、前述のようにウインドブロッカーによって風を遮ることもできる。このコンポーネントには、プレイヤーとの衝突をチェックするBoxCollider2Dがある。プレイヤーがウィンドブロッカーに近づくと、OnTriggerEnter2Dでウィンドブロッカーが有効になり、プレイヤーがコライダーから離れると、OnTriggerExit2Dでウィンドブロッカーが無効になる。これは、下の画像で選手とエミッターの間にあるシアン色の線で示されている。線が緑色の間、選手は守られている。

最後に、選手が風の力を受けて風の方向に動くようにする必要があった。そのためにWindReceiverコンポーネントがある。風の強さと方向性をチェックする。この情報は、選手からウインドレシーバーに向かってレイキャストを行うことで収集される。そして、その情報をもとに、ウインドエミッタがレシーバーに衝突しているかどうか、どの程度の力で、どの方向から衝突しているかを知ることができる。すべての情報を入手したら、ムーブコントローラーを使って風の力を加え、必要な方向に選手を動かす。
ディエゴが最初の攻撃を仕掛け始めたとき、私はヘイルガにある行動を与え始めた。
イービル・ウィザードのAIには、ビヘイビア・デザイナーという非常に便利なアセットを使った。お勧めしきれない。プログラマーはメカニクスに取り組み、デザイナーはそれをキャラクターのビヘイビア・ツリーに配置する。基本はここで学べる。
これがヘイルガの行動ツリーだ:

大きな木だが、ビビることはない-見た目より簡単だ。
基本的には、ツリーの最初にいくつかのタスクを使ってバトルをセットアップした。例えば、ボスを最初のフェーズにセットし、イントロアニメーションを再生し、いくつかの変数をリセットする。

これらのタスクは戦闘の最初にしか実行されないので、次の画像にあるように、実際のボスの挙動を持つリピーターを追加した。

ボスの行動の優先順位は常に健康である。これによって、ボスが別の局面に移るかどうか、あるいは死ぬかどうかをコントロールすることができる。そこでまず、ボスの体力が75%以上あるかどうかを確認する。もしそうなら、第1フェーズのタスクであるアイススパイク、アイスミサイル、スノースライム(ボスのミニオン)の召喚を実行する。ボスの体力が75%以下になると、ツリーは画像下部のセレクターに移動し、2番目のフェーズに対応するタスクを実行する。
次のステップに進む前に、このような大きなビヘイビアツリーを整理するクールな方法である、外部ビヘイビアツリー機能について触れておきたい。
3つのボックスが付いたアイコンは、外部ビヘイビアツリーである。

外部ビヘイビアツリーは、コード内のメソッドのようなものだと考えてください。ゲームのすべてのロジックのあちこちでメソッドを呼び出し、それぞれの場所で同じコードを実行しますが、そのコードは1か所にしかありません。そのロジックの中で何かを変更しなければならない場合、そのメソッドのコードを変更すれば、そのメソッドが呼び出されるすべての場所で変更されることになる。ここでも同じだ。外部ビヘイビアツリーには、例えば "スノースライムを召喚する "といった、特定のアクションを実行するためのビヘイビアが含まれています。
外部行動ツリーに入ると、こうある:

ボスが同じ攻撃を何度も繰り返さないか、戦場にミニオンが多すぎないかをチェックし、ミニオンを召喚したり、ハイルガのボイスラインを流したり、ボスをアイドル状態にして終了したりするミニ行動ツリーのようなものだ。
一度に戦場に出せるミニオンの量を変更したい場合は、この外部ビヘイビアツリー内のタスク「敵の種類量チェック」で変更するだけでよく、ミニオンを召喚するために使用するツリーのすべての部分で機能する。
ヘイルガの制作にあたり、我々のリード・アーティストであるルーベン・ゴメスは、既存のキャラクターを参照し、プレイヤーに認知してもらうという前提でスタートした。
今回は、(前述のように)『ウォークラフト』のジェイナと『アナと雪の女王』のエルサをキャラクターとして参考にした。
これがルーベンのコメントだ:
「その前提を念頭に置いて、私はまずヘイルガのデザインから始めた」とルーベンは言う。"それぞれのリファレンスの服装やヘアスタイルからいくつかの特徴を取り出し、非常に小さなピクセル化されたスプライトで簡単に認識できるような要素を取り入れ、残りを想像力(AIは使わず、ただ、私が子供の頃に使ったのと同じ、人間の想像力)で埋めました。"

アニメーションでは、フレーム間の滑らかさを失うことなく動きを速くする必要があったので、各キャラクターのアクションをより速く反復することで時間を稼ごうとした。私たちは常に最終バージョンから始め、いくつかの要素を再利用し、アンチエイリアスを避けることを意図して、最も近い補間を使用してアニメーションの各フレームごとにキャラクターの各部分を切り取り、再配置し、拡大縮小し、回転させる。
その後、動きを素早くテストし、同じように調整した。

アニメーションの原案ができあがると、各要素を洗練させ、空いたスペースを埋め、ディテールを加えていった。
各フレームの最終バージョンは次の画像で見ることができる。

アニメーションを作りながら、ボス戦のテストとバランス調整を進めた。そのために『コンバット・ゾーン』というシーンを作り、ボスや敵、呪文などのテストに使った。基本的には、実際のゲームに触れることなく、テストに必要なすべてのツールや機能を備えた小さなエリアだ。
コンバットゾーンのシーンでキャラクターをテストしたときの、初期のハイルガのボスはこんな感じだった:


最終的に、動作、機能性、難易度に満足したところで、実際のゲームにヘイルガを組み込みました。

Hailgaのビヘイビアとアニメーションが完成したので、ボスのアニメーションを統合するために AnimatorImporterを使って、ボスのアニメーションを統合し始めた。これを使えば、ほんの数ステップですべてが完了する。
そこでVFXアーティストのTekyが登場した。持って行け、テッキー:
やあ!Sergio Wajswol (a.k.a.Teky)、Evil Wizardのプログラマー兼VFXアーティスト。
HailgaのVFXは、チームにとって最初のボスであっただけでなく、ゲームにおける私の最初の仕事のひとつでもあったので、本当にやりがいのあるものでした。ボス戦では、少なくとも1回の攻撃につき1つのVFXシークエンスが採用されている。
戦いのピークのひとつは、最後のフェイズ移行で、ヘイルガが怒って邪悪な魔法使いに向かって氷のビームを放ち、戦場を凍りつかせる場面だ。

これは、マジックを起こしたピースをバラバラにして見せるのに、とてもいい効果だと思う。そのために、トランジションを2つのVFXに分けた:氷のビームと床の凍結。
最初の作品では、ディエゴが攻撃のプログラミングを終えると私の仕事が始まり、通常は見栄えのするプレースホルダー(この場合は細長い長方形)が付いてくる。ここから、私は自分の道具箱の中にすでにあるとわかっていた道具を使って飛び込んだ。でも、開発開始直後だったので、そういうものが足りなかったんだ。過去にUnityのLine Rendererコンポーネントを使って、スクリプトで制御された任意の2点間の線をレンダリングしたことがあった。

上にあるように、まだまだだ。私がVFXですぐに理解したことは、(古典的な哲学とは逆に)"全体は部分の総和である"ということです。これは、1つのシェーダーや1つのパーティクルだけでなく、複数のシステムで望みの効果が得られることを意味する。
次に、エフェクトをもっとビームのように見せる必要があったので(そしてあまり固くないように)、これを実現するためにシェーダー・グラフを弄った。簡単に説明しよう。
私が望んだことを達成するために、シェーダーには3つの主要な部分が必要だった。まず、水平のミラー・グラデーションに過ぎないテクスチャ(次の画像でMainTexとして見ることができる)を以前に描いたものを使った。Pow "ノードを使えば、ビームの幅を簡単にコントロールできる(テクスチャはそれ自身を乗算し、グラデーションなのでビームを縮小する)。

次に、Tiling And Offsetノードでアニメーション化したSimple Noiseを2つの目的で使用した:
ある部分だけビームを溶かす(常にパブリック変数で制御される)
ビームのUVを変更し、歪んで見えるようにする。

続けて、出来上がったビームにHDRカラーを掛け合わせ、発光をコントロールした。最後に、ステップ・ノードを使ってビームのエッジを取り、乗算して異なる色にし、ビームの中心を際立たせた。
出来上がると、このように色や変数を変えて遊べるようになった。

しかし、ビームは何もないところから投げられているのだ。
そこで、パーティクルの助けを借りて氷の球体を作り、ビームのキャスティングポイントにした:

最後に、ビームを他のエリアと統合するために、ビームに沿った粒子が必要だった。

この2番目の部分は短いが、より厄介だ。メインエフェクトを完成させるためには、凍結していない床と凍結した床という2つのテクスチャーの間を、ビームの軌跡と速度に沿って放射状の角度で行き来できるようにする必要があった。
スピードを合わせるために、我々は通常のスクリプトを使って、0から1の変数、つまり現在の梁の回転に応じて床をどれだけ凍らせるか、に対して梁のスピードを制御した。テクスチャをレープするには、短いシェーダーが必要だった。放射状のグラデーションと実際のレルピングを得るために、シェーダーを2つの部分に分けた方法を見てみましょう。

以下は、UV位置を考慮し、0から1まで正確に計算した、放射状のグラデーションの計算式である。これにより、ビームの動きがフリーズした値に同期する。

現場はこんな感じだ:

このシーンを完成させるために、私たちはすべてを足し合わせ、最終局面への移行として、またこのボスの攻撃の1つとしても機能する、クールなエフェクトを実現した。
すべてが完成した後、このゲームの作曲家であるハーコン・ダヴィッドセンが最後の仕上げを行った。ここで聴くことができる。そしてもちろん、声優のブリーナ・マクドウォールが、ヘイルガに声を与える素晴らしい仕事をした。
このブログを楽しんでいただけたなら幸いである!
SteamまたはXboxでEvil Wizardをチェックして、Hailgaのボス戦を体験してみよう。開発者直伝のMade with Unityストーリーはこちらから。
