ボタンのクリックイベントを取得するためにUIのボタンにBoxCollider2DとIPointerClickHandlerを実装したクラスをアタッチしたGameObjectを配置しているのですが、どうもクリックだと(そもそもRayとオブジェクトの衝突が判定されていないっぽい)判定されません。
■やっていること
・Cameraをアタッチ(UIを描写する用)
C#
1 var cameraObject = new GameObject("UICamera"); 2 var camera = cameraObject.AddComponent<Camera>(); 3 camera.useOcclusionCulling = false; 4 camera.eventMask = 0; 5 camera.orthographic = true; 6 camera.orthographicSize = 5; 7 camera.nearClipPlane = -10.0f; 8 camera.clearFlags = CameraClearFlags.Depth; 9 Object.DontDestroyOnLoad(cameraObject);
・CameraをアタッチしているオブジェクトにPhysics2DRaycasterをアタッチ
・カメラとは別のオブジェクトに以下をアタッチ
EventSystem
StandaloneInputModule
・Canvas配下にボタンを設置
■確認していること
・Physics2DRaycasterを継承しRaycastの中でDrawRayをさせてRayが飛んでいるか確認。配置したボタンに当たっていることも確認。
・Physics2D.GetRayIntersectionAll(ray, distance, finalEventMask)の返り値でRaycastHit2Dは0個。
C#
1 RaycastHit2D[] rayCastHits = Physics2D.GetRayIntersectionAll(ray, distance, finalEventMask);
・EventSystemのインスペクターではクリックはとれている模様(クリックすると画像のeligibleForClickはTrueになる)、Objectの検知まではできていない?
pointerEnterやpointerPressといったところに通常であればObjectが記載される
■動作環境
Unity5.6.1
■追記
理由としましたは、以下速度と汎用性の2点ございます。
・速度
クリックされてから反応するまでの速度に懸念があるからです。
Buttonコンポーネンの場合、IPointerClickHandlerを実装していますのでこのインターフェイスを継承している点
それをOnPointerClickでEventDataを受け取るところまでは同じなのですが、Buttonの場合Delegateを宣言したクラスのインスタンスに処理を移譲する形でクリックのイベントをとってます。
ですので、Updtateで常にクリック状態をチェックしていたほうが反応は早いと考えました。
ただButtonクラスはvirtualとしてOnPointerClick関数を用意しているのでButtonクラスをそのまま継承したクラスを実装しても同じ結果が得られるかもしれません。
*ただ、ここまでイベントがとれているのであればButtonクラスを使ったものとそうでないもの両方でイベント通知が来なくてはしっくりきませんが。
・汎用性
ButtonクラスはIPointerClickHandlerしか実装していないため他の通知を取得したい場合に少し不便だと思いました。
具体的には下記のようなものです。この中でドラッグの判定がとれないのは大きいかもしれません。
, IPointerUpHandler , IPointerDownHandler , IPointerEnterHandler , IPointerExitHandler , IDragHandler , IEndDragHandler
以上となります。
よろしくお願いします。
以上です。
よろしくお願いします。