Unity ジョイスティック(バーチャルパッド)でFPSの移動と視点の操作

#概要と注意
Unityで画面の左右にジョイスティックを表示し、左のジョイスティックでプレイヤーの移動、右のジョイスティックで視点を操作できる様にするスクリプトです。左右どっちをどっちにするかは好きな様に変えられます。UIの位置の問題なので。
※FPS視点のプレイヤーを想定しています。視点操作は欠陥がありますが、これはいずれ修正するかも。


#ジョイスティック(バーチャルパッド)でのプレイヤーの移動のスクリプト

```MoveController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveController : MonoBehaviour {

	Touch touched = new Touch();
	public RectTransform canvas;
	Vector3 touchWorldPos;
	Vector3 startPos;
	int range = 100;
	Vector3 stickPos;
	public CharacterController player;
	int speed = 3;


	// Use this for initialization
	void Start () {
		startPos = transform.position;
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.touchCount > 0) { //タッチされている場合
			for (int i = 0; i < Input.touchCount; i++) {
				touched = Input.touches [i];
				RectTransformUtility.ScreenPointToWorldPointInRectangle (canvas, touched.position, null, out touchWorldPos);
				if (Vector3.Distance (touchWorldPos, startPos) < range) {
					transform.position = touchWorldPos; //タッチしてる点に画像がくる様にする
					//playerを動かす
					CollisionFlags cf= player.Move(new Vector3(speed * Time.deltaTime * ((touchWorldPos.x - startPos.x)/range), 0, speed * Time.deltaTime * ((touchWorldPos.y - startPos.y)/range)));
				}
			}
		} else { //タッチされていない場合→スティックを元の位置に戻す
			transform.position = startPos;
		}
	}
}
```
以下の画像の様にImageのUIに`MoveController.cs`をアタッチします。
それぞれ変数もInspectorビューからアタッチ。
<img width="324" alt="パーチャルパッド.png" src="https://qiita-image-store.s3.amazonaws.com/0/173366/039f0e1a-ff69-14bc-c514-120d89780e02.png">

rangeの値を大きくするとジョイスティックの範囲を広げられます。

#ジョイスティック(バーチャルパッド)でのプレイヤーの回転の操作のスクリプト

```FPSCameraController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FPSCameraController : MonoBehaviour {

	Touch touched = new Touch();
	public RectTransform canvas;
	Vector3 touchWorldPos;
	Vector3 startPos;
	int range = 100;
	Vector3 stickPos;
	public GameObject player;
	int speed = 100;

	// Use this for initialization
	void Start () {
		startPos = transform.position;
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.touchCount > 0) { //タッチされている場合
			for (int i = 0; i < Input.touches.Length; i++) {
				touched = Input.touches [i];
				RectTransformUtility.ScreenPointToWorldPointInRectangle (canvas, touched.position, null, out touchWorldPos);
				if (Vector3.Distance (touchWorldPos, startPos) < range) {
					transform.position = touchWorldPos; //タッチしてる点に画像がくる様にする
					//カメラを動かす
					//垂直方向の回転
					player.transform.Rotate(transform.right, -speed * Time.deltaTime * ((touchWorldPos.y - startPos.y)/range));
					//水平方向の回転
					player.transform.Rotate(transform.up, speed * Time.deltaTime * ((touchWorldPos.x - startPos.x)/range));
					print(player.transform.localRotation);
				}
			}
		} else { //タッチされていない場合→スティックを元の位置に戻す
			transform.position = startPos;
		}
	}
}
```

以下の画像の様にImageのUIに`MoveController.cs`をアタッチします。
それぞれ変数もInspectorビューからアタッチ。

<img width="325" alt="バーチャルパッド2.png" src="https://qiita-image-store.s3.amazonaws.com/0/173366/1faf29f4-20ec-97e4-5ccd-b58ccd931bec.png">

rangeの値を大きくするとジョイスティックの範囲を広げられます。

#調整
スタンダードアセットの`FirstPersonController.cs`のプレイヤーの回転の記述と`FPSCameraController.cs`の記述が衝突して動かなくなるので`FirstPersonController.cs`の一部をコメントアウトします。

```FirstPersonController.cs
private void RotateView()
{
    //↓↓↓FPSCameraControllerの回転と衝突するのでコメントアウト
    //m_MouseLook.LookRotation (transform, m_Camera.transform);
}
```