以下の内容はhttps://kan-kikuchi.hatenablog.com/entry/OnLongPressより取得しました。


ボタン長押し時に、連続で処理を実行させる【Unity】【uGUI】【UniRx】【拡張メソッド】





この記事でのバージョン
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);






以上の内容はhttps://kan-kikuchi.hatenablog.com/entry/OnLongPressより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14