夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityエディタ拡張で任意のショートカットキーを作成する。

本日はUnity調査枠です。

〇やりたいこと

今回はMixedRealityGraphicsToolsのスクリーンショット撮影機能に関してショートカットキーが欲しいと思い、MRGTのリポジトリにイシューを立てたところからエディタ上でショートカットキーってどうやって作るの?ということを調査、実装していきます。

〇MRGTのスクリーンショット撮影機能

本題とは少しずれてしまいますが、MRGTにはスクリーンショット撮影機能が提供されています。

redhologerbera.hatenablog.com

WindowsやMacであればいずれもOSの機能としてスクリーンショット機能は提供されていますが、MRGTのスクリーンショット機能はよりUnityxRアプリ開発に特化して提供されています。

 具体的にはハイケイノくりぬき画像生成や最大4倍までの解像度での出力に対応しています。

 しかしMRGTのスクリーンショット機能とWindowsのスクリーンショット機能を比較した際にMRGTのスクリーンショットの使いづらい場面があり、その理由がOS組み込みの機能に比べショートカットキーが提供されてないことでキャプチャを撮影する際はそのたびUnityのワールドメニューからプルダウンを下りキャプチャボタンを選択する必要があります。

 これは特にxRデバイスの開発においてはHMDをかけながら開発者の自由視点でキャプチャを取る際などに非常に困難な場合があります。

 このことからMRGTのスクリーンショット機能が優れているにも関わらず筆者自身はWindowsのスクリーンショット機能の方が使いやすいと思ったため、今回イシューとして報告しています。

github.com

〇UnityEditor拡張でスクリーンショットを組み込む

 Unity2019以降はShortcut Managerと呼ばれる機能が提供されています。

  docs.unity3d.com

 Unityでは上部ワールドメニューからEdit→Shortcut Managerから開くことができます。

 ここではすでに提供されている場面ごとのショートカットが一覧で表示されます。

 例えば、Main Menuを見ると[Ctrl]キー+[Alt]キー+[C]キーを押すことで、Assetsフォルダ内のパスのコピーができることがわかります。

 このようにあるコマンドを登録しておいて、Shortcut Managerでキーを割り当てする形になるようです。

 MRGTの一部の機能もこのShortcut Managerで管理されているようで、例えばMeasure Toolを見ると

[Shift]キー+[M]キーを押すことでウィンドウを開くことができることがわかります。

〇任意のショートカットキーの作成

ではここからは任意のショートカットキーの作成を行います。

次コードを書きました。

using UnityEditor;
using UnityEngine;

public static class ShortcutTest 
{
    [MenuItem( "Tools/ShortcutExample" )]
    private static void ShortcutExample()
    {
        Debug.Log( "実行" );
    }
}

using UnityEditorでわかるようにUnityのエディタ上で使用するもののためEditorフォルダ内にスクリプトを配置する必要があります。

これによってShortcut Managerのコマンド内に作成したShortcutExampleが表示されます。

表示されているコマンドをダブルクリックすることでキーの割り当てが行えます。

 今回はテストのため現在どのショートカットにも割り当てられていなかった9を割り当てています。

 Unityの画面に戻り9キーを選択することで無事に処理が実行されています。

コマンドもクラス内ではMonobehaviorが使用できない点が注意が必要ですが、UnityEditorのウィンドウを開いたり、次のように記述することでシーン内のチェックなどを行うこともできます。

using UnityEditor;
using UnityEngine;
using System.Collections;
using System.Linq;

public static class ShortcutTest 
{
    [MenuItem( "Tools/ShortcutExample" )]
    private static void ShortcutExample()
    { 
        var targetObject = GameObject.Find("Test");
        if (targetObject ==null)
        {
            Debug.Log("OK");
        }
        else
        {
            Debug.Log("NG");
        }
    }
}

 以上でショートカットキーの作り方と、処理の基本的な実装はわかったので実際にMRGTのスクリーンショットの撮影に取り組んでいきたいと思います。

本日は以上です。