第19回UE5ぷちコン参加振り返り

# はじめに
先日開催された、historia様主催の第19回UE5ぷちコン(テーマ「ロック」)に参加しましたので、その振り返りになります。
応募した作品の動画は以下になります。

https://youtu.be/uZsMTgamcGo

審査発表会にて紹介と嬉しいコメントをいただけました！

https://youtu.be/CMDMmRmoApg?t=4929

# 方向
[![UE5ぷちコン19テーマ：ロック_サムネイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/77646f1b-9c1e-f18c-f92d-b62c1788a44e.png)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/8c28dde4-2068-af73-ca32-dd38437eff3d.png)
今回のテーマ「ロック」も連想する単語が多かったです。
ゲーム定番の「ロックされたドアを鍵で開けて脱出」が真っ先に浮かびましたが、まずはいつも通り色々挙げてみました。
この時点では「これだ」というものもの無く、ロックオンで撃ちまくると気持ち良さそうな感じがしたので、まずは作ってみることにしました。

# 今回目指したこと
いつも目指しながら実現できなかった「プレイして爽快感があって気持ち良い」を目指してみました。
ロックオンレーザーとか、ちょっと気持ち良さそう。

マインドマップでのネタ出しからイメージしたゲームは、トップビューのアクションシューティング。
最初に浮かんだイメージはPlayStationのサイレントボマー。最近遊んだHADESを振り返ってみると、2Dのゲームも面白いなと思いました。RETURNALのダッシュの気持ち良さも活かせれば。

また、近接攻撃を実装したことがなかったのでやってみようと決めました。

# やってみたこと
## AbilitySystemの使用とちょっとだけC++
AbilitySystemでスタミナや体力などを実装してみたかったので、こちらの記事を参考にして実装してみました。

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

BPからだとアトリビュートの追加ができなかったので、そこだけC++を使いました。

今回はプレイヤーの攻撃やダッシュ、無敵状態の設定、取得したアイテムの保持などに利用しています。
処理を分散して個別の実装ができるのですごく便利でした。アビリティを入れ替えるだけで攻撃の種類も切り替えられるところも便利です。
状態の持続時間も指定できるので、一時的に無敵にする場合などにも活用できます。

今回は攻撃がコンボになっているので、こちらの記事も参考にさせていただきました。

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

ただ、ボタン連打で連続して攻撃していくだけで良かったので、次のアニメーションへの繋ぎのタイミングなど処理は厳密に作りませんでした。

## 今回のテーマ「ロック」でロックオンレーザー
追尾して当たるロックオンレーザー。特にどんな状態からでも確実に当たるレーザーは男のロマン。
移動しつつ目標に対して方向を変えるだけと思って早速作ったら、永遠に当たらないレーザーが完成しました。
![当たらないロックオンレーザー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/ac13e8cc-a955-919a-b3cb-a8799fcff7ea.gif)
パラメータを極端に調整すると直進するだけのただのレーザー。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/d5103518-178c-fa50-f1cf-f2254c5b04f4.png">
それぞれの状態を時間経過で変化させることで、適度に曲がりつつ確実にヒットするレーザーの完成。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/2d539f18-e7df-f0ed-c3ac-6f2e48158d79.png">
動かない敵に対しては直線的に動く場合も目立ちますが、相手が動いていたりすると割とそれっぽい動きになるので、意外と気持ち良い動きが出せたかなと思います。
<img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/71456f93-f26e-c7c9-51cf-67b388349043.png"><img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/790240fb-1cc2-f48c-d1f6-067930eaf880.png"><img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/f29bbc87-eb10-3192-42ee-807c1b76cef8.png">



## 敵への攻撃
敵への攻撃手段として弾を撃つことも考えましたが、今まで近接攻撃を実装したことがなかったので挑戦してみました。

気持ち良さを実現するためにはコンボでの連続攻撃は欠かせないと思い実装したものの、早速問題点が発覚。

- 攻撃の間隔が遅くテンポが悪い
- しっかり敵の方を向かないと攻撃が当たらない

### 攻撃の間隔が遅い
攻撃の間隔の遅さに関しては、モーションのつながりなど考慮せず、ダメージ発生判定が消えたら次のコンボにつなげるようにしました。
受付時間の設定なども省略して、ボタンを連打していれば連続攻撃が出るようにしています。
![20230422_コンボの繋ぎのタイミング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/2569395b-779e-0670-e598-9e41ce104758.png)

### しっかり敵の方を向かないと攻撃が当たらない
しっかり敵の方向にスティックを入れるよう操作すれば解決するかと思いましたが、やはり感触としては「攻撃が当たらない」でした。

解決策として、方向の補正を実装してみました。
コンボはアビリティで実装していて処理が分離しているので、処理を追加しやすくて便利です。アビリティに限らずそういった実装を心がけるべきかと思いますが、仕組みで保証されているのは有難いです。

