LoginSignup
30
28

More than 5 years have passed since last update.

【Unity】Update()を使わずにuGUI長押しボタンを実装する

Last updated at Posted at 2018-03-15

長押しイベントで分かりやすい記事がなかったり、Update()を使う方法の記事しか見つからなかったので、自分で作ってみました。

概要

ボタンをタップした時と長押しした時でUIの表示が変わるゲームって見かけますよね。それを実装したいと思って調べたのですが、どうやら長押しした時の方法は公式で用意されてないようなので各自工夫する必要があるみたいです。

今回はボタンを押した時にコルーチンを開始して、待機時間終了後にボタンが押されているかどうかのフラグを見て挙動を変える実装にしています。

ちなみにボタンと言ってるのは方便で、コンポーネントはButtonではなく、EventTriggerを用います。また、ScriptからEventTriggerを登録する方法で記載してます。

サンプルの動画

コード

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems; //追加を忘れないように!

//長押しを発生させるuGUI(ImageやText)にアタッチして使う
public class EventCtr : MonoBehaviour
{
    //EventTriggerをアタッチしておく
    public EventTrigger _EventTrigger;

    //StopCoroutineのためにCoroutineで宣言しておく
    Coroutine PressCorutine;
    bool isPressDown = false;
    float PressTime = 2f;

    void Awake ()
    {
        //PointerDownイベントの登録
        EventTrigger.Entry pressdown = new EventTrigger.Entry ();
        pressdown.eventID = EventTriggerType.PointerDown; 
        pressdown.callback.AddListener ((data) => PointerDown ());
        _EventTrigger.triggers.Add (pressdown);

        //PointerUpイベントの登録
        EventTrigger.Entry pressup = new EventTrigger.Entry ();
        pressup.eventID = EventTriggerType.PointerUp; 
        pressup.callback.AddListener ((data) => PointerUp ());
        _EventTrigger.triggers.Add (pressup);
    }

    //EventTriggerのPointerDownイベントに登録する処理
    void PointerDown ()
    {
        Debug.Log ("Press Start");
        //連続でタップした時に長押しにならないよう前のCoroutineを止める
        if (PressCorutine != null) {
            StopCoroutine (PressCorutine);
        }
        //StopCoroutineで止められるように予め宣言したCoroutineに代入
        PressCorutine = StartCoroutine (TimeForPointerDown ());
    }

    //長押しコルーチン
    IEnumerator TimeForPointerDown ()
    {
        //プレス開始
        isPressDown = true;

        //待機時間
        yield return new WaitForSeconds (PressTime);

        //押されたままなら長押しの挙動
        if (isPressDown) {
            Debug.Log ("Long Press Done");

            //お好みの長押し時の挙動をここに書く
        }
        //プレス処理終了
        isPressDown = false;
    }

    //EventTriggerのPointerUpイベントに登録する処理
    void PointerUp ()
    {
        if (isPressDown) {
            Debug.Log ("Short Press Done");
            isPressDown = false;

            //お好みの短押し時の挙動をここに書く(無い場合は書かなくても良い)

        } 
        Debug.Log ("Press End");
    }
}

ログ

//長押しして離した場合
Press Start
Long Press Done
Press End

//短押し(タップorクリック)した場合
Press Start
Short Press Done
Press End

もし参考になった場合はいいねをお願いします〜

追記

連続タップで長押し判定にならないよう修正しました。

30
28
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
28