Unreal Fest Extreme '21 Summer アンリアルクエストに参加して得られたもの

#はじめに
私のUnrealEngineの経験はまだ浅く、2020年の晩夏ころからUnrealEngine4を触り始めました。
普段はWEB系やモバイル系の業務アプリを作っているので、UE4を使うことでリッチな見た目のアプリが作れないか？と思い勉強し始めたのがキッカケとなります。(UE4はWEB・Android・iOS形式で出力できるので、UE4をフロントエンドとして使い、バックエンドAPI通信させることでリッチな見た目の業務アプリが作れたら面白そうと思ったのです)

入門系の情報を探していたところ、エピックゲームズジャパンの岡田様・Axel様が解説してくださっている「猫でも分かる UE4を使ったゲーム開発 超初級編」という初心者入門向けの動画コンテンツを見つけ、これで一通り学ばせて頂きました。
(たまに「俺は猫以下だ・・・」と思う事も多数ありましたが・・・)

https://www.youtube.com/watch?v=ztv4OPc_o6g

勉強を始めて少し経った頃に「Unreal Fest Extreme '20 Winter」というイベントがあり、そこで株式会社ヒストリア様主催の"ぷちコン"を見たことで、何か一つ作品を作ってみたいと思いが沸いてきました。が、当時の知識では完成させる自信が無かった為、指をくわえてぷちコンを眺めていました。(この時点で業務アプリよりもゲームを１本作ってみたいという考えにシフトし始めていました)

そんな私が、今回「Unreal Fest Extreme '21 Summer アンリアルクエスト」というイベントに参加させて頂き、たくさん得るものがあった為、その報告と自分なりの情報発信を出来たらと思い記事を書くことにしました。
記事は複数回の予定で、今回は技術的な話しではなく、参加中のストーリーの紹介となります。
次回より今回得られた技術的な記事を書かせて頂ければと思います。

なお、今回提出させて頂いた作品は以下のものとなります。
<iframe width="747" height="477" src="https://www.youtube.com/embed/Wzqd-J70SmE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
大喜利回答って感じですが、これを作っていく過程をお楽しみください。

<h1>今回は"ぷちコン"ではなく、"アンリアルクエスト"！？</h1>
2021年4月、Unreal Fest Extreme '21 Summerの開催が発表され、そこでは「アンリアルクエスト」というイベントが開催されるという発表がありました。
５日間に渡って１日１つのお題(その中でも初級・中級・上級がある)が与えられ、それを実装していくことで５日目にはゲームが完成しているという企画でした。
今回はぷちコンではありませんでしたが、前回何もしなかった自分を変えようと、今回こそは参加してやる！と思い参加する事にしました。

#ついにアンリアルクエスト開催！！１日目のお題はギミック！
初日のお題はギミックということで、難易度毎のクエストは以下の通りでした。
<dl>
<dt>初級</dt>
<dd>動く床・当たると死ぬ棘</dd>
<dt>中級</dt>
<dd>ジップライン・一定時間乗ると落ちる床</dd>
<dt>上級</dt>
<dd>シーソー・ターザンロープ</dd>
</dl>

まずはアンリアルクエスト用のプロジェクトを新規に作成します。
UE4は、プロジェクト作成時のテンプレートが複数用意されていますが、何故か、どの初心者向け講座を見ていても「ThirdPersonテンプレート」を選択するので、それに倣いThirdPersonテンプレートから開始しました。
ただ、このままでは他の参加者様との差別化ができないと思い、キャラクターのカメラの向きとキーアサインを一部変更して横視点(実際には3Dだが2D風)のアクションゲームとしました。

最低でも初級はクリアする必要があるのですが、初級は「猫でも・・・」シリーズを見ていればクリアできる内容だったので、中級以上にも挑戦してみようと思いましたが「ジップライン」という用語すら知らず、用語を調べるところからのスタートとなりました。

実は、初級のクエスト内容を聞いた瞬間に頭に思い描いたものは「アイスクライマー」だった為、縦スクロールアクションにしようかと思ったのですが、ジップラインやターザンロープを表現しにくいと思い、オーソドックスな横スクロールアクションでいくことを決め、横スクロールアクションゲームの代表作でもある「スーパーマリオブラザーズ」を想像しながらアセットを配置していったところ、どこかで見たことあるような世界観になってしまっていました。
(パクりではなくオマージュということで・・・)

