Unity 4.6.1でGraphic RaycasterでタッチのPriorityを有効にする

More than 3 years have passed since last update.

悲報。Unity 4.6.1から、Graphic RaycasterからPriorityが消えました。

スクリーンショット 2015-01-23 午後10.50.38.png

これによって、タップしたときに、目に見えているものよりさらに奥に有る物が反応してしまう、なんて事が起きるようになりました。

ということで、


表示されていない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が、リストの先頭のオブジェクトに対して、ユーザの行った操作のイベントを発行します。