UE4 デベロッパーのみなさん、こんにちは!Blazing Badger です。私達はドイツのフランクフルトを拠点とする小さなゲームスタジオです。Epic MegaJam 用に「Guardians」というゲームを制作しました。このたび、「Eye Candy and an Allegorithmic Award」を受賞しました。とても光栄です。エピックのご意見番ともいうべき、すべてのゲームジャムのエントリー作品をプレイした Michael Allar 氏からのお誘いを受けて、「ゲーム制作記録」なるものを書いてみました。お楽しみください!
キックオフ
会社設立の 2014 年 4 月から、Blazing Badger はデビュープロジェクトである AIPD に携わっています。開発も仕上げの段階に入った頃、幸運にも創造性のバッテリーに充電するという描写に値する Epic Mega Jam という素晴らしい機会に恵まれました。
初日は「巨人をどう扱うか」というテーマを具体化する方法について、ずっとブレインストーミングを続けました。その結果、2 つの方法に落ち着きました:小さい潜水艦と大きい鯨という、共生関係で絡み合う 2 つのキャラクターの導入です。同時に、典型的なゲームにもかなり依存しきっていました。
そして最終的には、Tempest (原作は Dave Theurer) に良く似た水中でのゲームに決定しました。1 週間で完成できるシンプルなもの、そして巨大な生物のために画面スペースを広く設けました。
技術的な基盤
Game Jam 用の短期プロジェクトではありますが、基盤は、ゲームフローを構成できるもの、そしてクレジット、結果画面などを後から追加できるしっかりしたものを作ろうと思いました。
ゲームは、いくつものに分かれているゲーム ステートが、シンプルなステート マシーンによってまとめられています。「メニュー」と「インゲーム」という 2 つの初期ステートを作って、中核となるゲームプレイ体験にすぐに取り掛かれるようにしました。クレジット画面だけでなく結果画面も後から追加しました。
異なるステート間のトランジションが明確になるので、特定のステートに必要なすべてのデータやアクタを簡単に初期化および整理することができます。これにより、ゲームを再度開始しなくても、早い段階で数ラウンドの再生が可能となりました。これこそ、「カスタマー」が「完成品」としてのゲームに期待しているものです。
いくつかのサービス機能に合わせて、Persistent Data 構造だけでなく Session Data 構造も設定しました。Session Data には、現在の得点などの「インゲーム セッション別の」情報が入っています。Session Data には、高得点などの「寿命の」情報が入っています。
ゲーム デザイナー達はこれらのデータ構造を使って、後にラウンドごとに自動消去または保存ゲームの中にシリアル化されるセッション データやパーシスタント データを追加することができます。
Level ジェネレータ
レベルは、空想のチューブを形作るプロシージャルに生成されたトラックに基づいています。すべてのゲームプレイ アクタはこのチューブの表面に沿って移動します。背景ジオメトリはこのチューブの外側に設置されます。
ゲームのほとんどの項目について言えることですが、プロシージャルなレベル ジェネレータに適用するイタレーションの回数や仕上げの程度についても、最初は分かりませんでした。つまり、必要に応じて、そのまま簡単に拡張できるように準備しておかなければなりませんでした。さらに、レベル生成の基本形式の中にはかなり速く実行しなければならないものもあるので、ゲーム デザイナーが敵のビヘイビアにかなり早くから取り掛かれるようにしておく必要がありました。
ここで、トラックのレイアウトを変えたとしても影響を受けない座標システムを定義することが重要でした。そこで、レベル トラックに沿って移動した距離およびチューブの角度と半径に基づいてアクタの位置を表すシステムを思いつきました。これによりゲーム デザイナーは、最終的なトラック レイアウトに関係なくシンプルで一定の座標を使って、敵のビヘイビア ロジックを実装できるようになりました。アクタの各ティックの終わりにこれらの座標をアクタの変形に変換する関数があります。
レベル生成を最初に行うと直線が出力されるだけで、時間が足りなくなった場合はそのままにしておくことができます。いくつか試してみると、波長の違うよく似た正弦波で調節された、大きな半径のシンプルな円になりました。つまり、チューブはグローバルでは非常に柔らかくに右に曲がり、ローカルでは「ランダムに」上下左右に移動します。
背景ジオメトリを設置するために、トラックを異なる長さのセグメントに分割します各セグメントには、セグメントの大部分を構成する「壁」などの主要な背景ジオメトリを割り当てます。その他の背景ジオメトリの種類も、セグメントを埋めるために使用します。他の種類の背景を追加する時間がありませんでしたが、既定のアセットでシステムは十分機能しました。
プレイヤー コントロール
プレイヤー コントロールは最初から非常にシンプルで直接的であり、それは Gardians のほとんどの機能でも同じでした。さらに、プレイヤー コントロールはゲームから受ける感覚が非常に大切なので、少々細工を施してみました: プレイヤーの船は、すぐに加速したり減速したりします。船は視覚効果として曲ったり傾いたりしますが、直接制御はしっかり維持されます。プレイヤーの船が巨大な鯨の周囲を回ると、カメラも若干ティルトして、すべてをさらにダイナミックに見せます。チームには「画面を狂ったように揺らす」係がいます。全体にインパクトを与えるために画面の揺れを加える人です。
手作業にしたくなかったので、すべてのゲームパッド ボタンを「炎」に、そしてすべての指向性の軸を「移動」にマップしました。従って、直観的に行えば、そのまま機能します。キーボード コントロールも同様に、複数のキーを「炎」と「移動」にマップしました。
時間が限られていたので、ゲームパッドとキーボードにも同じように使用した単一のコントロール スキームにこだわりました。ですが、初めてゲームがプレイされているのを見ると、プレイヤーは船をチューブの左上に動かすためにゲームパッドのサムスティックを左上に押す傾向が強いことに気づきました。予想していたことなので、もっと時間をかけて、コントロール スキームの他の可能性も検討すべきでした。
カメラ
カメラは、画面の真ん中でインゲームのアクションをとることを目標にしました。そして、スクリーン中の敵が潜んでいる部分をぼかさずに、プレイヤーの船と巨大な鯨を比較した大きさの違いを見せたかったのです。
アートとデザインの中間の要件となる都合のいい部分を見つけるために、インゲームでカメラ設定の調整を可能にするちょっとした「ツール」を作りました。
カメラ設定が無事できたと思ったら、1 つ問題がありました。プレイヤーが鯨の横にいる時 (+\- 90 度)、カメラは「完璧」なのですが、0 度または 180 度まで動くとプレイヤーの船がカメラの視野に入らなくなってしまうのです。我々はこの問題を、プレイヤーの角度に依存して、CameraMinimumPositionOffset と CameraMaximumPositionOffset を補間することで解決しました。
最終的にカメラはこのように動きます:
この部分のブループリントです (FishAngle が PlayerAngle):
プレイヤーが存在できる様々なステートの可視化は、時間制約のため、かなり簡単に対応しました。
通常のシーン テクスチャと歪んだシーン テクスチャを混ぜれば、スローモーション エフェクトが作成できます。0 と 1 以外のブレンド値でポストプロセスをトグルしたので、自動的にダブルビジョン エフェクトとなります。
プレイヤーがトラックに沿って進行する時、プレイヤーが存在する背景を徐々に変化していることを表すグレーにフェードおよび非常にわずかなシフト値の間の線形補間など、その他のポスト プロセス - デスの際にも同様です。次回はもう少しリソースを多く割り当てて、もっといろいろ挑戦してみたい部分です。
ユーザーインターフェース
UI は、非常にシンプルながらも、上品さにこだわりました。滑らかに洗練されて、かつ簡単に制作できる外観にしました。
UI 作成では、使用するフォントの選び方が重要となります。フォントは見栄えの良し悪しを左右する力を持っているからです。そこで、私達が求めているものを全部満たしている「Geo Sans Light」というフォントを選びました。
シーンは、メイン メニュー、ミッション結果メニュー、クレジット画面の合計 3 つとなりました。表示する内容は最低限に絞り、エレガントなフォントを使用することで、背景なしでも十分な見栄えがしましたが、ゲーム開始の瞬間から Guardians のインパクトを与えたかったので、ここに小さなメニュー レベルを追加しました。
ですが、初回のプレイテストで、それを Guardians で成し遂げることは非常に難しいこと、トラックが単なる直線でない場合は特にそうであることにすぐ気が付きました。この問題を解決するために、プレイヤーと敵が同じチューブ角度 (+/- 角度誤差) の時に見えるようになるウィジェット コンポーネントをそれぞれの敵に追加しました。
敵のデザインを効率良く作成する
敵は 3 種類にすることに決めました。敵はすべて親となる敵ブループリントを共有し、ここでヒットポイント / デス、移動、スポーン処理するブループリントによる登録 / 登録解除を行います。これにより、手間暇かけずに正確に敵を実装することができます。
基本となる敵 「ドローン」は、「Tempest」スタイルのシューティングでのゲームプレイの参加に必要な砲弾の餌食です。 トンネルの壁沿いの横の道をゆっくり動きます。
「ドジャー」はより多くの砲弾を受けることができ、ダメージを受けると頻繁にバレル ロールを実行します。プレイヤーは最低 2 回はその処理が必要で、強制的に再配置されます。
最後は数秒後に 2 つに分かれる「スプリッタ」です。子も 2 つに分かれ、無視された場合、プレイヤーのターゲットは最大 4 つになります。
さらに、ゲームが進行するにつれ、敵が増えるだけでなく、手強さも増すことにしました。プレイヤーが簡単に得点を加算できないようにするためです。ゲームの進行状況によって影響を与えるパラメータをそれぞれの敵に 1 つ実装しました。ドローンの場合は最大移動速度を速くしました。ドジャーはさらに遠くまで転るようにしました。そしてスプリッタは、タイム フレームが短くなっても分割するようにしました。
AI Director を単純化する
戦う相手の準備ができました。次は彼らの登場のさせ方です。私達は 3 段階を目指しました:スポーン位置は「ランダムではあるけど、無秩序ではない」と理解しておくこと。敵の種類の分布は、新しい敵が登場し、数も増えるので、時間が経つと変わること。敵の実数が徐々にプレイヤーを上回ること。
スポーン位置については、それぞれの敵のスポーン角度を完全にランダム化せずに、数秒ごとに「一般的なスポーン方法角度」を新しく決めて、その後で、その一般的な角度から敵のスポーンをオフセットすることにしました。その結果、見事なクラスタリング エフェクトとなりました。プレイヤーは、ゲームの開始時は一ヶ所に集中し、ゲームが終わりに近づいて敵の実数が増えても、そこらじゅうを気にすることができます。
スポーン タイマーは、ゲーム開始からの経過時間に応じて「次の敵までの時間」を計算するという、とても基本的な方程式で実装しました。いくつか定数を使って、ゲーム セッションが進むにつれて、「数秒ごとに敵 1 人」から「1 秒ごとに敵数名」に変化するように調整します。
大切なことを言い忘れていましたが、敵の分布方法は、新しい敵を追加し、ゲームの途中で「敵のクラス」配列に違う敵の分布を使って繰り返し埋めていきます。敵はスポーンされるたびに、シャッフルされて、エントリーがランダムに選択されます。
このような “敵に指示する” システムのデザインは、ゲーム デザイナーが得意とする分野です。 このトピックについては、様々な会議でとことん議論しました。詳細に興味をお持ちの方は、slideshare.net でご覧いただけます。
音楽&サウンド エフェクト
当初私達はゲーム音楽を作曲する時間があるか分からなかったので、背景の環境音だけでも質にはこだわりたいと思いました。Guardians では周波数スペクトラムの異なる部分を占める 5 種類のサウンド エフェクト ループを使用して、深海の音がまとめられています。これらの異なるループを混ぜると、時間と共にプロシージャルに調整もされるので、背景の環境音のムードが常に変わり続けます。さらに、豊富な単発のサウンド エフェクトを 1 分間に 2 回ほどトリガーすることで、環境音の繰り返しを減らしました。
Guardians の残りのサウンド エフェクトの大部分は商業目的のサウンド ライブラリのもので、それをカットして混ぜてぴったりになるように調整しています。運のいいことに、巨大な鯨を生きているように見せる恰好のサンプルを見つけることができました。映画「インセプション」の象徴的なホルン音のようなものが良かったので、「エピックの巨大な鯨モンスターのサウンド」にぴったりのシネマティクスのホルン音を使ってみました。
インゲームの音楽も作曲しました。リフの役目を果たすコード進行をベースにしたシンプルなアップテンポの電子音の曲です。バス ドラム以外のすべてのサウンドは、サウンド エフェクトと背景の環境音を考慮して、典型的なダンス トラックよりもソフトになっています。タイトル / メニュー トラックを作曲する時間はありませんでしたが、結果、密度の濃いインゲームのアクションとメニュー画面のリラックスした雰囲気のコントラストがはっきり表れたので良かったです。
背景アート
最初のステップは、ゲームのカラー パレットとビジュアル スタイルに関するムード ボード作りでした。短時間でできるだけ多くのアセットを作成するために、ゲームはシンプルでスタイライズドに保ちました。
背景のコンセプトは計画したカメラ角度のエンジンのスクリーンショット上にペイントされて、使いたいアセット、エフェクト、カラースキームを表示します。魚の群れと海藻などの一定のものはそのままで、レベルの間に背景全体を変化させたかったのです。この方法で、僅かなアセットを作成するだけで様々な背景に対応できました。残念ながら計画していたほどアセットは制作できなかったので、岩、藻、階層、魅惑的な光線の数々を選びました。
アニメーションのために、つるを高さに沿って正弦波でアニメートできるように UV しました。同じ UV グラディエントを使って下部に向かってアニメーションをマスクして、ベースであまりつるが動かないようにしました。揺れる動きの方向と強さは、収集パラメータを制御すれば、簡単に値が調整できます。全体的に、設定は非常にシンプルで見れば分かるようになっています。
動きがあまり同じにならないように、ワールド全体をパンするテクスチャ ベースのオフセットを追加しました。さらに、レベル生成時にインスタンス化したスタティック メッシュを使っているので、“PerInstanceRandom” をベースにしたランダム アニメーションの強度変化を追加しました。せっかくエピックが提供してくれている素晴らしいツールを使わない手はないですよね:)
巨大な鯨
この巨大な生物は、太古の昔から海を旅した、古代の鯨に似た巨大な海洋生物です。水の中はこの鯨を襲う危険な生物だらけです。そこで人類は、巨人の生き残りと思われるものを保護するためにユニットを送ります。
太古の生き物らしく、巨人の体のあちこちにはつるが伸びて浮いています。プレイヤーは鯨の頭を周回するので、この部分にはいろいろな形状とマテリアルを入れて、興味がわくようにしました。 巨人の口が開いて (AoE attack) ヘルスバーとして目が光るようにするアイデアも最初はありました (却下となりましたが)。
こちらが鯨のリファレンス ムード ボードです。
最終的なコンセプト
ほとんどの場合において頂点アニメーションを使用しましたが、非常に大きく、画面スペース内を広く動き回る鯨を考慮して、アニメーション用のシンプルなリグを作成することにしました。
プレイヤーの船
船は、水面下の世界に合うように、そしてキャラクター性を出すためにオニイトマキエイの形状を基にしました。オニイトマキエイは素晴らしいです。コンセプトを念入りに練ったら、できるだけ早くインゲームでテストできるようにおおまかな計画を立てました。
敵 - 邪悪なクラゲのサイボーグ!
「周囲から際立っている」敵をデザインするために、強烈な色とエフェクトを使いました。背景は青とシアンのままにして、敵にはそのコントラストを成す黄色から赤を配色したので、1 つの画面にはそれほど多くの色はありません。クラゲ サイボーグも登場させました。望みの動きの種類に応じて、それらに様々な頂点シェーダー アニメーション手法を使うことができました。
まとめ
Guardians の制作は非常に楽しい経験でした。まさにゲームそのもののような感じがして、結果にとても満足しています。この記事を読んでくださり、Guardians をプレイしてくださったみなさん、どうもありがとう!今後は、毎回のようには Game Jam に参加できませんが、Epic Mega Jam 2016 には参加します!
質問などありましたら、ツイッター @blabadger または fb.com/BlazingBadger までご連絡ください。
さようなら!
Blazing Badger チーム