Unity5版Standard Assetsを使って仮想ジョイスティックを実装

Unity5をインストールすると最初から入っているStandard AssetsのCrossPlatformInputのパッケージを使用してジョイスティックを実装しようとしてハマったのでメモ。過去のバージョンのAssetに関する情報は割と出回っているが、現段階で情報を得るのにも骨が折れました。

今回は公式の2Dシューティングのチュートリアルプロジェクトをサンプルに実装方法を紹介していきます。

Unity4.6向けの情報をお探しの方は[このへん](http://tsubakit1.hateblo.jp/entry/2014/10/09/035003)を参考にしてください。

##環境
Unityのバージョン：5.0.1f1
Standard Assetsのバージョン：1.0 (Mar 25, 2015)
https://www.assetstore.unity3d.com/jp/#!/content/32351
使用サンプルコード：[Unity公式の2Dシューティングチュートリアル](http://japan.unity3d.com/developer/document/tutorial/2d-shooting-game/)

##実装
###パッケージのインポート
![Assets_と_Menubar.jpg](https://qiita-image-store.s3.amazonaws.com/0/44209/f4608e92-05f6-c1b2-e1bd-23ce7dac915c.jpeg "Assets_と_Menubar.jpg")

メニューバーの`Assets > Impor Package > CrossPlatformInput`をクリックします。すると小さいウィンドウが現れるのでImportをクリック。

###prefabの追加
無事インプットが済んだら`Assets/StandardAssets/CrossPlatformInput/Prefabs`に入っている`MobileSingleStickControl`をHierarchyに追加します。

追加後のゲーム画面はこんな感じ。

![Stage_unity_-_12_ShootingGame_-_Android__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/44209/4cddf19f-8a35-16d3-12ea-3f460b558abc.jpeg "Stage_unity_-_12_ShootingGame_-_Android__Personal_.jpg")

青色のがジョイスティックで、白いのがジャンプボタンです。今回ジャンプボタンはいらないので消してしまいましょう。

![delete.jpg](https://qiita-image-store.s3.amazonaws.com/0/44209/3600bc1c-a2df-3c7a-299c-b851d5231433.jpeg "delete.jpg")

###Player.csをいじる
ジョイスティックの動きを自機の移動に反映するためにPlayer.csを以下のように変更します。変更はusingディレクティブとUpdateメソッドに関する2点です。

```
using UnityStandardAssets.CrossPlatformInput;
//Joystick.csとPlayer.csの仲介をするCrossPlatformInputManagerを使うために名前空間を指定

public class Player : MonoBehaviour
{

////////////中略////////////

	void Update ()
	{
		// 右・左
		float x = CrossPlatformInputManager.GetAxisRaw("Horizontal");

		// 上・下
		float y = CrossPlatformInputManager.GetAxisRaw("Vertical");

		// 移動する向きを求める
		Vector2 direction = new Vector2 (x, y).normalized;

		// 移動の制限
		Move (direction);

	}
	
	////////////中略////////////
}	
```

この段階でプレイしてみましょう。
……ジョイスティックを動かしても何も起きませんね。
もう少し作業が必要になります。

###EventSystemの追加
このままではスティックが動いてくれないので、EventSystemというGame Objectを追加します。メニューバーの`GameObject > UI > Event System`をクリックして追加します。

![event.jpg](https://qiita-image-store.s3.amazonaws.com/0/44209/712be3f8-11b6-0d68-b573-40d0c2667130.jpeg "event.jpg")

追加できたら早速実行してみましょう。

![game2.jpg](https://qiita-image-store.s3.amazonaws.com/0/44209/f7767e04-b7bd-c5cf-37f6-a916de213f53.jpeg "game2.jpg")

操作してみるとジョイスティックが画面の左下に移動してなんだか気持ち悪いですね。このままだと左と下には移動できないので、対策が必要です。

###Joystick.csをいじる
Projectから`Assets/StandardAssets/CrossPlatformInput/Scripts/Joystick.cs`を開いてください。

28行目の`OnEnable()`を`Start()`に変えてください。

そうすることで動きが改善されたはずです。

###操作性を向上する
これだけでも一応遊べるのですが、ジョイスティックの移動の程度が動きに反映されないので少し気持ち悪く感じられると思います。ですので、ジョイスティックが小さく動けば自機を少し動かし、ジョイスティックが大きく動けば自機を大きく動かすように変更したいと思います。

先ほどいじったPlayer.csのUpdateメソッドを少し変更するだけです。具体的にはベクトルの正規化をしないようにしてやります。

```
	void Update ()
	{
		// 右・左
		float x = CrossPlatformInputManager.GetAxisRaw("Horizontal");

		// 上・下
		float y = CrossPlatformInputManager.GetAxisRaw("Vertical");

		// 移動する向きを求める
		//Vector2 direction = new Vector2 (x, y).normalized;
		Vector2 direction = new Vector2 (x, y);

		// 移動の制限
		Move (direction);

	}
```

こうすることで操作性を向上することができました。

~~ジョイスティックがデカくて邪魔ななので、ついでにコイツのサイズを小さくしましょう。まずHierarchyよりMobileSingleStickControl > MobileJoystickを選択します。
インスペクタからScaleをx,y,zすべて0.5にしてやります。~~
*実機で動かしてみるとそんなの大きくなかったです。*

以上を適用すると画面はこのようになります。

![final.jpg](https://qiita-image-store.s3.amazonaws.com/0/44209/25c1424c-b9f9-8cd8-7bf7-e3d65f10969e.jpeg "final.jpg")

お疲れ様でした！

##参考文献

* [how to use Cross platform input MobileSingleStickControl](http://answers.unity3d.com/questions/943332/how-to-use-cross-platform-input-mobilesinglestickc.html)
* [Asset MobileSingleStickControlのバーチャルスティックが消える](http://unitymemonote.blogspot.jp/2015/03/asset-mobilesinglestickcontrol.html)
* [Unity5のMobileSingleStickControlが左下隅に貼り付く時の解決法](http://ameblo.jp/wancozure-apps/entry-12003253679.html)
* [SampleAssetsのバーチャルジョイスティックを試す](http://blog.cosmocleaner.info/unity_sampleassets_joystick/)