正面方向の敵を検出して、見つかった敵の方向を向くようにしています。敵の方向を向く際にプレイヤーが傾かないよう、X-Y平面に絞って方向を算出しています。
![GA_Attack_ComboBase-UpdateFaceDirection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/7d50d5e6-870a-958d-f465-b6704c8ad1ca.png)
大雑把ですが、プレイヤー正面のある程度の範囲をチャンネル指定でトレースして敵がいないかを探しています。
![GA_Attack_ComboBase-FindFrontNearEnemy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/07fa8b2c-cf01-27a3-bad3-44ed01ca131a.png)
結果的に、敵の近くに行けば真横くらいなら勝手に攻撃がヒットするようになりました。
![攻撃のフォロー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/e359dc62-395b-adb5-5cc6-65efe4a91e0f.gif)
とにかくボタンを押しているだけで敵に攻撃が当たるようになり、感触と気持ち良さを向上させることができました。

## ダッシュ
ダッシュすることで通常時よりも素早く移動でき、敵との距離を詰めることができます。
このタイプのゲームでよく見る、ダッシュ時の無敵もあるので、いっきに距離を詰めて打撃を叩き込めます。
また、ダッシュ中はPawnとの当たり判定のみOFFにしているため、壁にはぶつかりますが、敵をすり抜けて後ろに回ることができます。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/4d15f891-544c-dfa3-bde2-3ca52101e160.png">![ダッシュですり抜け.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/e65703a3-864c-409d-45f6-e41befb12597.gif)
ダッシュもアビリティで実装しているので、アイテムで能力を切り替えたりするようなことも可能です。ゲームに合わないなどあれば、他の能力に差し替えることも簡単にできます。
アビリティ内でTickが見つからずGameplayCueで実装しようとしましたが、NextTickのタイマーイベントがあったのでアビリティで実装しました。
![20230416_アビリティでダッシュを実装.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/57a94fe8-9cec-3161-5e6a-2431f92e2e02.png)
AbilitySystemの仕組みは、今後もうまく活用したいです。

## 敵のバラエティ追加
いつも中途半端にビヘイビアツリーを触っていたので、SequenceやSelectorノードの違いを覚えておらず、どちらのノードがどう動くか結構忘れるので、こちらの記事をいつも参考にさせていただいています。

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

今回は少しだけどEQSも使ってみました。
一定距離を保ちつつ動くための移動先を決めています。色々と試行錯誤中で理解も浅いので、次回も使っていければと思います。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/906fe68b-ecdb-9b9d-fb17-2b20291db846.png">
敵の動きもそうですが、攻撃の種類も増やしたかったので、早い段階で作り始めました。
細かい動きを作っておけば、見映えが良くなるかと思い、最初に作った敵の攻撃が反射レーザーでした。

