FPSゲームにPS4コントローラーを用いて操作する

#前提
前提として，FPSゲームをStandard AssetのFPSCharacterを用いて

動作させているという条件で考えていきます．

#PS4のコントローラで視点を動かす
PS4のコントローラの右joyStickで視点を動かす方法を考えていきます．

まず Unityのタブ **Edit -> Project Settings -> Input** の順番でInput Managerを開く
<img width="413" alt="スクリーンショット 2019-08-18 16.37.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207868/5940afc3-dec8-3b27-63f1-07ae2807f754.png">

すると，Inspector ViewにInputManagerが下の画像のようにでてきます．

このInputManagerでPS4のコントローラの値を取れるように設定していきます．<img width="325" alt="スクリーンショット 2019-08-18 16.43.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207868/b7c61e88-fd5c-00a7-d227-709da0b2c1c0.png">

まず，普段FPSを操作するときにマウスの動きで視点を操作すると思うのでその部分をjoyStickで操作できるようにしていきます．

なので，まずInputManagerのSizeを20にします．

そして最後2つのCancelの2つを変えていきます．

このように変更してください．
<img width="312" alt="スクリーンショット 2019-08-18 16.46.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207868/ea4ffd3e-151d-5d7d-4e1e-bee9a451d32a.png">

特に変更した部分は **Name, Positive Button, Gravity, Dead, Sensitivity, Invert, Type, Axis** を変更したと思います．

##なぜ，元々存在するMouse X, Mouse Yを使わないのか
元々存在するMouseXとMouseYを使わないのかと言うと

本来のMouseによる操作を変更してしまうので，PS4のコントローラを使わないときに

動作しなくなってしまうのでマウスによる操作ができるように残しています．

なので既存のMouseXとMouseYを上のように設定を変えてしまうと

Mouseで操作ができなくなってしまうので気をつけてくださいね．

さあ，この設定をするだけで視点の操作が可能になったと思います．

##MouseYだけInvertにチェックする理由
PS4コントローラで右joyStickを操作するときに

Y軸の値の取得が上に動かすと値がnegative(マイナス)の値を取得し，

下に動かすと値がpositive(プラス)の値を取得するので

その符号を逆転する為にInvertにチェックしています．

#PS4コントローラで自分自身を前後左右に動かす
視点操作と同様に **Edit -> Project Setting -> Input** でInputManagerを開く

次に，動きを与えてる部分を変更していきます．

このように変えてください．

変更する部分は，Mouse ScrollWheelの次にある **Horizontal**と**Vertical**の2つを変更します．
<img width="314" alt="スクリーンショット 2019-08-18 17.11.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207868/ddd285eb-83c7-9bd3-a848-d63bcb113366.png">

特に変更している部分は **Invert, Type, Axis** だと思います．たぶん笑

なぜVerticalだけInvertにチェックをしたのかというと

先ほどのMouseYのInvertにチェックしたのとほぼ同じ理由です．

#○ボタン銃弾が打てるように設定する
人によって設定は銃弾の設定はまちまちだと思いますが

僕は左クリックで銃弾が打てるように制御していたので

このようにスクリプトを書いていました．

```csharp:gun.cs

if (Input.GetMouseButtonDown (0)) {
			audioSource.Play (); //銃声
			Shot (); //撃った時の関数
			Instantiate (explosion, transform.position, Quaternion.identity); //煙を出す
		}
```

これをPS4の○ボタンで撃てるようにする為にこのコードを付け加えます

```csharp:gun.cs

if (Input.GetMouseButtonDown (0) || Input.GetButtonDown("Fire3")) {
			audioSource.Play (); //銃声
			Shot (); //撃った時の関数
			Instantiate (explosion, transform.position, Quaternion.identity); //煙を出す
		}
```

Input.GetButtonDown("Fire3")を追加しました．

##"Fire3"のボタンとはなんぞや
InputManagerでこのような設定になっていると思います．
<img width="309" alt="スクリーンショット 2019-08-18 17.25.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207868/d3bd471d-f2e4-eed9-cbce-12d8f33e624b.png">

ここで注目してほしいのは **Positive Button** の部分.

この部分に入っているのが **"joystick button 2"** 

なぜ，joystick button 2なのかと言うと，Unity側でPS4の○ボタンが押されたときに

自動的にjoystick button 2に置き換えられているのでこのようにしています．

これで○ボタンで撃てるようになります．

#最後に
PS4の書くボタンを割り当てとして参考にした記事を貼っておきます．

[UnityでPS4コントローラ(DuelShock4)を使う](https://qiita.com/o_s_t/items/c18edeeee869d42c6eb9)

ただ，この記事は少しJoyStickの値の取得部分で間違っている？ので

実際取得している値を確かめたい場合はAsset StoreでこのAssetをインポートして確かめました．

[Controller Tester(Asset Store)](https://assetstore.unity.com/packages/tools/input-management/controller-tester-43621?aid=1101l3qAY&utm_source=aff)

このAsset内の **controller Test** のシーンで実際に

PS4コントローラのいろんなボタンを押したときに

どのボタンの名前として押されて返ってくるのかを

確かめることができるので実際に確かめてみてください．

これがわかればjumpをする際にどのボタンをどのボタンに対応させればいいのか応用が効くはずです．

頑張ってみましょう．