2020/11/09
今回はUnityのボタンと入力判定に関する短めのお話です。
私の作るゲームは主に左クリックにアクションを割り当てています。前回のUnity1週間ゲームジャムで作成したゲームもその1つです。
スクリプトのアクション判定部分だけを抜き出すとこんな感じ。Input.GetButtonDown()
で判定するシンプルな形です。
private void DoAction() { if (Input.GetButtonDown("LiftUp")) { // 持ち上げる処理 } }
で、このゲーム、実際にアクションするシーンにもいくつかUIのボタンがあるわけですね。
これを左クリックしたときに、プレイヤーキャラのアクション(持ち上げ)が暴発してしまいます。
これを防ぐために、アクション部分の実行前に「ボタンがクリックされているか」を判定し、クリックされていたらreturnしてしまいます。
現在クリックされているボタンはEventSystem.current
のcurrentSelectedGameObject
で分かります。
private void DoAction() { // 何らかのボタンが押された場合は止める if (EventSystem.current.currentSelectedGameObject != null) { return; } if (Input.GetButtonDown("LiftUp")) { // 持ち上げる処理 } }
これでボタンクリック時はif文でreturnされるので、その後のアクションが暴発しなくなります。
アクション用のボタンなど、処理が止まったら困るものはボタンのオブジェクトにタグとか付けて判定すればOK。
currentSelectedGameObject
がnullの場合もあるので、nullチェックの後ろにタグ判定の条件をANDで足せば良いでしょう。
また、そのまま書くとif文の条件式が長くなってしまうので、currentSelectedGameObject
を別の変数に入れて判定すると見やすくなります。
private void DoAction() { // 何らかのボタンが押された場合は止める var currentSelectedObject = EventSystem.current.currentSelectedGameObject; if (currentSelectedObject != null && currentSelectedObject.CompareTag("test")) { return; } if (Input.GetButtonDown("LiftUp")) { // 持ち上げる処理 } }
そんなわけで、UIボタンのクリックと入力判定に関するちょっとした内容を紹介しました。
特にポーズボタンで暴発したりすると残念な感じになるので、あらかじめ覚えておきましょう。