[Unity] ブロック崩しをあのアプリ風にする #4 開発画面とスマホ両方に対応する入力

今回は入力の作成です。
Unityはいろんなプラットフォームに対応していてそれはそれで便利なんですが、開発画面では主にマウス、スマホで操作するならタッチ操作になります。

最終的にスマホで動かすことを前提で作っているのでタッチを取得できるInput.touchesを使っていきたいところなんですが、これはマウス操作には反応しません。いちいちスマホを繋いでデバックするのも時間がかかるし面倒です。
というわけでその辺をうまいこと吸収しつつ様々なジェスチャーを簡単に実装できるTouchScriptというアッセトを使います。

ポケモンGO にも使われているとかで有名らしい。
もちろん無料です。

TouchScript

Assets Storeからダウンロードしてインポートしてください。
インポートするとprojectにTouchScriptというフォルダができます。

このTouchScript、少し癖があるというか、最初はちょっとわかりづらかったです。
基本的には
  1. ヒエラルキーにTouchManagerを置く
  2. 反応させたいオブジェクトに専用レイヤーをつける
  3. 対応したいスクリプトをつける(タップやスライドなど)
という流れです。
今回は画面全体がタッチされた場合を拾います。

ヒエラルキーにTouchManagerを置く

TouchScript > Prefabs > TouchManager これをヒエラルキーに置く。
この時同じフォルダにCursorsというPrefabがあります。これをヒエラルキーに置いておくとタッチした場所を視認しやすくしてくれます。
置かなくても問題ないです。


タッチされた通知を取得する

CreateEmptyで名前をInputControllerとしておく。
TouchScript > Scripts > Gestures > TapGesture をつける。
TouchScript > Scripts > Layers > FullscreenLayer をつける。

これで画面がタップされたらTapGestureに通知が来ます。
特定のオブジェクトがタッチされたかどうか知りたい場合は、そのオブジェクトにStandardLayerをつけます。その際Coliderもつけていないと検知しません。FullscreenLayerはどのオブジェクトにもキャッチされなかった場合に最終的に通知されるレイヤーです

通知を受け取れるようにInputControllerとういう名前でスクリプトをつけます。
これはテストなのであとで書き換えます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TouchScript.Gestures;

public class InputController : MonoBehaviour {
     public GameObject ball;

    // オブジェクトが有効化されたときに呼ばれる
    private void OnEnable()
    {

    // eventにイベントハンドラを登録する
        GetComponent<TapGesture>().Tapped += OnTapHandler;

    }

    // オブジェクトが無効化されたときに呼ばれる
    private void OnDisable()
    {

     // eventからイベントハンドラを削除する
        GetComponent<TapGesture>().Tapped -= OnTapHandler;
    }
        
    //タップのハンドラ
    private void OnTapHandler(object sender, System.EventArgs e) {
        //ここにさせたい処理を書く
        Instantiate(ball,0,1,0);
    }
}

using TouchScript.GesturesでTapGestureを使えるようにしておきます。
正直eventってなんぞや?ってレベルだったので軽く詰みかけました。デリゲートの一種でメソッドを登録しておけるメソッド、と思っていおて良さそうです。この場合TapGestureコンポーネントにOnTapHandlerメソッドを登録してるのでタップされた時に呼び出してくれるわけです。
とりあえず動くかどうか確認するために、タップしたらボールを生み出すようにしてみました。インスペクターからBallプレハブを登録して再生してみます。


うまくいってるので次回は修正しつつ実装していきます。
2連続でアセット紹介みたいになっちゃった。

コメント