4970
uGUI の反応順番でボタンが重なっているときの反応順番を任意にする方法を教えてください

現在の Hierarchy は

```

    main
    .Oblect1
    ..Canvas
    ...RedButton
    ....RedButtonText
    ..EventSystem
    ..Camera
    .Oblect2
    ..Canvas
    ...BlueButton
    ....BlueButtonText
    ..EventSystem
    ..Camera
    
```

この時に現在は赤のボタン( `Object1` )が反応します

Canvas の `Order Layer` は

```

    Oblect1 0
    Oblect2 1
    
```

です
CC BY-SA 3.0
2015-01-19T08:11:39.783
4835
2015-01-23T01:58:59.603
2015-01-19T08:36:45.503
4978
7549
question
unity3d ugui
Unity4.6.1p4　uGUIButton の反応順番
Unity4.6.1p2以降であれば、描画されてる順番がタッチの反応順番になると思います。  
カメラを複数使っている場合は、カメラのDepth値による描画順がキャンバスの描画順よりも優先されるので、そちらの問題かもしれません。  
EventSystemはシーン内一つあればいいはずなので、複数作成しているのが問題な気もします。
CC BY-SA 3.0
2015-01-20T05:16:20.630
4889
2015-01-20T05:16:20.630
3593
4835
answer
すみません。こちらUnity4.6.1f1の場合でした。  
Unity4.6.1p4でも検証を行ったので別回答として書きます。

uGUI のタッチ判定の優先度は Canvas 毎にわかれており、

  * カメラの `Depth` 値
  * `sortOrderPriority`（Canvas の `OrderInLayer`）の値 ※値が多きほうが優先
  * `renderOrderPriority`（Canvas 毎に変わる）の値
  * カメラからの距離

といった優先度になっています。  
カメラの `Depth` 値が同じなら `sortOrderPriority` の値で決定といった具合です。

ここで問題なのが `sortOrderPriority` の値が勝手に変わってしまう場合があるということです。

以下のように、 Canvas の `RenderMode` の設定により `sortOrderPriority` の値が変化します。

## RenderMode の設定

### RenderMode: WorldSpace

必ず `sortOrderPriority` と `renderOrderPriority` が `int.MaxValue` の値になります。

### RenderMode: ScreenSpace-Camera

`RenderCamera` が設定されている場合、 `sortOrderPriority` と `renderOrderPriority`
が`int.MaxValue` の値になります。設定されていなかった場合は `OrderInLayer` の値になります。

### RenderMode: ScreenSpace-Overlay

`SortOrder` の値になります。

以上を踏まえて、 `Object1` の Canvas の設定と `Object2` の Canves の設定を見比べてみてください。
CC BY-SA 3.0
2015-01-21T05:56:24.293
4970
2015-01-23T01:06:28.823
2015-01-23T01:06:28.823
7629
7629
4835
answer
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のほうがカメラに近いまたは同じ  
のどちらかのパターンだと思います。
CC BY-SA 3.0
2015-01-23T01:44:01.690
5116
2015-01-23T01:58:59.603
2015-01-23T01:58:59.603
7629
7629
4835
answer