こんにちは、Unityエンジニアのオオバです。
Unity UI(uGUI)の ボタンが反応しなくなる ことありませんか?オオバも長年UIを作ってきていますが、よく押せなくなります。とても困りますよね。
結論から言って uGUIのボタンが押せなくなったときに考えられる原因は大きく分けて8つ です。「ボタンが押せない」というのはゲーム開発にとっては致命的な不具合。ぜひこの記事をとおして原因を探ってみてください。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
Unity UIのボタンが反応しない原因は8つ
この記事では8つの原因を分かりやすく解説していきます。この8項目を全てチェックしてもらえれば再びボタンは動き出すでしょう。
また経験的に 発生頻度の高いもの から順にランキング形式紹介します。ボタンが反応しなくなって困っている方はぜひ読んでみてください。では1つずつ詳細について解説していきます。
👉 【要注意Unity UI】Unity標準ボタンを禁止する5つの理由
第1位 RaycastTargetがOFFではないか?
ボタンが押せない原因の中で最も多いのは「 RaycastTarget設定漏れ 」です。そもそも「RaycastTarget」とは、ボタンの判定に必要な設定です。ボタンが反応してほしいときにはチェックを。反応してほしくない場合はチェックを外します。
RaycastTargetは Image 、 RawImage 、 Text 、 TextMeshPro など ボタンになりうるコンポーネント で設定できます。つまり ボタンが押せないときはRaycastTargetにチェックが入っているか確認 することから始めましょう。
各コンポーネントのRaycastTargetの場所
各コンポーネントのRaycastTargetの設定箇所を紹介します。
ImageコンポーネントのRaycastTarget設定箇所
RawImageコンポーネントのRaycastTarget設定箇所
TextコンポーネントのRaycastTarget設定箇所
TextMeshProコンポーネントのRaycastTarget設定箇所
TextMeshProのRaycastTargetはデフォルト状態で Extra Settings の中に隠れています。クリックしてExtra Settingsを開き、RaycastTargetを確認してみてください。
ボタンが反応しないときは、まずこれらのRaycastTargetにチェックが入っているかを確認しましょう。
第2位 ボタンの上に覆いかぶさるUIがないか?
2つ目に考える原因は反応しないボタンの上に 透明なUIが覆いかぶさっていないか です。よくある原因のひとつ。
以下のように RaycastTarget がONのUIが覆いかぶさっているとボタンは反応しません。 覆いかぶさったUIにクリック判定が取られてしまうから です。
RaycastTargetについては前述の第1位 RaycastTargetがOFFではないか?をチェックしてみてください。
Hierarchyウィンドウ上では以下のような状況です。ここでは覆いかぶさるUIが「BlockUI」という名前のGameObjectです。 Hierarchyウィンドウでは下に行くほど後から描画 されるため、結果、BlockUIはボタンを覆う形になります。
上のサンプルは分かりやすく説明するためシンプルな図解です。実際のゲーム開発の現場では 大量のGameObjectがHierarchyウィンドウに入り乱れます 。大量のGameObjectの中から原因を特定するのは難しいですよね。
そこで簡単に解決へ導くテクニックを紹介します。
EventSystemのInspectorウィンドウにヒントがある
Hierarchyウィンドウから EventSystem を選択します。「EventSystem」はUnity UIを使う場合必ず自動で作られます。
EventSystemのInspectorウィンドウを見てみましょう。マウスカーソルのUI情報が取得できるのです。
ボタンが反応するときのEventSystem
ボタンをクリックすると、EventSystemの情報に変化が現れます。注目すべきは Current Raycast です。クリックを判定したUIのGameObject名が表示されます。(マウスオーバーも判定されています)
ボタンをブロックするUIが覆いかぶさったときのEventSystem
一方ボタンを覆いかぶさるUIがある場合EventSystemはどうなるでしょうか。
先ほどと同様に Current Raycast をチェックします。
BlockUI が表示されています。このようにEventSystemを使うとボタンが反応しない原因がわかります。このサンプルでは「BlockUI」が邪魔していました。
ボタンが反応しないときはぜひEventSystemのInspectorウィンドウをチェック してみてください。
第3位 ButtonのInteractableがOFFではないか?
ボタンが反応しない3つ目の原因は「InteractableのOFF」です。Unity標準のButtonコンポーネントを使っている場合の話ですが、Buttonは Interactableにチェック を入れないと反応しません。
RaycastTargetをONにしていてもInteractableにチェックがないとボタンは反応しないため注意です。
第4位 OnClickの設定はあるか?
4つ目の原因もUnity標準のButtonを使用していた場合の話です。 OnClick の設定漏れです。
「OnClick」にはボタンをクリックしたときの処理(メソッド)を設定します。この設定がないとボタンは動きません。
InspectorウィンドウからOnClickを設定した場合
プログラムからOnClickを設定した場合
var clickedEvent = new Button.ButtonClickedEvent();
clickedEvent.AddListener(() => Debug.Log("クリック!"));
// ボタンにクリック処理を設定
button.onClick = clickedEvent;
Inspectorウィンドウ、プログラムどちらでもよいですが、どこかでOnClickを設定してあるか確認してみましょう。
第5位 EventSystemはあるか?
ボタンが反応しない5つ目の原因は 「EventSystemの有無」 です。
Unity UIには必ずEventSystemが必要です。自動で1つ作られますが、間違えて消してしまうこともあります。HierarchyウィンドウにEventSystemがあるか確認してみましょう。
EventSystemがない場合に新規で作成する方法
間違えてEventSystemを消してしまった場合、新たに作りましょう。
メニュー GameObject > UI > Event System
から作成できます。
EventSystemがないとボタンは動きません。ちょっとしたUnity誤操作で消えてしまいますので注意しましょう。
第6位 GraphicRaycasterはあるか?
ボタンが反応しない6つ目の原因は 「GraphicRaycasterの有無」 です。通常GraphicRaycasterはCanvasとセットで作られます。
GraphicRaycaster
はタップやクリック判定を処理するコンポーネントです。ボタンを反応させるために必須です。
Canvas単位でGraphicRaycasterが必要
開発上Canvasの中にCanvasを作ることがあります。注意点は GraphicRaycasterのつけ忘れ です。
次の資料はGraphicRaycasterの有無でクリック判定の変化を図にしたものです。
↑このようにCanvas単位でクリック判定が管理されるのです。ボタンが反応しないときは CanvasとGraphicRaycasterの有無をチェック してみましょう。
GraphicRaycasterはONである必要がある
GraphicRaycaster はCanvasにアタッチされていてもアクティブな状態(ON)である必要があります。
上図の通り GraphicRaycasterにチェックが入った状態か確認 しましょう。チェックが外れているとボタンは反応しません。
第7位 CanvasGroupのBlocksRaycastsがOFFではないか?
8つ目の原因は CanvasGroupのBlocksRaycasts です。
CanvasGroupは子階層のUIをグループ化して 透明度を一括変更 できる便利コンポーネントです。そんなCanvasGroupの BlocksRaycasts にチェックが入っているか確認しましょう。
上図のようにCanvasGroupの BlocksRaycasts がONであればボタンは反応します。
第8位 CanvasGroupのInteractableがOFFではないか?
第7位 CanvasGroupのBlocksRaycastsがOFFではないか?に続いてCanvasGroupについてです。8つ目の原因は CanvasGroupのInteractable 。
Unity標準ボタンを使っていた場合の話ですが、CanvasGroupの Interactable にチェックが入っているか確認しましょう。
CanvasGroupの Interactable がOFFだとUnity標準ボタンは反応しません。必ず上図のとおりONにしましょう。
第9位 ボタンが裏返っている
実はボタンには表と裏が存在することをご存知でしょうか。裏返っているとタップ判定が消滅します。
ここで言う「裏返り」とは X軸またはY軸が180度回転した状態 を指します。
X軸が180度回転した状態。
Y軸が180度回転した状態。
この状態では、、いくらタップしようとしても判定が取れません。
もしボタンが動作しなくなったときの原因の1つとして検討してみてください。
Unity UIのボタンが反応しない8つの原因まとめ
Unity UIのボタンが反応しない8つの原因を発生度にもとづくランキング形式で紹介しました。
第1位 RaycastTargetがOFFではないか?
第2位 ButtonのInteractableがOFFではないか?
第3位 ボタンの上に覆いかぶさるUIがないか?
第4位 OnClickの設定はあるか?
第5位 EventSystemはあるか?
第6位 GraphicRaycasterはあるか?
第7位 CanvasGroupのBlocksRaycastsがOFFではないか?
第8位 CanvasGroupのInteractableがOFFではないか?
第9位 ボタンが裏返っている
こんな感じです。
ボタンが動かなくなると焦りますよね。特に商品の課金ボタンが動かないとなると汗ダラダラです。
この記事ではUnity開発11年の中で、 ボタンが反応しない原因を全てリストアップ しました。
もしあなたのゲームのボタンが反応しないとき、この記事をブックマークして思い出してみてください。きっとなにか解決のヒントになるはずです。
この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。
この記事が気に入ったらフォローしよう
「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
ぜひチャンネル登録をお願いします!
最後まで読んでいただきありがとうございました!
すばらしいUIライフをお過ごしください。
- Unity2022.3.18f1