Unityで設置したButton(ボタン)が反応しない場合っていくつかの原因が考えられますが、今回、今までに経験していないボタンが反応しないパターンに遭遇したのでメモとして残しておきたいと思います。
状況・現象としては、
- Buttonをタップしても反応しない(ヒエラルキーは上記の画像)
- Buttonにはクリックイベントを追加済み
- Buttonには重なっているUIはない
- 反応する時と反応しない時がある
- Buttonを複製してみると、一方は反応するけど、一方は反応しなかったりする
- Canvasは2つある状態(Game用CanvasとUI用Canvas)
って感じです。
Unityでボタンが反応しない場合に考えられること
今まで遭遇したパターンや、ネットで調べて遭遇しやすいパターンとしてはこんな感じ↓
- Buttonにクリックイベントが設定されていない
- Buttonにスクリプトを設定し忘れている
- スクリプトの記載が間違っている
- Event Systemがシーンに追加されていない
- 透過した画面がButtonの上にあって塞いでいた
- Buttonの「Intaractable」のチェックが外れている
- Buttonや目的のUIの「RaycastTarget」のチェックが外れている
- 別のUIがButtonに重なっている
- Buttonを設置したCanvasに「GraphicRaycaster」がアタッチされていない
今回もこのどれかに当てはまるかなと思ったので、一通りチェックしてみたのですが、何度確認しても問題なさそうです。
一旦Buttonを削除して、もう一度追加し直したりしてみましたが、状況が変わりませんでした。
ボタンが反応しないのはCanvasのソート順が原因だった
色々調べた結果、Canvasのソート順が原因だったことが判明しました。
上記のような構成でしたが、CanvasGameとCanvasUIの「Order in Layer」は両方とも0だったため、どちらが上なのか定まっていなかったことが原因だったようです。
構造上はCanvasUIの方が手前にあるので、CanvasUI側を優先的に反応すると思っていたのですが、「Order in Layer」の設定値が同じことにより、ゲームオブジェクトを表示非表示させたりすると順番がわからなくなってCanvasGameの方にトリガーが移って反応しないという状態になっていたようです。
対処として、下側に設置したいCanvasGameの「Order in Layer」の値を-1、上側に設置したいCanvasUIの「Order in Layer」の値を0にしたところ、
CanvasUIに設置しているボタンが常に反応するようになりました。
これからは、UnityでButtonが反応しない場合はCanvasの 「Order in Layer」も確認するようにしたいと思います。