ジョイスティックを使ってキャラクターを操作する

#ジョイスティックとは？
レバーによって方向入力が行える装置のことですが、

<img width="670" alt="cap7.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/250946/5b766310-8a1d-cec5-488f-1f30d1dfed75.png">

ここでは上の画像のように、**丸を動かしてキャラクターを操作できるやつ**のことを指します。ジョイスティックの導入と、キャラクターがジョイスティックを動かした向きを向くようにする方法を初心者向けに解説していきます。

#ジョイスティックの導入方法
なんだかとっても大変そうですが、
Asset Storeに無料で提供されている**Simple Touch Controller**を使えば簡単！ まずはこれをImportしましょう。
<img width="960" alt="cap6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/250946/5306d7fc-7cc9-76eb-8f84-7dbda476d604.png">
SimpleTouchControllerに同封されているSceneのExample1~3を参考にしましょう。Exampleでは球を動かすLeftControllerとカメラを動かすRightControllerが搭載されていますが、今回はプレイヤーをバーチャルパッドで動かせるだけなので、LeftControllerのみ使えるようにすれば良いです。
では、どんな操作が必要だったのか説明していきます。

SimpleTouchController>Scenes>Example2を開き、Left SimpleTouch Joystickをコピーして、使いたいシーンのCanvasにペーストします。

これを
<img width="577" alt="cap8.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/250946/83281513-1d6f-463c-957c-95db0a16633c.png">

ここに持ってくる！
<img width="579" alt="cap10.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/250946/473581d6-1067-06b2-3282-5cd337fa0fff.png">

次にプレイヤーにPlayerMoveControllerをつけます。
<img width="322" alt="cap12.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/250946/a54b5454-1ca6-0aa2-8dc4-6784034d03ef.png">

このまま実行するとRight Controllerがないためにエラーになったり、
プレイヤーが正面を向いたまま移動したりしてしまうので、コードを少しいじります。(記事の一番下にPlayerMoveControllerをいじったコードが置いてあります。)
今回使うのはLeft Controllerなので、Right Controllerに関係する式は取っ払ってしまいましょう。
プレイヤーの向きをジョイスティックにと連動させる命令は、
//スティックの倒れた向きを向く の下に書かれているコードで制御しています。

```float v2 = leftController.GetTouchPosition.y; 
float h2 = leftController.GetTouchPosition.x; ```
v2とh2にそれぞれ、Left Controllerのy軸の値とx軸の値をとり、

```if (v2 == 0 && h2 == 0) {
			speed = 0f;
		} else {
			speed = 10f;
		}```
あとLeft Controllerを動かしていないときはspeedが0になるようにしましょう。
勝手に動いてしまいます。

```Vector3 direction = new Vector3(h2,0,v2);
transform.localRotation = Quaternion.LookRotation (direction);```
向きを代入してあげています。

なお、以下のコードには取っ払い損ねているものもありますが、動きには影響ないです。

```C#:PlayerMoveController
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(Rigidbody))]

public class PlayerMoveController : MonoBehaviour {

	// PUBLIC
	public SimpleTouchController leftController;
	public SimpleTouchController rightController;
	public Transform headTrans;
	public float speed;
	public float speedContinuousLook = 100f;
	public float speedProgressiveLook = 3000f;
	public GameObject Message;
	// PRIVATE
	private Rigidbody _rigidbody;
	[SerializeField] bool continuousRightController = true;

	Animator animator;

	void Awake()
	{
		animator = this.gameObject.GetComponent <Animator> ();
		_rigidbody = GetComponent<Rigidbody>();
	}

	public bool ContinuousRightController
	{
		set{continuousRightController = value;}
	}


	void Update()
	{
		// move
		if (Message.activeSelf) {
			speed = 0;
		}else{
			speed = 10f;
		}
			_rigidbody.velocity = new Vector3 (leftController.GetTouchPosition.x, 0, leftController.GetTouchPosition.y) * speed;

// スティックの倒れた向きを向く---------------------------------
		float v2 = leftController.GetTouchPosition.y; //y軸方向の値をとる
		float h2 = leftController.GetTouchPosition.x; //x軸方向の値をとる
		Debug.Log (v2 + ", "+h2);
		if (v2 == 0 && h2 == 0) {
			speed = 0f;
		} else {
			speed = 10f;
		}

        //ジョイスティックが傾いている方向を向く
		Vector3 direction = new Vector3(h2,0,v2);
		transform.localRotation = Quaternion.LookRotation (direction);

		// WalkingFlag
		if (speed == 0f) {
			Debug.Log (speed);
			animator.SetBool ("WalkingFlag", false);
		}else{
			animator.SetBool ("WalkingFlag", true);
		}

	}

	void UpdateAim(Vector2 value)
	{
		if(headTrans != null)
		{
			Quaternion rot = Quaternion.Euler(0f,
				transform.localEulerAngles.y - value.x * Time.deltaTime * -speedProgressiveLook,
				0f);

			_rigidbody.MoveRotation(rot);

			rot = Quaternion.Euler(headTrans.localEulerAngles.x - value.y * Time.deltaTime * speedProgressiveLook,
				0f,
				0f);
			headTrans.localRotation = rot;

		}
		else
		{

			Quaternion rot = Quaternion.Euler(transform.localEulerAngles.x - value.y * Time.deltaTime * speedProgressiveLook,
				transform.localEulerAngles.y + value.x * Time.deltaTime * speedProgressiveLook,
				0f);

			_rigidbody.MoveRotation(rot);
		}
	}
}

```

これで動くはずです。
お疲れさまでした！