[Unity]NGUIで何もないところの入力を受け取る方法

唐突ですが、UnityのTipsコーナーはじめるよー!

さて、NGUIといえばAsset Store史上最強ですが、高機能なことがドカっと書かれているので、意外と知らないことも多いんじゃないでしょうか。

そんな機能の一つである、UICamera.fallThrough の使い方を紹介してみます。
(現在Asset Storeで最新版であるNGUI 2.5.1を使って動作確認しました)

まずは基礎として、UICameraでのマウスやタッチの入力についてですが。
これは、NGUIちゃんがいろいろ裏でやってくれて、複数のUICameraからレイを飛ばして、結果的に画面の一番手前にあるColliderにメッセージを飛ばしてくれるようになっています。
なので、UI Rootとかナシに普通の3DカメラとかにもUICameraを割り当てれば、そのカメラから見た一番手前のコリジョンをタッチとかできるようになるわけです。

あれ? でも、むしろ何もないところをタッチしたメッセージが欲しいんですけど?
と疑問に思うときがあります。
シューティングゲームでタッチした位置に向かってショット!とか。
そのためにわざわざColliderを用意するのもいいですが、正直画面サイズの問題だとか、他にタッチしたいオブジェクトがあるとかで、Colliderのサイズや位置を考えるのが面倒だったりもしますよね。

そこで登場するのが、UICamera.fallThrough!
staticなので、シーンに1つのみ設定できます。
どのUICameraから見てもタッチできるオブジェクトがなかった場合に、このfallThroughで指定したGameObjectにメッセージが飛ぶようになります。
実際にメッセージを受け取るには、↓のようなスクリプトを用意します。

using UnityEngine;
using System.Collections;

public class NGUIFallThroughCatcher : MonoBehaviour
{
    void OnEnable()
    {
        UICamera.fallThrough = gameObject; // ここ重要!テストに出ます(きっと)
    }

    void OnDisable()
    {
        UICamera.fallThrough = null;
    }

    void OnHover(bool isOver)
    {
        Debug.Log("OnHover(" + UICamera.currentTouchID + ") : " + isOver);
    }

    void OnPress(bool pressed)
    {
        Debug.Log("OnPress(" + UICamera.currentTouchID + ") : " + pressed);
        Debug.Log("Screen Position : " + UICamera.currentTouch.pos );

        if (!pressed && UICamera.currentTouch.current)
        {
            Debug.Log("PullHover : " + UICamera.currentTouch.current.name);
        }
    }

    void OnClick()
    {
        Debug.Log("OnClick(" + UICamera.currentTouchID + ") : ");
    }

    void OnDoubleClick()
    {
        Debug.Log("OnDoubleClick(" + UICamera.currentTouchID + ") : ");
    }

    void OnSelect(bool selected)
    {
        Debug.Log("OnSelect(" + UICamera.currentTouchID + ") : " + selected);
    }

    void OnDrag(Vector2 delta)
    {
        Debug.Log("OnDrag(" + UICamera.currentTouchID + ") : " + delta);

        if (UICamera.currentTouch.current)
        {
            Debug.Log("DragHover : " + UICamera.currentTouch.current.name);
        }
    }

    void OnDrop(GameObject go)
    {
        Debug.Log("OnDrop(" + UICamera.currentTouchID + ") : " + go.name);
    }

    // ここから下、必要なのかわからないけど、とりあえず書く
    void OnInput(string text)
    {
        Debug.Log("OnInput(" + UICamera.currentTouchID + ") : " + text);
    }

    void OnSubmit()
    {
        Debug.Log("OnSubmit(" + UICamera.currentTouchID + ") : ");
    }

    void OnScroll(float delta)
    {
        Debug.Log("OnScroll(" + UICamera.currentTouchID + ") : " + delta);
    }
}

手前にボタンがあったりすると呼ばれず、何もないところをタッチしたときだけ呼ばれるのが確認できると思います。
また、currentTouchIDがタッチした指番号やマウスの左ボタンや右ボタン。
UICamera.currentTouchに実際にタッチした位置情報などが入っています。

※これらOnPressとかのメソッド自体は、単にNGUIのメッセージ受け取りメソッドでしかないので、UI Rootとかナシに普通のカメラにUICameraアタッチした場合とかでも使えますよ!

ここからさらに、OnDragの呼び出しなしにOnPress(false)だったらタップ入力~とか、拡張していくと便利なタッチジェスチャー機能にも出来そうです。
細かいところにも配慮が行き届いてるNGUIちゃん。すばら!

というわけで、ケットシーウェアもやっぱり流行のUnityを使ってゲーム開発しちゃおうってことになりました!
フリー版+Androidライセンスだけどな!

Unityのアセット販売中!

ステートマシンの状態遷移やパラメータはエディタで編集でき、
ゲームロジックに依存するステートの挙動はスクリプトで記述可能なエディタ拡張。

詳細はこちら

RPGツクールVXやWOLF RPGエディターのオートタイルに準拠したエディタ拡張。

詳細はこちら

オススメ!