【UE4】一日半でゲームを〇本作った話

# はじめに

[Unreal Engine 4 (UE4) その3 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ue4_tre) 12日目担当の kakuarinan です。

本記事では、先月のぷちこんゲームジャムで作ったゲームを基に、UE4で手早くゲームを作るコツをまとめました。

私自身UE4初心者なので全然難しいことは書けませんが、ゲームジャムやコンテスト、ゲームのプリプロ版制作の際に少しでも参考になれば幸いです。

# ぷちコンゲームジャム

 [「UNREAL FEST×ぷちコン 冬のゲームジャム祭り！」](https://www.unrealengine.com/ja/blog/how-to-join-unrealfest-gamejam) という、UNREAL FEST EXTREME 2020 WINTER の最後に開催されたゲームジャムに参加しました。

ゲームジャムのテーマは「あつまる・あつめる」でしたが、テーマが発表された瞬間から「ミニゲームをあつめたい！」と閃いてしまったので、一人で __「時間内にとにかくたくさんのゲームを作る大会」__ を勝手にやっていました。

土日に完徹をしてひたすら作った結果、 __約一日半で５本__ のゲームが完成できました。さらに誉れ高きおかず賞までいただけて大満足です。

[Youtubeリンク 「コインをあつめるゲーム　あつめました」](https://www.youtube.com/watch?v=wbhEbNts6nc)

![title.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/68d0c3da-af54-9c3c-14b3-c16eaf149cbb.png)

ジャンルはこんな感じでばらばらです。

1. サードパーソンテンプレート改造ゲーム
2. 探索ゲーム
3. マ〇オ風横スクロールゲーム
4. 奥方向ランゲーム
5. フライトゲーム

時間的な内訳としては、全ゲーム共通処理に9時間、ゲーム実装に3時間×5作品、くらいの配分です。最初に共通処理にがっつりと時間を割くことで各ゲームの実装量を最小限に抑えました。

ここからは共通処理とゲーム部分に分けて、UE4の機能やこだわりポイントを紹介したいと思います。

# 共通処理（UE4の便利な機能紹介）

## 足音・足元エフェクト（アニメーション通知とインターフェイス）
割と最近に永続無料コレクションになった[「Niagara Footstep VFX」](https://www.unrealengine.com/marketplace/ja/product/niagara-footstep-vfx)の実装方法を参考にしました。

実装の流れをざっくり説明すると、まずはアニメーション通知（Anim Notify）を作成します。上記アセットのサンプルをそのまま使ってもいいと思います。アニメーション通知はアニメーションの好きなタイミングで色々な処理を発動させられるのでとても便利です。

そのアニメーション通知を、歩行・走行アニメーションの足が接地したタイミングに追加しましょう。ボーンの指定を忘れがちなので注意してください。

![footstep_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/a5b3a8ed-1f97-173f-c012-dc80e1bae9a4.png)


足音についてはアニメーション通知で「Spawn Sound at Location」ノードを使ってエフェクトと同じ位置を設定するといい感じに音がします。足音のアセットはフリー素材サイトからダウンロードするか、マーケットプレイスで購入してもいいと思います。[「Pro Sound Collection」](https://www.unrealengine.com/marketplace/ja/product/pro-sound-collection/reviews)を買うと効果音が大体揃うのでおすすめです。

ただし、このままだとゲームごとにアニメーション通知とアニメーションを複製しなければならず面倒です。

そこで、新規追加→ブループリントにある「ブループリントインターフェイス」を作成しましょう。チート級に便利です。

画像のようにアニメーション通知でコンポーネントを所有アクターから、インターフェイスで作成した関数ノードを伸ばして、エフェクトや効果音の処理を消してしまいましょう。

![footstep_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/5b61afd3-a6b5-d098-0372-b647417de417.png)


そして、ゲームで使用するキャラクターブループリントの「クラス設定」をクリックして、「実装インターフェース」に作成したインターフェースを追加してください。

あとはインターフェースの関数（イベント）を追加して、エフェクトと効果音をつなぎましょう。こうしておくとゲームやキャラクターごとにエフェクトと効果音を設定できるので、アセットを作成する手間をかなり減らせます。

![footstep_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/e13c978f-c648-6125-7f24-6dc1b4e95e4e.png)


## 関数ライブラリ・マクロライブラリ

色々なところから呼び出しそうな関数は関数ライブラリに実装しておくと便利です。

今回のゲームジャムでは、スコア・残り時間・操作可能フラグ等をゲームインスタンスで管理していたのですが、Get,Set,Add関係の関数は関数ライブラリで実装していました。

![library_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/f3e93c0b-6353-d77c-78fe-d42cd576b252.png)


関数ライブラリにした理由は、データと処理を切り離したいのもありましたが、下記画像のように○○が××する的なすっきりしたノードつなぎを例外処理込みでやりたかったのが一番の理由です。

![library_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/8e708f87-67ce-8965-6b48-ee9dbea94450.png)


この辺を最初に作っておくと作業中盤あたりからの開発効率がかなり変わってくるので、面倒がらずにやっておきましょう。

また、レベルブループリント等に共通する処理がある場合は、マクロライブラリでマクロにしておくと一々コピペする必要がなくなります。

今回は、「フェードインして30秒後にフェードアウトして次のレベルへ」という流れが全ゲーム共通していたため、マクロライブラリを利用しました。


※　ただし、注意点としてゲームジャムやプリプロ版よりも大きい規模の開発でライブラリを使用する場合は用法用量を守って正しく使用するように努めましょう。なんでもライブラリにしてしまうと後で痛い目をみます。

## ちょっとした演出にはタイムライン

上から降ってくる、飛び出る、だんだん明るくなる、はじける、等のちょっとした演出はタイムラインを使って実装することをおすすめします。

タイムラインは、時間と値のグラフを作成して、それを再生・停止する機能です。頭から再生、中止、逆再生、途中から再生等をノードをつなぐだけで実行できるので初心者の方でも扱いやすいです。

私がよく使うのは、とりあえず0→１のフロート値のカーブを作成し、移動量やスケールはUpdate時に最大量をかけるようにしています。そうするとタイムラインを開く回数が減らせます。

![timeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/0f064c2e-ae29-180d-96d2-c1656dbda062.png)


また、カーブフロートを作成するとカーブ情報をアセット化できるので、こちらの方が管理や付け替えが楽な場合もあります。

# 各ゲームのこだわりポイント

ここからは、今回作った５本のゲームのこだわった点を少しだけ紹介したいと思います。UE4とは関連性が薄いかもしれませんが、せっかくなので紹介させてください。

## コインのランダム生成

最初に作ったゲームは、ランダムにスポーンされたコインをあつめるとてもシンプルなアクションゲームでした。ゲームジャムでは定番中の定番のシステムだと思います。

![game_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/b1689600-bedb-e6c1-438e-89c57a9a4246.png)


こういったシンプルなゲームでも、ランダムスポーンに下記のような法則を付け足すことで、ユーザーをだんだんとドキドキハラハラさせるように誘導できます。

- 出現しているコインとは間隔をあける
- プレイヤーの近くにはスポーンさせない
- 時間経過でスポーンする時間間隔を短く、最大数を多くしていく
- ステージの端にスポーンすることで操作に緊張感を持たせる

ボーナスやマイナス要素を追加するのも良いですが、ユーザーが覚えなければならない要素が増えてしまうとゲームジャムやプリプロ版ではあまり良い評価に結びつかないので注意しましょう。

## 調べる判定

2本目は部屋を探索しながらガサゴソ調べてコインをあつめるゲームです。無料化して話題になった[「フィンチ家」](https://www.unrealengine.com/marketplace/ja/product/ef-twins)の子供部屋を使用しています。ゲームジャムでアクション以外のゲームを作るのは新鮮でした。

![game_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/b0f7b571-a6b7-8ae3-19df-9ad5bb6f09ab.png)


今回は「Apply Radial Damage」と「Event AnyDamage」というダメージ処理で調べる判定を実装してみました。

![check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/7ff1c184-f248-c94f-46a8-47a3ea9f40eb.png)


オーバーラップイベントやトレースでも実装はできるのですが、ダメージだと少ないノードで手軽に組めるので気に入っています。欠点はデバッグ描画機能がないのでダメージ範囲の確認をしにくい点くらいです。


## 簡易的な追従カメラ

3本目は作るのも畏れ多い王道中の王道、横スクロールゲームです。5本の中で一番苦戦しました。やはりキャラクタームーブメントの調整だけだとブロック関係の挙動で難がありました。

![game_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/738e6a41-17a6-507b-c22b-101bdca7410e.png)


ここでいい感じに作れたのは簡易的な追従カメラです。

![camera.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/6c8f0053-b6e5-ab5f-5b4b-a589b9f4cd0f.png)


画像のように、左の画面外移動制限用の壁とカメラを一つのアクターしてしまい、プレイヤーがアクターよりも右に進んだらアクターも右に進むだけのとてもシンプルな構造です。これを実装するだけで典型的な横スクロールゲームのカメラになってくれます。


## 速く走ってる感じを表現する

4本目は夜中の3時から6時に作ったランゲームです。アニメーションは前に買った[「Frank RPG Fighter」](https://www.unrealengine.com/marketplace/ja/product/frank-rpg-fighter?sessionInvalidated=true)という有料アセットを使用しました。

![game_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/4569cbd1-e991-8a06-88f0-547077beaeae.png)


このゲームでは速く走っている感じを少しでも際立たせるように下記のような工夫をしました。

- 速度に応じて走るアニメーションのピッチを上げる
- 前述した足元エフェクトと足音を、他のゲームよりも強めに出す
- レベルに「PostProcessVolume」を配置して「Motion Blur」を強くする

障害物に当たるまではだんだんと走る速度を上げているので、ノーミスを継続できると速く走ってる感じがどんどん増していってユーザーが気持ちよくなれます。

![run.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/a927428e-4402-d20b-8e5c-68e91cb05c3c.png)


## フライトゲームは実は簡単！

最後に作った5本目のゲームはフライトゲームです。本当は[「Procedural City Generator」](https://www.unrealengine.com/marketplace/ja/product/procedural-city-generator)を使ってオープンワールドを作ろうと企んだのですが、断念して空中でボスっぽいコインを射撃する感じにまとめました。

![game_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/0554e87a-e04c-18af-7269-ecf50be1cb49.png)


飛行機を操縦するゲームは過去に作ったことがあったので、特に苦労することはありませんでした。実装もとても簡単で、ピッチ操作とロール操作の実装は画像一枚に収まっちゃいます。

![flight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282607/dbd50848-d799-f86a-588a-b988728abea3.png)


また、弾を発射するときは、発射口エフェクト・本体エフェクト・ヒットエフェクトの3点セットは最低限実装した方が良いです。あと、PvP以外で距離が離れた敵に弾を発射する場合は、発射後徐々に弾の速度を上げたり弾のスケールを大きくしたりすると案外良かったりします。

# まとめ

今回は、ゲームジャムで５つのゲームを作った方法を種明かし的に解説してみました。諸先輩方が本気を出したら一日で10本くらい平気で作ってしまいそうですが、挑戦してみて今の実力を測ることができてよかったです。

UE4はブループリントのおかげでイテレーションをかなり早く回すことができるので、実はゲームジャムやプリプロ版制作に向いているツールだと個人的に思っています。

初心者の方には、今回紹介したような小さなゲームをいくつか完成させていって、ゲーム制作とUE4に一歩ずつ慣れていくことを強くおすすめします。がんばりましょう。

### 以上です。読んでいただきありがとうございました。

### 次のゲームジャムでお会いしましょう！