[Unity]TouchScriptでフリックを検知する

最近Unityを触り始めました。
Unityに関してはど素人なので、モバイル端末でタッチとかフリックはどうやるのかわからなかったので調べてみたところ、TouchScriptなるものがAssetStoreにありました。しかも無料ということで早速試してみた。

*環境*
・Unity5.3

*共通*
プロジェクトを作成したらAssetStoreでTouchScriptを検索してプロジェクトにインポートします。
![touchscript.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/c70aad56-9acd-421c-8cac-5814b274c142.png)
![menu.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/d1bf377e-0211-f0c3-5e2a-0d955c10c01c.png)
こんな感じでインポートされた。

次に空のGameObjectを作成し、TouchScriptのTouchManager,MouseInput,MobileInputをコンポーネントに追加及び、Main CameraにCamera Layerを追加する。

GameObject
![cap2.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/5dcddd48-9b21-ebf7-6e32-153ab67a69f4.png)
*TouchManagerのTouchLayersにはMainCameraにCameraLayerを追加するとMainCameraが表示されるようになります。

MainCamera
![cap1.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/2310b5d2-dd52-e329-cb45-cd086bc42662.png)

今回はHierarchyにCubeを追加し、適当な名前でscriptをコンポーネントに追加します。今回はCubeControllerとしました。
![controller.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/fab8d868-5e5f-fecd-deb6-b6233372c8d7.png)


*タッチの検出*
CubeにTouchScriptのTapGestureをコンポーネントに追加します。
![controller2.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/bdbaa6a6-439f-a5e3-22b9-4c4aad7c5169.png)

CubeControllerに下記を実装

    private void OnEnable()
    {
        GetComponent<TapGesture>().Tapped += HandleTapped;
    }

    private void OnDisable()
    {
        GetComponent<TapGesture>().Tapped -= HandleTapped;
    }

    void HandleTapped(object sender, System.EventArgs e)
    {
        Color color = Color.red;
        this.GetComponent<Renderer>().material.color = color;
    }

この状態で実行し、画面に表示されたCubeをタップするとCubeが赤くなります。(見づらくてすみません)

タップ前
![beforetap.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/3a1fd993-1787-8765-9eee-71831e844124.png)

タップ後
![aftertap.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/8222a746-cd66-4415-f235-e98eb740644a.png)

*フリックの検出*
CubeにTouchScriptのFlickGestureをコンポーネントに追加します。
![cap3.PNG](https://qiita-image-store.s3.amazonaws.com/0/108650/30d75a94-2ddd-0dbb-2b9a-acf029274263.png)

CubeControllerに下記を実装

    private void OnEnable()
    {
        GetComponent<FlickGesture>().StateChanged += HandleFlick;
    }

    private void OnDisable()
    {
        GetComponent<FlickGesture>().Flicked += HandleFlick;
        GetComponent<FlickGesture>().MinDistance = 1f;
        GetComponent<FlickGesture>().FlickTime = 0.3f;
    }

    void HandleFlick(object sender, System.EventArgs e)
    {
        var gesture = sender as FlickGesture;

        if (gesture.State != FlickGesture.GestureState.Recognized)
            return;

       if(gesture.ScreenFlickVector.x < 0){
            Left();
        }else if(gesture.ScreenFlickVector.x > 0)
        {
            Right();
        }
    }

    private void Right()
    {
        this.transform.position += new Vector3(0.1f, 0, 0);
    }

    private void Left()
    {
        this.transform.position += new Vector3(-0.1f, 0, 0);
    }

この状態で実行し、画面に表示されたCubeをフリックするとフリックした方向に0.1程Cubeが動きます。


*感想*
TouchScriptのFlickのサンプルが全然なくて、参考通りに実装しても検知してくれなかったり、期待した動作をしてくれなかったりした。試行錯誤した結果、フリックを実装するときはMinDistanceとFlickTimeの設定が重要で、FlickTimeで設定した時間内にMinDistanceで設定した距離以上動かせばフリックとして検知されるっぽい。検知にうまくいかなかった場合を想定してHandleFlickで検知したステータス以外では処理をさせないようにすることで期待した動きができるようになりました。
日本語でTouchScriptを扱った記事は少ないので助けになれば幸いです。