初級の内容は30分程度で実装できた為、ジップラインの実装方法を調べてみたところ、イベントを主催しているヒストリア様のブログでスプライン機能について触れていた記事があった為、それを見ながら実装することができました。

https://historia.co.jp/archives/1232/

ところが、ジップライン時のアニメーションに納得がいきません。
ThirdPersonテンプレートのグレイマンのアニメーションではジップライン時にジャンプモーションが適用され「後ろから首を掴まれた猫」のようなアニメーションになってしまい、ジップラインを移動している感じが出ていなかったのです。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142507/bc7484af-10ef-9c92-e85c-45b0d14abd0c.png)

UE4のアニメーションBPについては「猫でも・・・」シリーズで説明されていたので理解はしていたのですが、アニメーションBPを使った場合に「ステート」の遷移が複雑になってしまう可能性がある事に気が付きました。
例えば、ジャンプしながらジップラインに触れた場合はジャンプモーションからジップラインモーションに状態遷移させれば良いのですが、歩きながらジップラインに触れた場合はウォーク・ダッシュモーションからジップラインモーションに状態遷移させなければなりません。今後ジップライン以外のモーションが増やしたくなった場合に、ジャンプモーション/ウォーク・ダッシュモーションそれぞれから状態遷移をさせるとなると、状態遷移の条件分岐が膨大になってしまいます。
そもそも、AAA級のゲームを開発できるUE4が、こんな事に対応できないハズはないと思い、これは調査するということで今日の作業は終了としました。

#二日目のお題はステージ
二日目のお題はステージということで、難易度毎のクエストは以下の通りでした。
<dl>
<dt>初級</dt>
<dd>ゴール・制限時間を入れる</dd>
<dt>中級</dt>
<dd>レベルデザイン</dd>
<dt>上級</dt>
<dd>次のステージへ・ゴール演出</dd>
</dl>

今回も初級については「猫でも・・・」シリーズを見ていればクリアできる内容でした。
上級のお題である「次ステージ」については、複数のレベルを作成する必要がある為、単純にレベルを作りこむ時間が無いと判断し、今回はゴール演出のみを実装することしました。

しかし、ゴール演出の作成で初日の問題が再燃します。

ジップラインと同じく、ウォーク・ダッシュでゴールするのか、ジャンプしながらゴールするのかで、ゴールモーションの状態遷移の切り替えが必要になってきます。
ジップラインモーションや、ゴールモーションはMixamoというサービスから引っ張ってきているのでモーションデータ自体は準備済みなのですが、そのモーションを表示することができないという状態に陥ってしまいました。

これは困った・・・
アニメーションは初級クエストではないので、無理に実装する必要はないのですが、自分が納得いかない完成度で公開するのはイヤだったので、やり方を調査してみることにしました。

#三日目のお題はエネミー
三日目のお題はエネミーということで、難易度毎のクエストは以下の通りでした。
<dl>
<dt>初級</dt>
<dd>当たったら死ぬ(リスタートする)敵</dd>
<dt>中級</dt>
<dd>追いかけてくる敵</dd>
<dt>上級</dt>
<dd>攻撃してくる敵</dd>
</dl>

三日目のお題は「エネミー」つまり敵の実装です。
初級はいつも通り簡単に・・・と思っていたら、結構罠がありました。

当たったら死ぬ敵のは単純に左側に歩くだけの敵として実装しましたが、レベル上に配置された瞬間から歩き始めるので、プレイヤーが遠くにいる段階から移動を始めてしまい、プレイヤーがそのエリアに近づいた頃には穴に落ちてしまっているという現象が発生しました。

また、リスタートも以下の問題がある事に気が付きました。

+ 死んだ場所でリスタートした場合、一定時間無敵状態にしないと同じ敵で再び死んでしまう場合がありストレスとなる為、無敵処理の追加実装が必要になる
+ ステージの開始時点まで戻ってリスタートした場合、初日のクエストで実装した落ちる床を復活させないと、ジャンプだけでは渡れない穴ができてしまう
+ 落ちる床を渡った後にチェックポイントを作っておけば、落ちる床を復活させなくて良いがチェックポイントの追加実装が必要になる

