タッチパネル対応

確認済のバージョン: 5.5

-

難易度: 初級

この回はモバイル編第02回終了時点のプロジェクトを使用します。

3.1 タッチパネルに対応させる

モバイルの多くはキーボードによる操作ではなく、タッチパネルによる操作でゲームをプレイします。

そのためゲーム制作編の[[03. プレイヤーから弾を撃つ]]で行ったXキーでゲームスタートを画面をタッチしたらゲームスタートというように変更を行います。

Unity Remote

今回、Unity Remoteというアプリを使用すると、簡単にタッチ対応の確認ができます。

Unity Remote

Unity RemoteはAndroidやiOSゲームを作成する際に、Unity Editorのゲームビューに表示されているゲームの動きを端末上で確認することが出来るアプリです。ただ確認するだけではなく、タッチ情報やジャイロなどのセンサー系なども取得することが出来ます。これにより、プロジェクトをビルドすることなく、モバイル特有の動作を確認することが可能です。

USBケーブルでモバイル端末とPCをつなげることでUnity Remoteを使用することができます。

もし、うまくいかない場合は一度Unity Editorを再起動してみてください。

タイトルの変更

タイトルの「Press X」を「Tap To Start」へ変更します。ゲームオブジェクト名とGUI TextコンポーネントのTextをTap To Startへ変更してください。

Touchクラスでタッチ情報を取得する

タッチ情報を取得するにはTouchクラスを使用します。それに加え、エディター上でも動かせるようにマウスクリックでゲームをスタートさせるようにしてみましょう。

Manager.cs


using UnityEngine;

public class Manager : MonoBehaviour
{
  // Playerプレハブ
  public GameObject player;

  // タイトル
  private GameObject title;

  void Start ()
  {
    // Titleゲームオブジェクトを検索し取得する
    title = GameObject.Find ("Title");
  }

  void Update ()
  {

    for (int i = 0; i < Input.touchCount; i++) {

      // タッチ情報を取得する
      Touch touch = Input.GetTouch (i);

      // ゲーム中ではなく、タッチ直後であればtrueを返す。
      if (IsPlaying () == false && touch.phase == TouchPhase.Began) {
        GameStart ();
      }
    }

    // ゲーム中ではなく、マウスクリックされたらtrueを返す。
    if (IsPlaying () == false && Input.GetMouseButtonDown (0)) {
      GameStart ();
    }
  }

  void GameStart ()
  {
    // ゲームスタート時に、タイトルを非表示にしてプレイヤーを作成する
    title.SetActive (false);
    Instantiate (player, player.transform.position, player.transform.rotation);
  }

  public void GameOver ()
  {
    FindObjectOfType<Score> ().Save ();
    // ゲームオーバー時に、タイトルを表示する
    title.SetActive (true);
  }

  public bool IsPlaying ()
  {
    // ゲーム中かどうかはタイトルの表示/非表示で判断する
    return title.activeSelf == false;
  }
}


ゲームを再生してみましょう。ゲームビュー上でマウスクリック、Unity Remote上で画面をタップしてゲームが開始すれば正常です。

Eventからタッチ情報を取得する

Touchクラスでタッチ情報を取得しましたが、次はEventクラスを利用してタッチ情報を取得します。

Updateメソッドは削除して、OnGUIメソッドを作成してください。Eventクラスのイベント情報はOnGUIメソッドの中で扱うことが可能です。

Manager.cs


using UnityEngine;

public class Manager : MonoBehaviour
{
  // Playerプレハブ
  public GameObject player;

  // タイトル
  private GameObject title;

  void Start ()
  {
    // Titleゲームオブジェクトを検索し取得する
    title = GameObject.Find ("Title");
  }

  void OnGUI ()
  {
    // ゲーム中ではなく、タッチまたはマウスクリック直後であればtrueを返す。
    if (IsPlaying () == false && Event.current.type == EventType.MouseDown) {
      GameStart ();
    }
  }

  void GameStart ()
  {
    // ゲームスタート時に、タイトルを非表示にしてプレイヤーを作成する
    title.SetActive (false);
    Instantiate (player, player.transform.position, player.transform.rotation);
  }

  public void GameOver ()
  {
    FindObjectOfType<Score> ().Save ();
    // ゲームオーバー時に、タイトルを表示する
    title.SetActive (true);
  }

  public bool IsPlaying ()
  {
    // ゲーム中かどうかはタイトルの表示/非表示で判断する
    return title.activeSelf == false;
  }
}


ゲームを再生してみましょう。ゲームビュー上でマウスクリック、Unity Remote上で画面をタップしてゲームが開始すれば正常です。