【Unity】【UI Toolkit】ボタンのダブルクリックを検知する方法(Hackyな方法)

UnityのUI Toolkitでボタンのダブルクリックを検知する方法です。

Unity2022.3.13f1

はじめに&注意点

本記事ではUnityのUI Toolkitでボタンのダブルクリックを検知する方法についてまとめます。

この方法は以下のフォーラムでUnityの方が回答している方法になります。

https://forum.unity.com/threads/distinguish-click-from-double-click.965684/

が、ご本人もおっしゃっている通りTrickyな方法であり、今後この辺りのワークフローを改善する考えがあるようなので、その点だけご注意ください。

方法

方法としては以下の通りです。

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public sealed class ExampleWindow : EditorWindow
{
    private void CreateGUI()
    {
        // シングルクリック用のClickableを作成
        var singleClickable = new Clickable(() => Debug.Log("Single Click"));
        singleClickable.activators.Clear();
        singleClickable.activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse, clickCount = 1 });
        
        // ダブルクリック用のClickableを作成
        var doubleClickable = new Clickable(() => Debug.Log("Double Click"));
        doubleClickable.activators.Clear();
        doubleClickable.activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse, clickCount = 2 });
 
        // ボタンを作成
        var button = new Button {text = "Click or Double Click Me!"};
        
        // まずAddManipulatorで、ダブルクリック用のClickableを設定
        button.AddManipulator(doubleClickable);
        
        // 次にシングルクリック用のClickableを設定
        button.clickable = singleClickable;
        
        rootVisualElement.Add(button);
    }

    [MenuItem("Window/Example")]
    private static void Open()
    {
        GetWindow<ExampleWindow>();
    }
}

ボタンに対して、シングルクリック用とダブルクリック用のClickableマニピュレータを二つ登録しています。
コメントに書いた通り、登録順が重要なので注意してください。

Window > Exampleからこのウィンドウを開くとボタンが表示され、シングルクリックとダブルクリックが検知されている挙動を確認できます。

動作確認

参考

https://forum.unity.com/threads/distinguish-click-from-double-click.965684/