今回はチェックポイント機能を追加することで回避しましたが、一つのお題に対して間接的に必要な機能が増えていく事がゲーム実装の難しさなのではないか？と思いました。

追いかけてくる敵については、運よくAIを使って追いかけてくる敵を実装した経験があったので、それを使ってクリア。
ただ、今回はAIを使うほどではなかったので、以下の情報が参考になりそうです。

https://pafuhana1213.hatenablog.com/entry/2014/06/08/190825

攻撃してくる敵については、世界観を大事にした結果？ハンマーを投げてくる敵(そろそろ、最強の法務部に怒られそうだな・・・)を実装することにしましたが、投擲アニメーションと実際にハンマーが出現するタイミングを合わせる必要があったので、「猫でも・・・」シリーズのアニメーションの回を見直してクリアすることができました。

https://www.youtube.com/watch?v=KKYyROSKorw


初日から続くアニメーションの問題を解決できないまま時間だけが経過していく・・・

#四日目のお題はスコア
四日目のお題はスコアということで、難易度毎のクエストは以下の通りでした。
<dl>
<dt>初級</dt>
<dd>アイテムゲットでスコアが増える仕組み</dd>
<dt>中級</dt>
<dd>スコアをＵＩで表示する</dd>
<dt>上級</dt>
<dd>ハイスコア・ランキング</dd>
</dl>

今回は初級・中級共に「猫でも・・・」シリーズを見ていればクリアできるお題でした。

https://www.youtube.com/watch?v=ZRTejGxI76E

https://www.youtube.com/watch?v=Ut0JWOJyL5s&t=3991s

上級についても初級・中級の応用編という感じでしたが、初日から問題となっているアニメーション問題を対応する為に後回しにすることにしました。
調査してみると、以下のスライドを発見。(77ページから)

https://www.slideshare.net/EpicGamesJapan/ue4animation-blueprint

アニメーションBPにはSlotという機能があり、突然のモーション変化(このスライドでは、攻撃・ダメージ・死亡の場合と説明)の場合はSlotを使ってアニメーションモンタージュという機能でアニメーションを強制的に変更させる方法があるということが分かりました。これを使えば、「突然ジップラインに触れた」「突然ゴールした」という状況でアニメーションを変更できそうです。

ということで、これで対応した結果が以下のモーションになりました。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142507/04fc1f41-c94c-0212-15d7-8c76174a51d3.png)

最初から最後まで「猫でもわかる」シリーズに助けられっぱなしです。

#五日目のお題はバトル
五日目のお題はバトルということで、全難易度共通で敵を倒すバトルがクエストとなりました。
<dl>
<dt>全難易度</dt>
<dd>バトル</dd>
</dl>

ここで有難いことに、アンリアルクエストの進捗報告にて私の作品を取り上げて頂けました。

その中のコメントで「次のステージもあると思います！！」という言葉を頂いた為、これは次ステージも作らないとならない思い、二日目で諦めたレベル遷移を実装することを決め、今回のお題でもあるバトルをボス戦として、新規レベルで実現することにしました。

ただし、時間があまりないのも事実です。達成していない上級クエストもチャレンジしたかったうえに、４日目までの実装の中には十分ではない部分もあり、それの手直しをしながらボス戦なんて本当に作れるのか！？と不安になりましたが、チャレンジしてみる事にしました。

提出期限は翌日17:00までなのですが、作品をYoutubeへのアップロードする等の作業で時間を取られる可能性があったので15:00を締切と想定して作業に取り掛かりました。
途中で歯医者に行かなければならず、そこで１時間以上もロスしましたが、歯の治療中にボス戦のロジックを考えるという方法で乗り切りました。
そこで思いついたのが、世界観が大喜利になってしまっているので、ボス戦も大喜利で良いじゃないか！？という作戦(別名：諦め)でした。

スーパーマリオブラザーズのボスと言えばクッパなので、ボスの挙動はクッパと同じにすると決め、ファミコン風を再現する為にボスのアニメーションも最低限のものとしました。
クッパって意外とドジで、ジャンプ中にマリオが下をすり抜けてクリアされてしまうことが多い為、それを今回のゲームでも再現する事にしました。

