[Unity]CrossPlatformInputを使ってみる

# 環境
下記の環境を使用しています。

0. Unity 5.4.1
0. C# 

## 1.下準備
0. [File > Build Settings]から[Android]を選択しSwitch Platform
0. [Assets > Import Package > CrossPlatformInput]を選択、インポート

## 2.オブジェクトを配置
0. [Assets/Standard Assets/CrossPlatformInput/Prefabs]から[MobileSingleStickControl]をヒエラルキーにドラッグ&ドロップ
0. [GameObject > UI > EventSystem]を選択し、EventSystemを追加
0. [Mobile Input > Enable]を選択。（選択出来なければ選択した状態なので問題なし）

基本的にここまで完了すれば動きます。

```Move.cs
using UnityEngine;
using System.Collections;
using UnityStandardAssets.CrossPlatformInput;

public class Move : MonoBehaviour
{
	
    // Update is called once per frame
    void Update()
    {
        var x = CrossPlatformInputManager.GetAxis("Horizontal");
        var y = CrossPlatformInputManager.GetAxis("Vertical");
        transform.position += (Vector3.right * x + Vector3.up * y) * Time.deltaTime;

        if (CrossPlatformInputManager.GetButton("Jump"))
        {
            this.GetComponent<Renderer>().material.color = Color.red;
        } else
        {
            this.GetComponent<Renderer>().material.color = Color.white;
        }
    }
}
```

こんな感じのコードを作って適当に作ったオブジェクトに追加するとこんな感じ。

![screen.gif](https://qiita-image-store.s3.amazonaws.com/0/141550/f7fadf13-7e46-f307-a44e-576fad5e8e06.gif)

# 3.カスタマイズ
## ボタンの追加
0. ヒエラルキーにある**MobileSingleStickControl**の下にいる**JumpButton**をDuplicate
0. Inspectorの**ButtonHandler**のNameの項目を**Fire1**に変更

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/55b66f05-ae47-5ce5-7c46-eef7adbf03d6.png)  ![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/d5b13192-8cad-8c4f-cf57-aadf87dc7cae.png)

これで

```
CrossPlatformInputManager.GetButton("Fire1");
```
的なノリで入力を取得できます。
![screen2.gif](https://qiita-image-store.s3.amazonaws.com/0/141550/50933057-5cd7-9b30-16cb-cc0949c542da.gif)

## スティックの追加
0. ヒエラルキーにある**MobileSingleStickControl**の下にいる**MobileJoystick**をDuplicate
1. Inspectorの**Joystick**のHorizontal Axis Nameを**Mouse X**に変更
1. Inspectorの**Joystick**のVertical Axis Nameを**Mouse Y**に変更

```Move.cs
using UnityEngine;
using System.Collections;
using UnityStandardAssets.CrossPlatformInput;

public class Move : MonoBehaviour
{
	
    // Update is called once per frame
    void Update()
    {
        var x = CrossPlatformInputManager.GetAxis("Horizontal");
        var y = CrossPlatformInputManager.GetAxis("Vertical");
        transform.position += (Vector3.right * x + Vector3.up * y) * Time.deltaTime;

        var x_r = CrossPlatformInputManager.GetAxis("Mouse X");
        var y_r = CrossPlatformInputManager.GetAxis("Mouse Y");
        transform.Rotate(new Vector3(y_r, 0f, x_r) * Time.deltaTime * 30f);
    }
}
```
テスト用のコードをこんな感じにしてオブジェクトを右スティックで回転させる的な事が出来ます。
![screen3.gif](https://qiita-image-store.s3.amazonaws.com/0/141550/7b74210f-fdf7-d215-5701-385fdbde5188.gif)
### カスタマイズの補足
　**ButtonHandler**や**Joystick**で指定した名前は**InputManager**に追加されているものじゃないと**[Mobile Input>Disable]で無効にして実行した時にエラーが発生**します。
なので、追加/変更するときはInputManagerを確認して合わせるなり追加するなりする必要があります。
　また、**Joystick**に関しては**Movement Rangeで可動範囲を調整**したり**Axes To Useで可動方向を制限**したりできます。

# 改善
　この**Joystick**ですがスティックに当たる部分をドラッグする必要が有り、可動範囲内を押しても何も反応しません。その為なんとも言えない操作感と言うかあまり直感的じゃない気がします。
　そこで、可動範囲をタップしたらスティックを移動、そのままドラッグ出来るようにしてみました。
![screen4.gif](https://qiita-image-store.s3.amazonaws.com/0/141550/5a60ec27-7ebd-a72a-d575-dc78769e3fbe.gif)

下記の手順で実装しました。

- Joystick.csをMyJoystick.csとかにまるっとコピペ
- 下記のコードを追加

```MyJoystick.cs
public Transform stick;
```

- **transform.position** を **stick.position** に置換
- OnPointerDownの中身を実装

```MyJoystick.cs
public void OnPointerDown(PointerEventData data)
{
    OnDrag(data);
}
```
- 下図のような感じで設定

　![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/1aca643c-e61c-d6c4-8899-9dc09755041d.png)

　![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/1ac5ebd1-e950-1221-0bd0-d7e62dc134ae.png)　![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/1de28682-2825-c1e8-c15f-889e6cc55d6a.png)

設定で**Joystick.cs**の挙動と切り替えたいときはstickオブジェクトに**Joystick.cs**を追加して

```
CrossPlatformInputManager.UnRegisterVirtualAxis()
```
とか呼んだ後にそれぞれのenable切り替えれば良いと思います。