この記事でのバージョン
Unity 6000.2.6f2
はじめに
UnityのUIを実装している際、
「ボタンを長押ししたら連続で処理を実行してほしい(連打した感じにしたい)」
みたいな事はよくあります。
![]() |
今回はそんな時に使える拡張メソッドの紹介です!なお、UniRxを使っています。
ボタン長押し時に、連続で処理を実行させる
早速ですが、拡張メソッドとそれを実装してる拡張クラスのコードです。
using System; using UnityEngine; using UnityEngine.UI; using UniRx; using UniRx.Triggers; /// <summary> /// uGUIのButtonの拡張クラス /// </summary> public static class ButtonExtension { /// <summary> /// 長押し検出(タッチorクリック開始を契機に、longPressDelay秒待ってから、repeatInterval秒間隔で実行を繰り返す) /// </summary> public static IDisposable OnLongPress(this Button button, Action onRepeat, float longPressDelay = 0.5f, float repeatInterval = 0.05f) { //長押しを止める判定(指を離した or ポインタがボタン範囲から出た or ボタンが無効化された) var stop = button.OnPointerUpAsObservable().AsUnitObservable() .Merge(button.OnPointerExitAsObservable().AsUnitObservable()) .Merge(button.OnDisableAsObservable()); return button.OnPointerDownAsObservable()//タッチorクリック開始 .SelectMany(_ => Observable.Timer(TimeSpan.FromSeconds(longPressDelay))//最初にlongPressDelay秒待つ .SelectMany(__ => Observable.Interval(TimeSpan.FromSeconds(repeatInterval)))//そのあと、repeatInterval秒間隔で待つ .TakeUntil(stop)//長押しを止める判定を満たしたら終了 ) .Subscribe(__ => onRepeat?.Invoke())//処理実行 .AddTo(button);//ボタンが破棄されたときに自動でDisposeされるように } }
上記のコードを作ると、UnityEngine.UI.ButtonがOnLongPressというメソッドが使えるようになります。
使い方は、通常のクリック時の処理を設定するように、長押し時の連続処理を設定するだけ。
//通常のクリック時の処理を設定 _button.onClick.AddListener(OnClick); //長押し時の連続処理を設定(longPressDelayとrepeatIntervalは省略可能) _button.OnLongPress(OnClick, longPressDelay:0.5f, repeatInterval:0.05f);
![]() |
