UE4で『PONG』もどきを作った時に詰まったところメモ

## はじめに
タイトルにはPONGを作ったとか書いてるけど、記事の内容自体は詰まったところなので、特に制作過程をどうこう書いてるわけではないことをご了承いただきたい

## 詰まったところ・気になったところ
### プレイヤーの自動スポーンをやめたい
GameModeのDefault Pawnに設定したPawnが実行時に自動で生成されるのが気持ち悪かったので、対処法を調べてみた
参考URL: [UE4 Default PawnとSpectator Pawnについて](http://unrealengine.hatenablog.com/entry/2016/04/24/235447)
Pawnを継承したオブジェクトの`Auto Possess Player`というタブの値を`Player 0`に設定すればいいらしい
こうすることで、ID0の`Player Controller`が所有するPawnとなり、自動でDefault Pawnが生成されなくなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/4d2ba15a-d56e-1dc1-6879-a24f8a091a2e.png)

### 衝突を検知してくれなかった
原因は、なんとなく`AddActorWorldOffset`を使用していたのが原因
しっかりと物理挙動に則って移動させようね！という話だった(多分)
なので、今回はphysicsのvelocityを随時更新することによって解決
↑の処理をTickイベントでおこなわなかったために、おかしな共同をしていたのもメモ
[ Tick関数がどう処理されているかUnrealC++を追ってみよう!](http://www.cc2.co.jp/blog/?p=17912)

## インプットの設定
プロジェクト設定 ＞ インプット ＞ Binding
ここで独自のインプットイベントを定義できるので覚えておくべし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/97899e80-8a75-f073-d202-806b2585afb0.png)

### インプットの設定でやらかしたこと
色々試している途中で複数のPawnの`Auto Posses Player`を同じ値に設定してしまっていた(`Player 0`とか)
すると、最後にコンパイルしたブループリントが設定の対象になるようで、意図しない挙動をすることがあった


## ローカルマルチプレイを実現したい
PONGは1画面を2人が共有して操作するゲームなので、とりあえずプレイヤーを2人分作成して別々の操作をできるようにしたい
###  2人分のプレイヤーを用意する
ブループリントで`Create Player`を呼ぶと勝手にプレイヤーが生成されて、ローカルマルチが実現する。すごい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/a6719e08-7971-5a7d-b917-44d5dcacb5b2.png)
ちなみに今回はゲームの仕様上使わないと思うけど、一応知見として覚えておいて損はないかなと思う

### 1画面を2人で共有する
`CreatePlayer`を実行すると勝手に画面が分割されるのを止めさせたい
プロジェクト設定の`Use SplitScreen`にチェックが入っていると自動で画面が分割されるらしい
参考URL: [マルチプレイで画面分割をしないと、1P側カメラが有効になる](http://imoue.hatenablog.com/entry/2017/10/23/003703)

#### 落とし穴
#### その１
レベル内に設置されている`Auto Possess Player`を２つとも同じ`Player 0`に設定すると、当然ながらどちらか片方のみが入力をうけつけるようになる。あくまで`PlayerController`と所有するPawnの関係は1対1ということなんだと思う
#### その2
参考URLにも書いてあったことなのだけど、今回PONGを作成するにあたって、キーボード１つで2人分の操作をする予定だったが、↑の方法だと１P側がキーボード入力受付を専有してしまい、２P側にインプットイベントが送信されなくなるという落とし穴がある
なので、1P側で入力を受付、2P側のPawnに対して移動量の値を設定してあげる的なことをしなくてはならない
UE4の闇感あるなと思った

## 変数について
### privateと目のマークの違い

|private|目のマーク|
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/ac39b98c-a206-de62-9980-14e7530b9538.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/f0eaad50-c8f7-a54d-c732-11a757ed8464.png)|

> [ブループリント変数 | Unreal Engine ドキュメント](https://docs.unrealengine.com/ja/Engine/Blueprints/UserGuide/Variables/index.html)
> ・private
> この変数をプライベートにします (派生ブループリントによる修正不可)。
> ・目のマーク
> 変数を [Editable (編集可能)] に設定すると、変数が存在するブループリントの外部から変数を修正することができます。

privateは継承うんぬんした時に派生先では見れるか否か、目のマークはエディタ上で値を操作できるようにするかの設定

## レベル間の遷移をしてみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/ac462b0d-d0fa-10c9-e9d3-2c14fb750ace.png)
これだけ
関数内では使用できないので注意が必要

## 音の再生
### SE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/ec70ddc1-5a54-d90e-d5cc-fb3aef4e454a.png)
これだけ
対応してる形式が、なんとwavオンリー(?)多分

### BGM
1. BGMにしたいコンテンツを右クリックしてキューに追加を選択  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/bf143567-f296-c1bb-4456-a862b96cb646.png)
1. こんな感じのキューが新たに作成されるのでレベル内に配置  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329073/22f6aa12-23c0-c72a-d681-e77c8c847e58.png)
1. おわり

## ...
多分自分以外が見たら、いまいちよくわからない内容になってるんじゃないかなーとは思ってるのでそのうち内容整理とかもしたいとか思ったり思わなかったり