昔遊んだゲームで見かけた反射レーザー。作ってみると意外と楽しく、テンションが上がりました。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/d32a6d14-5985-abb3-be66-747ab91f3244.png">
ボスに搭載したポッドから発射される打ち上げミサイルの挙動も早い段階で作りました。
アセット導入で、発射時の炎や煙なども追加されて見映えが良くなりました。この段階で一気に画面が華やかになって、より楽しくなります。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/4b89c780-0f83-5edc-40f4-faba3cf3de3a.png">
目立たなかったけど、ビームサーベル風の攻撃もあります。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/57134af7-94c1-138e-6065-147ea105b939.png">
また、今回のボスに使用した四つ足のメカですが、Epic![おかず](https://twitter.com/pafuhana1213)さんのツィートで知りました。今回のテーマ発表があった頃のツイートです。

https://twitter.com/pafuhana1213/status/1626378573367107584?s=20

ゲームの内容を検討する中で実際に触ってみたら、すごく良い感じに動いていたので、今回のボスに収まることになりました。

## コントロールリグを使ってみる
シーケンサーでキャラクターを動かす際に、適切なモーションが無く困ることが多かったので、今回はコントロールリグを使ってみました。

こんな感じのポーズが簡単にできるので、コントロールリグとても楽しいです。<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/01608d88-906d-9096-fae9-9796535d5ce7.png">
しかし、静止状態でのポージングは良かったのですが、いざ動かしてみると、出来上がったアニメーションがとてもぎこちなく絶望しました。そのため、オープニングでは、手先や足の動きなどが見えないよう、カメラに映る範囲を制限して誤魔化しています。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/0bfd9075-1ba8-7358-82e0-b32ad1f580e3.png">
ボス戦前のシーケンサーもコントロールリグでアニメーションをつけました。サンプルにコントロールリグがついているのはとても助かります。
こちらはメカなので、動きが多少ぎこちなくても何とかなりました。
ミサイルポッドは自分で追加したものなので、アセットにはついていません。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/9bace8b3-8f4a-5f6c-932f-f80e66f5a534.png">

## 透過オーバーレイマテリアルを使う
UE5.1から追加された透過オーバーレイマテリアルが地味に便利でした。
ダメージ表現や、敵出現時の演出で全体の色を変えることができます。
以前は対象のマテリアルに直接ノードを追加していたので、別のマテリアルで対応できるのは有難いです。
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/2165ff74-ff8b-efd1-0680-126cc50bb917.png">
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/16d99d60-473d-0d2c-d355-26d655d2d8c2.png">
ちなみに、敵のフェードインは、こんな感じで対応しています。タイムラインを再生して、それと同時にエフェクトとSEを再生しています。
出現演出中にいきなり攻撃を開始したり、プレイヤーに倒されたりしないよう、一定時間動きを止めて無敵にしています。時間指定で状態設定できるのもAbilitySystemの便利なところかと思います。
![BP_Enemy-ExecFadeIn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/eb5e2e21-2fb9-3270-769e-ff8bc41f8ca6.png)
アニメーションの起点はこれだけ。タイムライン凄く便利。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/4abf32ed-6ec5-2275-1f9f-e58c6782219b.png">
タイムラインからは、透過オーバーレイマテリアルやスケールの値を変更して反映しています。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/aafc8f04-ca16-8b68-1005-d32e84eadc6a.png">


## 外部ツールを使う
前回くらいからBlenderとSubstance 3D Designerを使い始めたので今回も使ってみました。

照準のような記号の組み合わせのような形状はノードで作成しやすくて良いです。
作ったまま状態では少し寂しかったので、UE5のマテリアルで回してみました。
![20230422_ロックオン照準.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/9dcf8c82-48b0-5a9c-5b38-e9106582bd53.png)
![20230422_ロックオンの照準.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/694c7cf5-7579-d144-b939-7b2f1f6d7760.gif)

Blenderである程度の形状は作れるようになりましたが、テクスチャを貼ったことはあまりなかったので、今回は貼ってみました。テクスチャはSubstance 3D Designerで作成しました。単純な形状ではありますが、一歩前進した気分です。
ツールが使えると、ちょっとしたアイテムなど作れて便利です。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/f7d5e528-a353-aaf8-a7c9-5669f2c9b561.png">
![20230422_カードキーテクスチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/89add918-3530-a625-cb74-f23249abe1a0.png)

## エフェクトを作る
エフェクトも少し自作してみました。全然まだまだなので、少しずつ良いものを作れるようにしたいです。
ヒット時のダメージエフェクトなど見映えの良いものはアセットを使用しています。

- コンボの蹴り技の時に出るエフェクト。中央部分のメリハリをつけてもう少し奇麗にしたい。<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/b3f27c9a-dce0-a3f4-ce5a-98ac1b8521a0.png">
- ダッシュ中に出るエフェクト。拡大すると荒さが目立つが、ゲーム中ではここまで見えないので許容。<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/4567dec0-d975-15e4-4299-72db932eb672.png">
- ボスの攻撃のレーザー。放電のエフェクトも乗せられれば良かったかも。<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/ef602575-0924-d612-5d36-b7588ff463d9.png">
- 効果線のようなマテリアルはアセットから流用。ちょっとデジタル的な転送をイメージ。<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/09675631-2167-6a83-4782-1fdac74b50cf.png">

# 振り返り
## Keep
- Substance Designerを使う
- Blenderを使う
- AbilitySystemを使う

## Problem
- 多少はエフェクトを作れるつもりになっていたが全然ダメ
  - テクスチャとかシンプルなものしか作れない
  - ノイズなどを効果的に使えていない
- 人物の動きをつけてみたが、わざとらしい動きにしかならない
  - ぎこちない
  - 細かい動きをつけるのが苦手
- ゲームの流れに間が無い(一瞬止まって何かが起きたことを認識させるための間)
- AIを少しは分かっているつもりだったが、良く分かっていなかった
  - ノードやデコレーターなどの理解不足
- SEを当て込むタイミングが遅かった
  - 望む音を探すのに時間がかかるので早めに対応するべき

## Try
- エフェクトの情報収集
  - 自分で作れるに至っていないので、もう少し勉強する
- 間を作る(ヒットストップなどでの停止、手ごたえ)
  - ボスなどを倒した時
- AIの挙動を充実させる
  - EQSを使ってみたが、まだ理解が足りていない
- SEは少し早い段階から当て込む
- 開発初期のスクショを残す
  - 振り返ってみてどこまで変わったかを実感するため

出来ることは増えてきたが、まだまだ不足していると感じる。特にエフェクトはシンプルでも見映えするようなものを作れればと思った。

気持ち良さと爽快さを感じるようなものはできた感じがするので、次は間とかテンポなども意識して制作するようにしたい。特にボスを倒した後など、ゲームとしての区切りになる箇所にもヒットストップなどで間を作りたい。見ていても気持ち良さを感じてもらえるようにすることも忘れない。

AIに対する理解が足りていないことを痛感したので、敵と駆け引きを楽しめるよう、もう少し勉強する。

作業を進める際にはできる限りスクショを残しておきたい。
<img width="320" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165865/75820b95-7949-46b2-70d4-f728d7b79cbc.png">


# 最後に
今回は、テーマに沿ったルールがあまり思いつかなかったので、既存のゲームのイメージから諸々の実装を進めました。結果的に今まで作った中では爽快感や気持ち良さがあるものになったと思います。
特に、ロックオンレーザーは気持ち良くできたかなと思います。ガンダムシードを見たり、レイストームの動画をみたりした甲斐がありました。

そして、今回もぷちコンを楽しませていただきました。作りたい部分だけ作って勉強になる素敵なコンテストであることを毎回実感しています。
応募にプレイアブル提出が不要なため、バグがあっても動画を撮る際に運用でカバーでき、ギリギリまで作業できるのも凄く良いです。仕事以外の時間でデバッグに終始しなくて済むのは有難いです。
historia様、Epic様、審査お疲れ様でした。またぷちコンに参加させていただきたいと思います。


# 使用素材とアセット

- 今回の主人公。SF系の衣装がゲームのイメージにぴったりでした。

https://www.unrealengine.com/marketplace/ja/item/5e2fbf38f55c437f8c563efcc35ded8d

- 今回のボス。無料で使用可能な上に、コントロールリグも用意されています。ワクワクが止まらなくなるメカメカしさが凄く良いです。

https://www.unrealengine.com/marketplace/ja/item/d4b2b012989944b19bbe5b795dfa04d5

- 今回の敵キャラ達。Epicさん提供の毎月の無料アセットで入手。動きも含めて使い勝手が良かったです。

https://www.unrealengine.com/marketplace/ja/item/9d53cb29e8364f1fa95925f530368a3a

- イメージした敵が足りなかったので追加で入手。

https://www.unrealengine.com/marketplace/ja/item/a69afb9cc76640de82d3b82323fed805

- 敵の攻撃に使用したミサイル。エフェクトも込みなのに無料。

https://www.unrealengine.com/marketplace/ja/item/810ab67424e345dba364661941e1a79f

- いつもはサードパーソンの移動アニメーションだったので、今回はこちらのアセットを使用。立ち姿がカッコいい。

https://www.unrealengine.com/marketplace/ja/item/71eb4d9351f04c01b220ae33958cd1eb

- 豊富な攻撃モーションがいっぱい。今回は近接攻撃のモーションを使用。

https://www.unrealengine.com/marketplace/ja/item/918734a2d637452bbbf9bcb0ab1a7534

- シンプルだけどイメージにぴったりの背景素材。今回の視点では右と手前の壁が邪魔になるけど、裏面が見えなくなるこのアセットはそのまま配置するだけで済むので便利。

https://www.unrealengine.com/marketplace/ja/item/41b8fe15e51f4512bc24bc3050401b8a

- オープニングのシーケンサーで使用。アセットのShowcaseのレベルから必要な部屋の部分だけを引用。

https://www.unrealengine.com/marketplace/ja/item/4e4e6995f839410cb282936c076c180d

- 無料で入手したエフェクトアセット。使用するだけで画面内に派手さと彩りが増します。

https://www.unrealengine.com/marketplace/ja/item/78ce22a41175480ca78f0e2373a186ab

https://www.unrealengine.com/marketplace/ja/item/aa644bc2837b4a74b3b4d238474bb348

https://www.unrealengine.com/marketplace/ja/item/963c62c38abb403aa08b575584b765d0

- こちらも無料のエフェクト。今回はタイトルの背景に使用しています。

https://www.unrealengine.com/marketplace/ja/item/b683c3fe3d024b2a95c29d7d2989b0a9

- ゲーム内で使用する足音はずっとこれ。大体揃っているのが魅力。

https://www.unrealengine.com/marketplace/ja/item/c77aeb5b9a93448c94b4e6235fb4edc4

- SE全般に使用。種類が豊富で、大抵のものは揃っている。

https://www.unrealengine.com/marketplace/ja/item/f6f88552c30e42b3a7ceeb2c638c66fa

## ゲームに直接関係ないけどすごくお勧め

- 振り返りを書く際に使っていますが、BPのスクショを撮る際に凄く便利です。

https://www.unrealengine.com/marketplace/ja/product/graph-printer