ただし、それではあっさりしすぎてしまう為にボスっぽさが無いと思い、ボスと対峙するカットシーンを入れることで緊張感を持たせる事を思いつきました。
カットシーンについては「シーケンサー」というものがある事は知っていましたが、今回が初挑戦です。
時間が無い為、習うより慣れろで、実際に使い始めてみたところ、動画編集ソフトと使い方が同じだった為、違和感無くカットシーンを作成することができました。(本当はカットシーン中にキャラクターを動かしたかった！！にしても、UE4はホントに凄い！)

#そして、上級クエストを一部諦めることに．．．
ボス戦を作り終え、一旦プレイしてみると自分が作ったゲームなのに、クリアまでたどり着けないという問題が発生しました。このイベントでは最終的な提出物はプレイ動画になる為、なんとしても録画しながらゲームをクリアしなければなりません。
結果的に20回くらいリテイクしクリア動画を撮影することに成功したのですが、それにも時間が取られてしまった為、一部の上級クエストの達成を諦めることにしました。
初日の上級クエストであるターザンロープの実装は未調査だったので間に合わないと判断、四日目の上級クエストであるハイスコア・ランキングは納得できる表示ができなかった為、作品には収録しませんでした。
(ハイスコアの表示については、Mother2で使用されていたドラムロール式で表示させたかったのです)

#ピックアップ作品に取り上げてもらえた！＆他の参加者様のレベルの高さに驚愕！！
最終的に作り上げたものは大喜利なノリにはなってしまいましたが、アンリアルクエスト最終日の生放送でピックアップ作品に取り上げて頂けました。
特に狙っていた「ボス戦の緊張感からの脱力感」については印象を残すことができたと思います。

しかし、他のピックアップ作品を見ていると、同じ時間軸で生きているとは思えない作品ばかりで、自分の実力不足・作業速度不足を感じる結果となりました。
世界観・モーション・エフェクト・キャラクターどれをとっても魅力的な作品ばかりで、同じお題でもこんなに凄い作品ばかりになるのか！と感心してしまいました。

特にレベルデザインが素晴らしい方が多く、これだけの短時間で広大なレベルを作成していることにびっくりしました。

#心残り
アンリアルクエストは５日間連続開催で、平日は21:30にクエストが発表される為、実質、1時間～多くて2時間程度しか作業時間がありませんでした。
アセットから適したものを探して、アニメーションを探して、レベル上に配置して、テストプレイをしていると、すぐに時間が経ってしまいました。
そうなると、そのしわ寄せはロジックの汚さに現れてきます。
今回のような小規模なプロジェクトであれば顕在化しない問題ですが、「CASTをなるべく使わない」「共通クラス・インターフェイスを作成する」などの設計作業を行う時間が無かったので、今回のプロジェクトは最低限動くBPとなってしまいました。
それでも、動くものが作れてしまうというのはUE4の特徴でもある「高速なイテレーション」のお陰ですが、プログラマーとして、もっと内部を理解して処理負荷が低く、再利用可能な設計をしていけたらという課題が残りました。

#参加してみて得られたもの
やはりというか、強制的に課題を与えられないと、新しい発見・成長が無いという事を改めて認識することとなりました。
ここ最近はUE4のAI機能のハマっていて、AIを使ったスニーキングゲーム(ステルスゲーム？)っぽいものを作っていたのですが、どうしても自分が知っている知識の中でゲームの案を考えてしまいます。
UE4は機能が膨大にある為、このような機会を頂くことで、チャレンジしたことが無い分野の機能も調査・実装でき、知識の幅が広がる事がとてもうれしかったです。

今回、このようなイベントを企画してくださった、エピックゲームズジャパン様・ヒストリア様には感謝しております。

#余談ですが・・・
そういえば、投稿された作品を見ていて気付いたのですが、私の制作環境ってLenovo M75q-1 Tinyという内臓GPU(AMD Radeon RX Vega11)のマシンのせいで動きが遅いんですよね・・・
ゲーミングマシンが欲しいところです・・・