search
LoginSignup
8

More than 5 years have passed since last update.

posted at

Organization

UniRxでAsyncReactiveCommandを使ったダブルクリックの抑制

背景

最近AsyncReactiveCommandを知ったので使ってみた

参考

http://neue.cc/2016/08/03_536.html
https://qiita.com/soi/items/eca0601ad0fc4e401623

問題

ボタンをダブルクリックされても処理は一回だけに抑制したい!

ボタンひとつの場合

Hoge.cs
    [SerializeField] private Button _button;

    void Start(){
        var asyncReactiveCommand = new AsyncReactiveCommand();
        asyncReactiveCommand.Subscribe(_ => Observable.Timer(TimeSpan.FromSeconds(0.5f)).AsUnitObservable());
        asyncReactiveCommand.BindTo(_button);
    }

これでクリックされてから0.5秒間 interactable を false にしてくれる!

HogeHoge.cs
    [SerializeField] private Button _button;

    void Start(){
        _button.BindToOnClick(_ => {
            return Observable.Timer(TimeSpan.FromSeconds(0.5f)).AsUnitObservable();
        });
    }

これでも同様に動く便利なショートカット!

ボタン複数の場合

同じグループのボタンでどれか一つでもクリックされたらそのグループのボタンを押させたくない時!

Common.cs

public static class Common
{
    private static readonly Dictionary<int, AsyncReactiveCommand> _asyncReactiveCommandDict = new Dictionary<int, AsyncReactiveCommand>();

    public static AsyncReactiveCommand GetAsyncReactiveCommand(int groupId)
    {
        if (_asyncReactiveCommandDict.ContainsKey(groupId))
            return _asyncReactiveCommandDict[groupId];

        _asyncReactiveCommandDict.Add(groupId,new AsyncReactiveCommand());
        _asyncReactiveCommandDict[groupId].Subscribe(_ => Observable.Timer(TimeSpan.FromSeconds(0.5f)).AsUnitObservable());
        return _asyncReactiveCommandDict[groupId];
    }
}
SuppressionDoubleClick.cs
public class SuppressionDoubleClick : MonoBehaviour
{
    [SerializeField] private int _groupId;

    void Start()
    {
        Common.GetAsyncReactiveCommand(_groupId).BindTo(GetComponent<Button>());
    }
}

こんな感じに定義して抑制したいボタンに SuppressionDoubleClick を設定すればおk!
button.gif

思ったより簡単だった

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
What you can do with signing up
8