【Unity】【エディタ拡張】キーボードショートカットを実装する

Unityのエディタ拡張でキーボードショートカットを実装する方法をまとめました。

Unity2019.4

はじめに

この記事ではUnityのエディタ拡張でキーボードショートカットを実装する方法についてまとめます。

UnityにおけるショートカットはUnity2019.1で導入されたショートカットマネージャーによって簡単に設定できるようになったので、基本的にはこれを使った方法を紹介します。
ただしEditorWindowでコンフリクトが発生するケースでは従来の方法で実装する必要があるのでこれも併せて紹介します。

グローバルなショートカットを作成する

まずグローバルな(Unity上のどこでも動作する)ショートカットの設定方法です。
ショートカットの設定にはShortcutアトリビュートを使います。

[Shortcut("ExampleShortcut / Global", null, KeyCode.G, ShortcutModifiers.Action)]
public static void GlobalExample()
{
    Debug.Log("Global Example");
}

第一引数にはショートカットマネージャーに表示される名前を入れ、
第二引数はグローバルなショートカットの場合にはnullを入れておきます。

第三引数にキーを入力します。
またShiftやCommandを押しながらのショートカットを設定するには第四引数も設定します。
上記のShortcutModifiers.ActionWindowsならCtrl、MacならCommandを示します。

EditorWindowのショートカットを作成する

つぎに特定のEditorWindow上でのみ動作するショートカットを作成します。
このためには以下のように第二引数に特定のEditorWindowの型を指定します。

[Shortcut("ExampleShortcut / Local", typeof(ExampleWindow), KeyCode.L, ShortcutModifiers.Action)]
public static void LocalExample()
{
    Debug.Log("Local Example");
}

これでこのショートカットはExampleWindowでのみ動作するようになりました。

EditorWindowのショートカットとグローバルなショートカットのコンフリクト

EditorWindowのショートカットとグローバルなショートカットはコンフリクトする可能性があります。
例えば以下のようにCtrl + SのショートカットをEditorWindowに設定するとあらかじめ設定されているグローバルなものとを衝突します。

[Shortcut("ExampleShortcut / Local", typeof(ExampleWindow), KeyCode.S, ShortcutModifiers.Action)]
public static void LocalExample()
{
    Debug.Log("Local Example");
}

コンフリクトしたショートカットを実行しようとすると以下のような警告画面が表示されてしまいます。

f:id:halya_11:20201022112247p:plain
コンフリクト

このような場合には従来のようにEditorWindowのOnGUIでショートカットを設定する必要があります。
もしEditorWindowのCtrl + Sを優先したい場合には以下のようにOnGUIで処理をしてからEvent.Use()をしておけばショートカットマネージャーのショートカットは実行されません。

private void OnGUI()
{
    var e = Event.current;
    if (GetEventAction(e) && e.type == EventType.KeyDown && e.keyCode == KeyCode.S)
    { 
        Debug.Log("Local Example");
        e.Use();
    }
}

private bool GetEventAction(Event e)
{
#if UNITY_EDITOR_WIN
    return e.control;
#else
    return e.command;
#endif
}

なおUIElementsの場合はOnGUIではなく以下を使います(試してないので詳細は割愛)。

ショートカットマネージャー

ちなみにショートカットマネージャーに設定されているショートカットはEdit > ShortcutsMacの場合はUnity > Shortcuts)から確認できます。

f:id:halya_11:20201022113645p:plain
ショートカットマネージャー

これを使うと自分なりのショートカットキーにカスタムできたりしますが、今回の主旨から逸れるので割愛します。

参考

docs.unity3d.com