悲報。Unity 4.6.1から、Graphic RaycasterからPriorityが消えました。
これによって、タップしたときに、目に見えているものよりさらに奥に有る物が反応してしまう、なんて事が起きるようになりました。
ということで、
表示されていないPriorityを表示する
using UnityEngine.UI;
public class CustomGraphicRaycaster : GraphicRaycaster
{
public int priority;
public override int sortOrderPriority {
get {
return priority;
}
}
}
以上。
・・・
蛇足を。
タップイベントが発行されるまでの雑な解説
Unity 4.6系で導入されたuGUIでは、ユーザの操作を検出するためのBaseInputModuleクラスが用意されています。
タップイベントをサポートするためのコンポーネントとして、
BaseInputModuleクラスを何層か子のTouchInputModuleクラスが作られています。
TouchInputModuleがタップを検出すると、EventSystemのRaycastAllメソッドを呼び出します。
EventSystemのRaycastAllメソッドは、シーン中のBaseRaycasterを継承しているクラス(GraphicRaycasterとか)のコンポーネントに対して、Raycastを要求し、
各RaycasterのRaycast結果をRaycastResultのリストとして収集します。
このとき、EventSystemは収集したRaycastResultのリストを次の2点でソートしてからRaycastAllメソッドの呼び出し元に処理を返します。
- Raycasterに設定されているCameraのdepthで比較する
- Cameraのdepthが同一ならば、RaycasterのsortOrderPriorityで比較する
ソートされたリストをEventSystemから受け取ったTouchInputModuleが、リストの先頭のオブジェクトに対して、ユーザの行った操作のイベントを発行します。