December 23, 2015

Unreal Match 3 の制作を振り返って

作成 Lauren Ridge

Unreal Match 3 は Android と iOS 向けにエピック ゲームズが新規リリースしたアプリケーションです。このゲームは、そもそも今年 4 月の Epic Friday プロジェクトとして始まったものです。当初、このゲームは主に Learning resources (学習リソース) チームのメンバー数名で制作されていました。このチームは、エピック内でトレーニング教材作成を担当する小規模チームです。

弊社の学習リソース サンプルの多くはブループリントのみで制作されており、それでもかなりの価値はありますが、リソースを充実させるために、もっと多くの C++ サンプルが必要であることを理解していました。ブレイン ストーミングを行う中、Tom Looman が C++ でサバイバル ゲームの制作を開始しました。そこで示されているゲームのスタイルやエンジン機能の両面で我々は別の方向性に進みたいと考えました。Match 3 (3 つ合わせ) のようなパズルゲームを採用することで、使用するルールを決めたことになり、アンリアル エンジンでの実装方法を示すことに重点を置くことができました。

Trello

最初のブレインストーミングのリストには、当初のサンプルには含めなかった AI やデータ テーブルなどの機能があります。このプロジェクトが実践的なサンプルになることを意図しており、新しい機能は将来的に追加されます。こうした機能の一部は、代わりに他のサンプルに入れられる可能性があります。 

Unreal Match 3 のコーディング

プロジェクトの出発点で Richard と私のアイデアがまとまった後、私のオリジナルのプロトタイプにコードを追加し始めました。コードを記述する際に、守った 3 つの主なルールがあります。 

ひとつめのルールは、コードをできる限り汎用的なものにするということです。私のオリジナルのグリッドのコードでは、正方形のグリッドを前提とし、Match 3 モードだけが必要でした。最終的な Unreal Match 3 ゲームのコードには、正方形ではないグリッドを作成するパラメータや、プレイヤーに 4 つ、5 つ、6 つやさらに多くのタイル合わせをさせるパラメータがあります。開発中にマルチプレイヤー対応も考えましたが、最終的にはこうした作業範囲をサンプルに入れるのを取りやめました。 

これ以外の 2 つのコード設計上の決定事項は、アンリアル エンジンにおけるオブジェクト指向プログラミングについてです。強力な組み合わせとして、Game Instance、 Game Mode、および Player Controller のようなフレームワーク クラスを使用したいと考えました。Game Instance クラスはゲーム全体の保存を処理するだけでなく、モバイル サービスに情報を送ります。Game Mode は、残り時間など Match 3 ルールを記録します。我々は、デザイナーがブループリントでどういったものを接続したいかを念頭に C++ のクラスを記述しました。ただし、後になってアート工程になると、戻ってブループリントの API をさらに拡張しました。

自分たちの他の仕事の合間にコーディングをやって約二か月後、他の学習リソース サンプルから借りたアートとマーケットにある無料パックとを合わせて、ゲームに肉付けしました。 

PreArt

HUD のアートとランドスケープ モードがないことがわかります。爆弾は実際にはボックスでした!

アート工程 (とそれ以降)

この時点でチームを増員し始めました。結局、プロジェクトが終わるころまでには、Unreal Match 3 にパートタイム で 6 名が 約 6 か月間関わっていました。アーティストの Mike がこのゲームのために新しいテクスチャを数日で作成してくれました。オーディオ エンジニアの Joey は格好いいサウンドを 2 日間で手早く仕上げました。 アートとデザインの工程が、プロジェクトを一段とゲームらしいものに変えてくれるのを見るのは実に素晴らしいことでした。

ゲームが進化するにつれて、自分たちが複数の C++ クラス (および複数のブループリント) でゲーム ロジックを維持していて本当によかったと思いました。こうすることで、例えば、Wes は Bomb Bar Widget ブループリントの作業を行い、一方 Alan は様々な種類の全タイルに対して爆発エフェクトを作っていました。誰かが一時作業を止めて、自分の作業分をチェックインして、他の誰かが作業できるようにするなどの問題に出くわしたことはほとんどありませんでした。

継承とクラスの内訳のセットアップ方法の目標を示すアートとデザインの工程の例が二つあります。 

  1. C++ では、ベースの Tile クラスは爆発可能かどうか、タイルが落ちたときのアニメーションの保存、および選択されたときにゲームのグリッドに折り返し報告するなどのタスクを処理します。ブループリントの Tile クラスはここから継承して、フローティング スコア表示をスポーンするなどのベース エフェクトを付け加えます。最後に、こうしたタイル タイプに対して特殊なビジュアル エフェクトを追加する Bomb、 Gem、 Block Blueprint の各クラスがあります。このように、ビジュアル エフェクトやオーディオ エフェクトは主にブループリントで処理されます。一方、ベースとなるゲーム ルールや、頻繁に発生する事象 (タイルのアニメートなど) は C++ で処理されます。
  2. プロジェクト全体を通して、ブループリントのネイティブ イベントやブループリントで実装可能なイベントを使いました。例えば、オーディオ工程がほぼ終わった後、Joey が着地するタイルのサウンド