Unreal Match 3 は Android と iOS 向けにエピック ゲームズが新規リリースしたアプリケーションです。このゲームは、そもそも今年 4 月の Epic Friday プロジェクトとして始まったものです。当初、このゲームは主に Learning resources (学習リソース) チームのメンバー数名で制作されていました。このチームは、エピック内でトレーニング教材作成を担当する小規模チームです。
弊社の学習リソース サンプルの多くはブループリントのみで制作されており、それでもかなりの価値はありますが、リソースを充実させるために、もっと多くの C++ サンプルが必要であることを理解していました。ブレイン ストーミングを行う中、Tom Looman が C++ でサバイバル ゲームの制作を開始しました。そこで示されているゲームのスタイルやエンジン機能の両面で我々は別の方向性に進みたいと考えました。Match 3 (3 つ合わせ) のようなパズルゲームを採用することで、使用するルールを決めたことになり、アンリアル エンジンでの実装方法を示すことに重点を置くことができました。
最初のブレインストーミングのリストには、当初のサンプルには含めなかった 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 をさらに拡張しました。
自分たちの他の仕事の合間にコーディングをやって約二か月後、他の学習リソース サンプルから借りたアートとマーケットにある無料パックとを合わせて、ゲームに肉付けしました。
HUD のアートとランドスケープ モードがないことがわかります。爆弾は実際にはボックスでした!
アート工程 (とそれ以降)
この時点でチームを増員し始めました。結局、プロジェクトが終わるころまでには、Unreal Match 3 にパートタイム で 6 名が 約 6 か月間関わっていました。アーティストの Mike がこのゲームのために新しいテクスチャを数日で作成してくれました。オーディオ エンジニアの Joey は格好いいサウンドを 2 日間で手早く仕上げました。 アートとデザインの工程が、プロジェクトを一段とゲームらしいものに変えてくれるのを見るのは実に素晴らしいことでした。
ゲームが進化するにつれて、自分たちが複数の C++ クラス (および複数のブループリント) でゲーム ロジックを維持していて本当によかったと思いました。こうすることで、例えば、Wes は Bomb Bar Widget ブループリントの作業を行い、一方 Alan は様々な種類の全タイルに対して爆発エフェクトを作っていました。誰かが一時作業を止めて、自分の作業分をチェックインして、他の誰かが作業できるようにするなどの問題に出くわしたことはほとんどありませんでした。
継承とクラスの内訳のセットアップ方法の目標を示すアートとデザインの工程の例が二つあります。
- C++ では、ベースの Tile クラスは爆発可能かどうか、タイルが落ちたときのアニメーションの保存、および選択されたときにゲームのグリッドに折り返し報告するなどのタスクを処理します。ブループリントの Tile クラスはここから継承して、フローティング スコア表示をスポーンするなどのベース エフェクトを付け加えます。最後に、こうしたタイル タイプに対して特殊なビジュアル エフェクトを追加する Bomb、 Gem、 Block Blueprint の各クラスがあります。このように、ビジュアル エフェクトやオーディオ エフェクトは主にブループリントで処理されます。一方、ベースとなるゲーム ルールや、頻繁に発生する事象 (タイルのアニメートなど) は C++ で処理されます。
- プロジェクト全体を通して、ブループリントのネイティブ イベントやブループリントで実装可能なイベントを使いました。例えば、オーディオ工程がほぼ終わった後、Joey が着地するタイルのサウンド エフェクトを作りたいと言いました。タイルが着地したときに、コードで呼び出されるブループリントで実装可能なイベントを私が追加すると、Joey は迅速にこのエフェクトをブループリントで接続し、試すことができました。
Unreal Match 3 のデザインとビジュアルの工程で、成績表、ランキング表、広告、アプリ内課金などのモバイル サービスを接続しました。幅広いモバイル デバイスに対するテストも開始しました。
このような作業は、我々にとってある意味興味深く、難しい問題をもたらしました。アプリ内課金についてはざっと見直して終わらせました。最終的なプロジェクトで、ゲームプレイに影響を与えることなく課金プロセスの流れを示したかったからです。こうした作業は、私のお気に入り部分になりました。アートやオーディオのスタイルが違うと、ゲーム全体の雰囲気が変わるということを実際に示したからです。
ランキング表や成績表については、当初はオンライン サービスが権限を持ち、ハイスコアのセキュリティを最大限にする本格的なゲームのセットアップを用意しました。これは理想的なセットアップです。しかし、議論を重ねた後、ローカルとオンラインのシステムとの間で最高スコアと成績レベルを使用することでオフラインでプレイすることを認めるシステムにしました。
最後にモバイル デバイス フロントで、幅広いデバイスをテストしてよかったと思っています。早い段階で考えなかったエッジケース シナリオが明らかになったからです。デバイス プロファイルをかなり使って、幅広いデバイスでゲームの見た目を損なうことなく、可能な限りパフォーマンスを上げる努力をしました。
うまくいったこと
Unreal Match 3 プロジェクトに関わったのは素晴らしいことでした。アンリアル エンジンを使っている方々にとって役立つ学習ツールになればと思います。これはモバイルのサンプルですが、C++ / Blueprint の分け方、イベント駆動の UI、Paper 2D のセットアップは多くのプロジェクトに適用することができます。
- 利用可能なものを使用して、チームのスキルに合わせてプロジェクトの範囲を決めました。どちらかというとプログラミング側に立っている自分としては、プロジェクト計画時に 2D ゲーム スタイルに気持ちが傾き、そこを出発点に開発が進みました。我々は本業の傍ら作業する小規模チームであったため、作業範囲を狭めて達成可能なものにしたことが結局は効果的でした。
- Unreal Match 3 の作業に関わることは、「ストーン スープ プロジェクト (ポルトガルの民話で、きっかけを作り協力を集めて素晴らしいものを作り上げていく物語)」のようなものだと冗談交じりに言われました。つまり、プロジェクトを完成に一歩近づけるために誰もが自分ができることで貢献したということです。学習リソース チームはこのプロジェクトの主要メンバーでしたがアート、サウンド、テストに関しては社内全体で協力し、素晴らしい体験になりました。
- ゲーム制作の傍ら、ライブストリームを収録し、UI デザインからフォースフィードバックまでプロジェクトのセットアップを説明するドキュメントを作成しました。
- それ以上に、こうしたプロジェクト一式を制作することは、開発における障害や、二つの機能を最適に機能させる方法を見つけるのに役立ちました。こうして習得したものを将来作成する多くの学習リソースにも盛り込みます。
- Wes がプロジェクトについて語った内容を気に入ったので、そのまま引用します。「これは我々にとっても学びのプロセスでした。アンリアル エンジン 4 に関して我々の誰も完璧とは言えません。皆さんと同じように日々学んでいるのです。プロジェクトを構築しながら、さらにエンジンに触れて、作成したものをエンジンにエクスポーズしました。それに対してプロセスとパイプラインを改善するステップを既に講じています。最も効果的な学習方法は、何かを作り始めて、構築しながら、必要に応じて学ぶというものです。」
- 全員が自分ができるときに、できることを行ってプロジェクトに一生懸命取り組みました。主要なスキルセット以外は役割を定義しませんでした。これは時にちょっとした問題を引き起こしたものの、プロジェクト全体に対する当事者意識を生み出すことにもつながりました。
我々が学んだこと
これは、アンリアル エンジン コミュニティのための学習リソースであるにも関わらず、我々も制作中に多くを学んだといってよいでしょう。
- プロジェクトを進めるにあたり、役割を定義しなかったため、ゲームプレイ デザインの決定、アート スタイルの問題、その他の話し合いの解決にあたり、やりにくいこともありました。誰もが意見を持つことは確かに素晴らしいことですが、プロジェクトを推し進めるために責任者の決断が必要になる時もあります。ゲーム デザインのドキュメントも多いに役立ちました。教える側のものがありましたが、全体的なゲームプレイの計画に多くの詳細を用いることができました。
- かなり早い段階でゲームはプレイ可能な状態になりましたが、バグ修正とテストの最後の一押しで、シッピングに近づくにつれて熱意が若干衰えました。こうしたことは、このゲームやチームに限ったものではなく、「シッピング前にやることはあとわずか」と思ったときに注意すべきことです。
- UI のスケーリングは、修正やテストに多くの時間を費やした領域です。その理由の一部として、一般的な修正をしてから、デバイス固有の修正に範囲を狭めるのではなく、最初に個々のデバイスに対する変更を行ったからです。最適化と同様に、UI のスケーリング (および一般的なデバイス固有の修正) は、一般的なものから固有なものへと作業を行い、小さな段階を追って進めます。
- 多くのタイルや UI テクスチャを作成したアーティストである Mike は、他のプロジェクトで多忙であったため、時間があればもっとイタレーションしたのですが、アートにゲームを合わせるのではなく、結局ゲームをアートに合わせることになりました。ここで学んだ主な内容は、チーム外の人と共同作業する場合、コミュニケーションが鍵を握るということです。チーム内で通じる表現や期待が必ずしも伝わらないからです。
Unreal Match 3 のトリビア
- Samples QA がプレイしたゲームの数:1,979
- 非公式 QA / Unreal Match 3 ファンクラブがプレイしたゲームの数:101,979
- 開発中に食べたリング状ケーキの量:20 個 (そのうち 4 個がグルテン フリー)
- 全体として最もポピュラーなマッチモード:Match 2
我々がこのプロジェクトの開発を楽しんだように、皆さんに楽しんでいただけたらと思います。多くの付属ドキュメントと合わせて主要なサンプルを完成させたのは我々にとって初めてのことであり、その過程で楽しくプレイできるゲームができました。
Learn (学習) タブ、Google Play、そして近い将来、 iOS App Store でこのゲームをチェックして、フォーラムにご意見をお寄せください。