3D オブジェクトがクリックされたかどうか検出する方法として、よくあげられているのは Ray を飛ばす方法ですが、実は uGUI と同じ方法でもクリックを判定することが出来ます。
unity 4.6 以前は Ray を飛ばす方法しかなかったようです。さすがに今、4.6 を現役で使用しているプロジェクトはないと思いますが…。
EventSystem を配置する
カメラに Physics Raycaster を追加する
クリック判定するオブジェクトに、以下のスクリプトを張り付ける
using UnityEngine; using UnityEngine.EventSystems; public class ClickObject: MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler { // クリックイベント public void OnPointerClick(PointerEventData eventData) { gameObject.transform.eulerAngles = new Vector3(60, 0 0); } // マウスカーソルが Cube を差した public void OnPointerEnter(PointerEventData eventData) { gameObject.transform.eulerAngles = new Vector3(0, 30 0); } // マウスカーソルが Cube から外れた public void OnPointerExit(PointerEventData eventData) { gameObject.transform.eulerAngles = new Vector3(0, 0 0); } }
実行する
マウスカーソルをキューブに合わせたり、クリックすると回転します。
特定の3Dオブジェクトのみ判定しない
uGui の Raycast Target のように、特定の 3D オブジェクトだけ反応させたい場合、Physics Raycaster の Event Mask を 反応させたいレイヤー のみチェックします。
もちろん、全く反応させたくない場合 None を選べば OK です。
処理速度は Ray より速い、らしい? 必要があれば各自確認してください。
uGUI と同じインターフェイスが 3D で使えるのは便利なので、速度リスクがなければこちらに軍配があがるかな、と(勝手に)思っています。
(昔から unity 使ってる人は、慣れてる Ray を使うだろうとも思う)