第１７回UE4ぷちコン振り返り　１


# 第17回ぷちコンに応募した作品「Operation:DeFrosting」の振り返りになります。
https://youtu.be/iuKnikD0QMQ

みんなの書いたブループリントが見たいのでまずは自分が公開して行く会第一回開催。
ぷちコン審査結果発表会が終わってからだと記憶を失ってしまうので少しずつまとめていきます。
みんなのぷちコンの解説記事待ってます……お願いします……（あの機能で作りました！って言われても全然わからない初心者なので…）
## 弾の発射について
FTPSを作る…というか発射するようなものを作るのは初めてだったので、弾の種類の判定からダメージ・スポーンまで全部ThirdPeasonCharactorに書いてました。

全体図↓

![ThirdPersonCharacter-EventGraph-min.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/dc1b6914-f4c0-ef53-e8a8-5cd3cd590355.png)

スパゲッティコードとかそんなレベルじゃないぐちゃぐちゃっぷり…orz

### UMGと弾の判定
ほんとはもっと別の方法でやるべきなんだろうなあ…と思いつつ、自分が実装できそうな処理がこれしか思いつきませんでした。

仕組みとしては
1.BeginPlayで現在レベルが戦闘マップか判定
2.Tureだった場合クロスヘア、HP、シリンダーのUMGを作成
3.シリンダーのUMGをターゲットにそれぞれの弾の画像ごとに分解
4.Set Render Transform Angelを使って画像ごとに現在のUMGのAngelにQを押すと+72°、Eで-72°をするように
5.新しいAngelを変数にセット
![スクリーンショット (494).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/0f643475-4f57-7f82-d9ef-49c7666f1e6f.png)
6.マウスの左クリックをしたときにプレイヤーのカメラからライントレースを発射
7.UMGのAngelを360で割った時、余りが一致するかどうか判定（どうしてsequencerで書かなかったんだろう）
8.弾があるかどうか判定
9.あった場合、その弾のUMGを見えなくする
10.弾の数を減らす
11.一致する弾のイベントに進む
![スクリーンショット (495).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/e2c48d3e-9ef9-2e71-8852-cc77f9329183.png)
みたいな感じで書いてました。
弾数がBloomじゃないのは最初リロードの回数に制限を掛けようかと思ってたからです。（結局使い切るまでリロードできないようにしたから関係なかった）

弾の選択が後は

nomal→ライントレースのhit actorにApply damage（デバッグ用に電車を止められる機能を消してなかった為応募用動画を数十回取り直すことに）

silver→ silverbulletをimpact pointにスポーン、silverbulletの方に作ったスフィアコリジョンにオーバーラップしたアクターにブループリントインターフェースのsilver Event発行。あらゆるアクターにイベント受け取りが仕込んであり、受け取ったアクターはDestroy Actorされる

blue→ bluebulletをimpact pointにスポーン、スポーン地点にniagaraの水の球体が出現、出現地点の地面にデカールを生成。もし水が炎に当たった場合、炎が消える。プレイヤーに当たった場合、プレイヤ―が寒くてHPが減る。（ほんとはダクソの毒！みたいなUMGを作りたかったけど手が回らず…）敵に当たった場合、一粒につきHPが10が減少

red→汚い処理１号
Hit ActorがMoveObjecのタグを持ってるか判定。持っていなかったらHitしたLocationに炎のBPをスポーン。持っていたら、Hit ActorのLocationをGetしてスポーン、Hitactorを確認（ここがいい方法思いつかなくてすべてキャストするという…）合致するActorにAttach Actor to Actorでくっつけ、ImpactPointにSet Actor Locationする
![ThirdPersonCharacter_BP-EventGraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/4cd03fdc-50ea-36c4-0515-2f6b78125349.png)

Ice→汚い処理２号
大体上と一緒。
Hit ActorがMoveObjecのタグを持ってるか判定。持っていなかったらHitしたLocationに氷のBPをスポーン。持っていたら、Hit ActorのLocationをGetしてスポーン、Hitactorを確認（ここがいい方法思いつかなくてすべてキャストするという…）合致するActorにAttach Actor to Actorでくっつけ、ImpactPointにSet Actor Locationする。ただしlakeのタグを持っていた場合、別の氷柱BPをHitLocationをスポーン。（これを使って進路を修復するイベントとか作りたかったけど間に合わなかった）割れる氷の下にlakeタグを持たせたPlaneを配置してました。

分岐処理が終わった後は、
・マズルフラッシュのエフェクトをスポーン
・発砲音を銃口のSocketにアタッチしてスポーン
・Enemyのタグを持っていた場合血しぶきをImpactPointにスポーン（この記事書いててデバッグ用のPrintstring消してなかったことに気付いた…）
![スクリーンショット (496).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/f02418c1-7368-8961-2964-1e3e315f6151.png)

みたいな処理でつくっていました。
最初はHitLocationに各弾を作っていたんですが、無限ループやらOverlapとHitの判定でスポーンした時点でOverLapしてるとだめとかそういうのに振り回されて一部を直接スポーンする方法に落ち着きました…

### 各弾のBP
silver
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/3bd12dc2-4d67-8a43-9e12-016bf3625aaf.png)
blue
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/d53ea8c0-894a-21f0-63ef-9352a89064de.png)
Fire
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/c999c1c1-bf8a-ceb7-dd35-b78e1600d27d.png)
Ice
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257391/2b6c0ba2-41f4-d70f-dd3f-9fcca61dfbb9.png)


## 反省
・コードが汚い
Attachとかがよくわかってなかったり配列を使ったことがないせいでAttachする必要がある二つが以上に長くなった。次はBP分けて書きたいな…ブループリントインターフェースにImpactPointのVectorとHitActorのObjectをインプットできるようにすればいいのか…？（今回初めてインターフェースを使ったのでよくわかってない）

・汎用性がない
弾の判定をUMGの角度で判断してるので別のプロジェクトにぽい！ってしてすぐ使える！みたいな感じになっていない。

・インターフェースが使えるようになった
今まで全部Castto～からのカスタムイベント呼び出しでやってたやつをGet Actor Of Class→インターフェースで解決できるようになった。よくわからなさが下がった

## 次回！！

次回！筆者死す！デュエルスタンバイ！…ではなく今回に引き続きプレイヤーのBPの処理について書いていきます。多分高速移動とバリアとダメージ処理と死亡処理の辺り。

次回＞（執筆中につき書き次第リンク張ります）