ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】ボタンクリック時にInputの処理が暴発しないようにする方法

time 2020/06/08

今回はUnityのボタンと入力判定に関する短めのお話です。
私の作るゲームは主に左クリックにアクションを割り当てています。前回のUnity1週間ゲームジャムで作成したゲームもその1つです。

「第15回 Unity1週間ゲームジャム」に参加しました!

スクリプトのアクション判定部分だけを抜き出すとこんな感じ。Input.GetButtonDown()で判定するシンプルな形です。

private void DoAction()
{
    if (Input.GetButtonDown("LiftUp")) {
        // 持ち上げる処理
    }
}

で、このゲーム、実際にアクションするシーンにもいくつかUIのボタンがあるわけですね。
これを左クリックしたときに、プレイヤーキャラのアクション(持ち上げ)が暴発してしまいます。

これを防ぐために、アクション部分の実行前に「ボタンがクリックされているか」を判定し、クリックされていたらreturnしてしまいます。
現在クリックされているボタンはEventSystem.currentcurrentSelectedGameObjectで分かります。

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")) {
        // 持ち上げる処理
    }
}
`currentSelectedGameObject`はGameObject型だから、いつもやっているタグやレイヤーでの判定がそのまま使えるよ!

そんなわけで、UIボタンのクリックと入力判定に関するちょっとした内容を紹介しました。
特にポーズボタンで暴発したりすると残念な感じになるので、あらかじめ覚えておきましょう。

down

コメントする