質問: uGUI の反応順番でボタンが重なっているときの反応順番を任意にする方法を教えてください 現在の Hierarchy は ``` main .Oblect1 ..Canvas ...RedButton ....RedButtonText ..EventSystem ..Camera .Oblect2 ..Canvas ...BlueButton ....BlueButtonText ..EventSystem ..Camera ``` この時に現在は赤のボタン( `Object1` )が反応します Canvas の `Order Layer` は ``` Oblect1 0 Oblect2 1 ``` です
回答: Unity4.6.1p4の場合 uGUI のタッチ判定の優先度は Canvas 毎にわかれており、 * カメラの `Depth` 値 * `sortOrderPriority`(Canvas の `OrderInLayer`)の値 ※値が小さいきほうが優先 * `renderOrderPriority`(Canvas 毎に変わる)の値 * カメラからの距離 といった優先度になっています。 カメラの `Depth` 値が同じなら `sortOrderPriority` の値で決定といった具合です。 ここで問題なのが `sortOrderPriority` の値が勝手に変わってしまう場合があるということです。 以下のように、 Canvas の `RenderMode` の設定により `sortOrderPriority` の値が変化します。 RenderMode の設定 ### RenderMode: WorldSpace 必ず `sortOrderPriority` が `int.MaxValue` の値になります。 ### RenderMode: ScreenSpace-Camera `RenderCamera` が設定されている場合、 `sortOrderPriority` が`int.MaxValue` の値になります。設定されていなかった場合は `IntMaxValue-OrderInLayer` の値になります。 ### RenderMode: ScreenSpace-Overlay `IntMaxValue-SortOrder` の値になります。 ※注意点 ・Unity4.6.1f1とUnity4.6.1p4でsortOrderPriorityの値が降順から昇順に変更されています。 ・IntMaxValue-○○を行っているところで○○に-の値をいれるとオーバーフローを起こし、IntMinValueからになります。つまり○○に-1が入った場合がタッチ判定が最優先になります。 ・カメラからの距離とはカメラからImageまでの距離でなく、カメラからCanvasまでの距離です。カメラからImageまでの距離は考慮されていません。 ・全ての値が同じ場合は、タッチ判定はUnity次第になります。 ※補足 今回の場合はおそらく、 RenderModeがScreenSpace-CameraでRenderCameraが指定されており、Object1のCanvasのほうがカメラに近いまたは同じ(同じ場合はUnity次第) or RenderModeがWorldSpaceでObject1のCanvasのほうがカメラに近いまたは同じ のどちらかのパターンだと思います。