概要
ポインターが押された時と離された時の間隔が一定以下のときだけ発火する物をUniRxで作成しました。
赤のエフェクトは押されたこと、青は離されたことを示します。その間隔が短いときだけLogが出力されてます。
プロジェクト全体はこちらから
https://github.com/Arihide/unirx-shorttap
説明
短いのでソースコード丸ごと乗っけます。
using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UniRx;
using UniRx.Triggers;
public class ShortTap : UIBehaviour
{
protected override void Awake()
{
base.Awake();
const double shortTapThreshold = 200d;
this.OnPointerUpAsObservable()
.Timestamp() // 時間情報付与
.WithLatestFrom( // ポインターが離れたとき、最後に押された時の情報と合体させる
this.OnPointerDownAsObservable().Timestamp(),
(l, r) => new { up = l, down = r }
)
// 押した時と離れたときの間隔が shortTapThreshold 以下のときだけ通す
.Where(pair => (pair.up.Timestamp - pair.down.Timestamp) <= TimeSpan.FromMilliseconds(shortTapThreshold))
.Subscribe(_ => Debug.Log("Short Tap!"));
}
}
やってることとしては、
- ポインターが離れたときに、最後にポインターが押されたときの情報とニコイチにする
- 押された時と離れたときの時刻を比較し、閾値以下なら通す
という感じですね。
この方法は押されたときではなく、離れたときに発火するのがミソです。
また、条件式を調整すればロングタップなどにも対応できます。