UE4 FPSテンプレートをなぞってみる

# 今回の目標
UE4のファーストパーソンテンプレートをなぞって、まだ見ぬエンジンの機能を知っていく。
新しく得た知見をメモ代わりに、ここに書き残しておく。

## FirstPersonCharacter
### ビューポート
#### Use Pawn Control Rotation
Camera > Camera Options > Use Pawn Control Rotation
ドキュメントらしいドキュメントも見当たらなかったので自力で調べる
とりあえずエディタの説明を呼んで見る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/d3990351-27da-b414-2fb6-812a72517cdf.png)
なるほどわからん
仕方がないのでCameraComponent.h/cppのコードを読む
コードは載せないが、やってることは以下の通り
1. `GetOwner()`でカメラコンポーネントをアタッチしている持ち主、つまり今回の場合`CharacterController`を`APawn`にキャストして取得
2. 取得したポーンと関連付けされているコントローラーを取得
3. ネットワーク関連を考慮して、自信が操作するプレイヤーか`IsLocalPlayerController`を使用してチェック
4. カメラの回転とオーナーと関連付けされているコントローラーの回転に差があった場合、コントローラー側の回転にカメラの回転をあわせる

今回の場合、ざっくり言うと所持しているコントローラーの回転にカメラの回転をあわせる機能

#### Animation
Mesh2P (Skeltal Mesh Component) > Animation
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/0a39a592-0ea1-d8a9-8fcd-4ad1e555b01a.png)

Anim Class にアニメーションブループリントを指定すると、アニメーションブループリントに沿ってアニメーションの遷移がおこなわれる

#### カテゴリ
変数 > カテゴリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/88551f55-0aee-b886-ab66-5f4cab4db5af.png)
赤線のやつ

#### Cast Shadow
Skeltal Mesh Component > Lighting > Cast Shadow
影を落とす落とさないの切り替えができる

### イベントグラフ
#### Add Controller (Pitch / Yaw) Input
エディタ側の説明テキスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/b37f9834-dfdd-b0f4-d61d-97e91317d232.png)
これは説明の通り`ControlRotation`に引数で与えた(値 * InputViewScale)の値をPitch または Yawに加算している処理になる

Characterコンポーネントを所有しているオブジェクトが回転していた理由がわからずコードを読み漁っていたのだけれど、Characterコンポーネントの`Use Controller Rotation Yaw`にチェックが入っていたのが原因だったようで、あくまでPlayerControllerを経由して回転させているのであって、この関数自体が直接Character側のRotateをいじっているわけではないようだった

#### Add movement Input
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/60c4dd3e-2c66-5aa7-926a-e7dfcf4348be.png)
`DefaultPawn` `Character`コンポーネントでは`AddMovementInput`を使用した際に移動の処理を自動でしてくれる
逆に言えばそれ以外は自前でその辺りのコードを組まなくてはいけない
内部的には`AddMovementInput`で設定したベクトルとスケールをVelocityに設定している(その過程では結構色々な関数を通ってたりするるので注意)
1. ControlInputVectorに加算
2. 毎フレーム呼ばれる関数(Tick)で`ConsumeInputVector`を使用してベクトルを取得
3. なんやかんやあってVelocityにセット

といった流れ

#### Jump / Stop Jumping
***Jump***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/c00234f3-5364-fab8-b7d9-89267d576d15.png)

***Stop Jump***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/7a1fa8fd-1a54-1ef7-7d8b-30fc7e2c2b3c.png)

`Character`コンポーネントには`JumpMaxHoldTime`というパラメータが定義されており、`Jump`を実行してから`Stop Jump`を実行するまで or `Jump`を実行してから`JumpMaxHoldTime`で設定した時間経過するまでの間、キャラクターが上昇し続ける。
今回のサンプルの場合、`JumpMaxHoldTime`が0に設定されているため、`Stop Jump`を実行しなくても問題はないようになっている

### コンストラクションスクリプト
#### そもそもコンストラクションスクリプトとは？

ブループリントがレベル内に配置したタイミングで実行される
使いみちは何やら色々あるらしい

参考になりそうなリンクたち
[1.4 - コンストラクション スクリプト | Unreal Engine ドキュメント](https://docs.unrealengine.com/ja/Resources/ContentExamples/Blueprints/1_4/index.html)
[コンストラクション スクリプト | Unreal Engine ドキュメント](https://docs.unrealengine.com/ja/Engine/Blueprints/UserGuide/UserConstructionScript/index.html)
[[UE4] コンストラクションスクリプトでお手軽にプロシージャルなアクターを作る](http://historia.co.jp/archives/4785/)

#### AttachToComponent
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/44e1cb21-b624-637b-567f-8e7a7080b03d.png)
`AttachToComponent`の詳しい説明は↓のサイトを参照してもらえればおおよそ理解できる
`Socket Name`がGripPointになっており、FP_Gunのスケルトンに同名のものが存在する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/e5c96e33-3e44-b516-0501-c7373bfb9b3b.png)

これで銃がモデルの手の動きに合わせて移動するように自動で設定されるようになった

参考にしたサイト
[UE4 モデルをキャラクターにアタッチする・メッシュコンポーネントの指定したソケットにメッシュコンポーネントをアタッチする版（Attach To Component） 凛(kagring)のUE4とUnityとQt勉強中ブログ](http://kagring.blog.fc2.com/blog-entry-375.html)


## FirstPersonProjectile
### ビューポート
#### Initial Life Span
Actor > アクタ > Initial Life Span
アクタの寿命(秒)
0は寿命ナシ　実行後には変更できない

#### Sphere Radius
Sphere Collision > シェイプ > Sphere Radius
コリジョンの半径

#### コリジョンプリセット
Sphere Collision > Collision > コリジョンプリセット
[コリジョンの概要 | Unreal Engine ドキュメント](https://docs.unrealengine.com/ja/Engine/Physics/Collision/Overview/index.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/d219edd1-26ad-6c01-29ca-1dd0dfecfebe.png)

ドキュメント呼んだほうが早そう

#### Projectile Movement Component
[Movement コンポーネント | Unreal Engine ドキュメント](https://docs.unrealengine.com/ja/Engine/Components/Movement/index.html)
今回のような射出される弾の表現なんかを得意とするコンポーネント？
使い方は要検索

#### Should Bounce
Projectile Movement Component > プロジェクタイルバウンス > Should Bounce
跳ね返り有効化

## メモとか感想とか
- オープンソース素晴らしい。コードを読めば分かるの素晴らしい。
- アニメーションまわりは別途まとめようと思う
- 最後の方はだいぶざっくりしてるけど、再度わからなくて調べるようなことがあれば後々更新する予定