Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 自作ゲームでのゲーム制作事例解説(前編)

C88で自作ゲームの体験版を頒布させていただきました。

今回は以前まで作っていたゲーム基盤を軸にほぼゼロから作り直しており、実質的に8割以上は別物となっています。

折角色々な事をやっているので、実際のゲーム制作事例の解説をしたいと思います。

 

今回制作しているゲームが2.5Dのいわゆる横スクロールシューティングゲームタイプとなるのですが、UE4における2.5Dシューティングゲームの制作方法については確立出来たかなと思っています。

今回もC++は一切使用せずに全てブループリントのみで完結させる事が出来ました。

f:id:alwei:20150820161740j:plain

 ゲームの進行管理はすべてマチネをベースに

マチネは一般的にシネマティックなカットシーン制作に使われると思いがちですが、実はそんなことはありません。特に今回のようなゲームの進行がリニアに進行するようなゲームではとても便利な仕組みとして使う事ができます。

f:id:alwei:20150820162619j:plain

約5分のタイムライントラック内に入っているほとんどが"Event Track"です。

Event Trackはマチネの進行に合わせて、様々なイベントを指定したタイミングでレベルブループリント内に発生させます。

f:id:alwei:20150820162918j:plain

今回は主に、"メッセージのフェードイン"、"メッセージの切り替え"、"メッセージのフェードアウト"、"敵の出現"、"BGMのフェードインアウト"を行なってきました。

メッセージに関してはUMG上で演出のアニメーションなどを作成し、特定タイミングで再生して、再生のたびにメッセージタグをインクリメントしていき、新しいメッセージを再生していくという具合です。

f:id:alwei:20150820163605j:plain

メッセージデータはデータテーブルになっています。データテーブルは構造体を定義し、自由なデータ構造のデータを管理する事ができます。またCSVとしてインポートする事が可能なので、Excelのように万能データ管理システム上で作成したものも使用が可能です。今回はタグ番号と実際のメッセージテキストだけですが、後からテーブルも追加できるので、使用する画像を番号指定で切り替えたりする事ができます。

f:id:alwei:20150820163956j:plain

あとはウィジェットブループリント内でテキスト情報をデータテーブルから取得するのみです。ここでは毎フレーム処理が走る、テキストのバインディング内でやっていますが、かなり無駄だと思うので出来ればイベント発生時にテキストを受け取るような方式にした方が良いです。とは言っても大きな処理負荷になるわけではないのですが。

f:id:alwei:20150820164308j:plain

※実際の表示例

あとはマチネの進行に合わせてイベントが発生するとどんどんテキストが切り替わっていきます。フェードのアニメーションなどはUMG内でしっかりとつけておきます。セリフを差し替えたくなった場合にはデータテーブルを修正するだけなので、簡単に修正ができます。

敵の出現もマチネとデータテーブルから

シューティング系のゲームでは敵の出現情報を上手く管理してやる必要があります。

f:id:alwei:20150820164800j:plain

プレイヤーはこのような箱の中に存在しているのですが、周りにはターゲットポイントアクターを沢山置いておきます。これが敵の出現ポイントです。

f:id:alwei:20150820165111j:plain

ターゲットポイントアクターの位置をレベルブループリント上で配列に格納しておきます。この配列を参照してどこから敵が出現するのかを決めておきます。

f:id:alwei:20150820165313j:plain

そして敵の出現もデータテーブルで管理します。出現ポイント、出現エネミー、出現数を設定しています。現在はまだオプションが少ないですが、場合によっては思考AIなども設定できればいいと思います。

f:id:alwei:20150820165528j:plain

あとはマチネで指定した敵の出現イベントが送られてきた際に、メッセージと同じようにデータテーブルから値を取得できるようにします。取得した情報を使って、SpawnActorで敵を生成します。

f:id:alwei:20150820165801j:plain

ここでひとつ知恵を絞ります。SpawnActorでは汎用クラス名を指定するため、引数を追加する事ができません。なので、初期化とは別に追加したい情報を呼び出すインターフェース関数を呼び出します。

ここでは"Add Enemy"というインターフェース関数を呼び出していますが、この関数は後からその敵を追加で出現することができるように指定が出来ます。これはSpawnActor単体ではできず、更に全ての敵が同じ処理を持っているわけではないのでインターフェース関数として呼びだしています。インターフェース関数を持っている敵のみが正常に実行できるという流れです。

背景の動きもマチネ

実はこのゲームではカメラは一切動いていません。じゃあどうやって背景が動いているように見えるのか?

f:id:alwei:20150820170859j:plain

実はこれ、マチネの"Movement Track"を使って、背景のスタティックメッシュ全体が時間に応じて動いているわけです。ダイナミックなカメラ演出も可能です。

なぜこうなっているかと言うとプレイヤーや敵の動きはカメラの動きによって変えたりはしたくないからです。そこを動かしてしまうとあたり判定が上手くとれなかったり、面倒な事が沢山起きます。なので、プレイヤーやカメラ、敵もみんな限られた範囲内で動くようになっているのです。

マチネの汎用さと強力さ

今回はシューティングタイプのゲームでのマチネの相性の良さを解説してみました。データテーブルと併用する事により、リニアなゲームならこれで簡単に作成ができることでしょう。データテーブルの調整により簡単な調整もできますし、非常に便利です。

 

次回は少し小回りの効いた部分の解説をしてみたいと思います。