【Unity】【C#】Update()を使わずにuGUI長押しボタンを実装する
長押しイベントで分かりやすい記事がなかったり、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");
}
}
[Log]
//長押しして離した場合
Press Start
Long Press Done
Press End
//短押し(タップorクリック)した場合
Press Start
Short Press Done
Press End
Twitterでゲーム開発の進捗やプログラミングについて呟いてるのでよかったらフォローお願いします〜