【Unity】マウスクリック等の連打を判定する

投稿者: | 2021-05-28

マウスクリックやキー入力などの連打を判定してみました。

ゲージを作る

まず、ヒエラルキービューでImageオブジェクトを追加しました。スクリプトの値を見るためのTextオブジェクトもあります。

Imageを選択してインスペクタのRect Transformで位置や形を変えました。また、Source Imageに真っ白なスプライト画像をドラッグアンドドロップしています。

このImageは、テキストと一緒に、空のゲームオブジェクトに付けたスクリプトにアタッチします。

スクリプト

スクリプトでは、マウスクリックがあると時間を計測し始めます。指定の時間がすぎる前に次のクリックがある限り、クリック数を数え続けます。

クリック数が指定の回数以上のときは連打していると判定して、ゲージを上げます。連打中以外はゲージを下げます。

using UnityEngine;
using UnityEngine.UI;

public class ButtonMashing : MonoBehaviour
{
    [SerializeField] Image gauge; // ゲージ
    float gaugeAmount; // ゲージの量

    // 連打中のクリック間隔
    [SerializeField] float interval = 0.3f;

    // 何クリック目から連打中に切り替えるか 
    [SerializeField] int startCount = 3; 
    int clickCount; // クリック数
    int clickCountRecord; // クリック数の記録
    bool isCounting; // クリックを数えているかどうか
    bool isMashing; // 連打しているかどうか
    float second; // クリック間の秒数

    [SerializeField] Text[] texts;

    // Start is called before the first frame update
    void Start()
    {
        // Imageコンポーネントの設定
        gauge.type = Image.Type.Filled;
        gauge.fillMethod = Image.FillMethod.Horizontal;
        gauge.fillOrigin = 0;
        gauge.fillAmount = 0f;

    }

    // Update is called once per frame
    void Update()
    {
        texts[0].text = "clickCount: " + clickCount;
        texts[1].text = "clickCountRecord: " + clickCountRecord;
        texts[2].text = "isCounting: " + isCounting;
        texts[3].text = "isMashing: " + isMashing;
        texts[4].text = "second: " + second;

        // 左クリックされたとき
        if (Input.GetMouseButtonDown(0))
        {
            // 数えている状態にする
            isCounting = true;

            // 秒数をリセット
            second = 0f;

            // クリック数を1増加
            clickCount++; 
        }

        // 数えているとき
        if(isCounting)
        {
            texts[5].text = "数えている";

            // 秒数をカウント
            second += Time.deltaTime;

            // 時間切れのとき
            if(second > interval)
            {
                // 数えていない状態にする
                isCounting = false;
                
                // 連打していない状態にする
                isMashing = false;

                // クリック数を記録
                clickCountRecord = clickCount;

                // クリック数をリセット
                clickCount = 0;
            }
            // 数えていて連打中でないとき
            else if(!isMashing)
            {
                // ゲージを減らす
                DecreaseGauge();

                // クリック数が指定の数以上になったとき
                if (clickCount >= startCount)
                {
                    // 連打状態にする
                    isMashing = true;
                }
            }
            // 数えていて連打しているとき
            else
            {
                texts[5].text = "連打している";

                // ゲージを増やす
                gaugeAmount += 0.2f * Time.deltaTime;
                if (gaugeAmount >= 1f) gaugeAmount = 1f;

                gauge.fillAmount = gaugeAmount;
            }

        }
        // 数えていないとき
        else
        {
            texts[5].text = "数えていない";

            // ゲージを減らす
            DecreaseGauge();
        }

    }

    // ゲージを減らす
    void DecreaseGauge()
    {
        gaugeAmount -= 0.4f * Time.deltaTime;
        if (gaugeAmount <= 0f) gaugeAmount = 0f;

        gauge.fillAmount = gaugeAmount;
    }
}

連打判定に使う時間とクリック数はインスペクタから設定できます。下のスクリーンショットでは、1秒以内に次のクリックがあれば計測を続け、5回目のクリックから連打中と判定します。

時間の値が小さいとき、かなり高速に連打しないとゲージが下がっていきます。

コメントを残す

メールアドレスが公開されることはありません。