うらしたやわらか

主にUnity関連のメモなど

NGUIと3D空間のRaycastHitを同時に扱う

3Dゲームの場合、3D空間上のオブジェクトにクリック判定を設けたい場合があるかと思います。

 

例えばチェスのようなボードゲームを作ろうとしていて、3Dの駒をクリックして動かす等。その場合は大体以下のような感じでクリックを取得することが多いかと。

void Update()

{

    Ray ray;

    RaycastHit hit;

    ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if(Physics.Raycast(ray, hit, 100)){

        GameObject go = hit.collider.gameObject;

    }

}

 この場合、NGUIのボタン等をクリックした際にその下にコライダ付きの3Dオブジェクトがあると反応してしまいます。

NGUIのボタンをクリックしたときはそっちに反応して欲しくない場合、以下のように記述することで解決できます。

void Update()

{

    if(UICamera.lastHit.collider != null){

        return;

    }

    Ray ray;

    RaycastHit hit;

    ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if(Physics.Raycast(ray, hit, 100)){

        GameObject go = hit.collider.gameObject;

    }

}

要はNGUIで何かマウス判定があったときは、UICamera.lastHit.colliderにヒットしたオブジェクトのコライダが入っているはずなので、それの有無をチェックしてます。

とりあえずこう書いたら上手くいったので、処理順とかは特に追ってないです。

コライダ付きのUISprite等で画面を覆えばそのまま3Dの判定も含めてマスクしてくれるので便利。