【Unity】MenuItemを使ってオリジナルショートカットキーを作る

Unity

はじめに

Unityで開発していると、
あらかじめ決まった形のコードを
ショートカットキーを押すだけで作成してみたいな~
って思ったことありませんか?

そんなときに役立つ方法を見つけたので
記事にしてみます。

参考になれば幸いです。

使う機能(MenuItem)

MenuItemを使用することで
オリジナルのショートカットキーを作ることができます。

MenuItemは
基本的にUnityエディタにメニューを追加するためのものです。

使い方は、staticなメソッドにMenuItem属性を付けるだけでOK。
この時、引数にメニューを表示する場所を指定します。

using UnityEngine;
using UnityEditor;  //←MenuItemを使用する際は必要です。

public class MenuItemSample : MonoBehaviour
{
    [MenuItem("テスト/ログ出力")]
    private static void ShowLog()
    {
        Debug.Log("ログ");
    }
}

上記のように記述すると、
Unityエディタ上のメニューバーに
「テスト」→「ログ出力」が表示されるようになり、
これをクリックするとコンソールに「ログ」が表示されます。
※ちなみにスクリプトをGameObjectにアタッチする必要はありません。
 スクリプトを生成するだけで勝手に使えるようになります。

ショートカットキー(ホットキー)の設定

先ほどの「テスト」→「ログ出力」を
ショットカットキーとして設定してみます。

使い方は下記のように、
引数のメニューの後にスペースを空けてキーを追加するだけです。

先ほどの例の「テスト」→「ログ出力」を
Ctrl + Nで実行できるようにしてみます。

using UnityEngine;
using UnityEditor;  //←MenuItemを使用する際は必要です。

public class MenuItemSample : MonoBehaviour
{
    [MenuItem("テスト/ログ出力 %n")] //←スペースと%nを追加
    private static void ShowLog()
    {
        Debug.Log("ログ");
    }
}

たったこれだけでショートカットとして登録することができます。

ショートカットに設定する際、
アルファベット以外のキーは以下で設定することが可能です。

  • % : CTRL (Windows) または command (OSX)
  • # : Shift
  • & : Altキー
  • LEFT/RIGHT/UP/DOWN : 方向キー
  • F1,F2…F12 : Fキー
  • HOME, END, PGUP, PGDN : HOME、END, PageUp, PageDown

実際にショートカットキーでコードを作ってみよう

私の場合は下記の形のコードを大量に生成する必要がありました。

Position = new Vector3(-3.67f, -1.70f, -1.50f),
Rotate = new Vector3(0.00f, 270.00f, 0.00f),

ですが、
Unityエディタ上でTransformのPositionやRotationを
右クリックからコピーした場合
下記のようなテキストでクリップボードにコピーされます。

//Positionをコピーした場合
Vector3(575,265.5,0)

//Rotationをコピーした場合
Vector3(327,184.5,302.100006)

ソースをこのまま貼り付けても
小数点を含む数値は末尾に「f」を付与してfloatとして記述しないといけません。

Position = new Vector3(575,265.5,0), //←265.5は265.5fと書かないとエラー
Rotate = new Vector3(327,184.5,302.100006),//184.5や302.100006も同様にエラー

ソースで使える形でTransformのPosition等をコピペしたい、
いっそのこと、newとか書くのも面倒くさいので、
まとめて生成しよう!っと思い作成したのが下記になります。

コード全文

#if DEBUG
    // コピー対象のオブジェクト
    public static GameObject copyObject;
    // コピー対象のオブジェクトのTransform
    public static Transform copyComponent;
    // context menu へ追加
    [MenuItem("MyTools/Component/Custom Position Rotation Copy #q", false, 100)]

    static void ComponentCopy()
    {
        // 現在選択されているオブジェクト
        copyObject = Selection.activeGameObject;
        if (copyObject == null)
        {
            return;
        }
        copyComponent = copyObject.transform;
        if (copyComponent == null)
        {
            return;
        }

        Vector3[] copyTransform = new Vector3[2];
        // 必要なTransformの要素を取得
        copyTransform[0] = copyComponent.localPosition;
        copyTransform[1] = copyComponent.localEulerAngles;

        StringBuilder strBuilder = new StringBuilder();

        strBuilder.AppendFormat("Position = new Vector3({0}f, {1}f, {2}f),\nRotate = new Vector3({3}f, {4}f, {5}f),",
            copyTransform[0].x.ToString("F2"), copyTransform[0].y.ToString("F2"), copyTransform[0].z.ToString("F2"),
            copyTransform[1].x.ToString("F2"), copyTransform[1].y.ToString("F2"), copyTransform[1].z.ToString("F2"));

        // 末尾のタブ列は不要なため削除
        //strBuilder.ToString().TrimEnd('\t');
        Debug.Log(strBuilder.ToString());
        // システムのバッファへコピー
        GUIUtility.systemCopyBuffer = strBuilder.ToString();
    }
#endif

コード解説

Selection.activeGameObject;

Unity上で現在選択されているオブジェクトがこの中に入っています。
例えば下記のような状態だとMainCameraが取得できます。

GUIUtility.systemCopyBuffer = strBuilder.ToString();

上記でクリップボードに保存できます。
Windowsの「Ctrl + c」(コピー)をしている感じです。

例ではショートカットキーを「Shift + q」にしているので、
「Shift + q」でクリップボードにコピーし、
好きな場所に「Ctrl + v」で貼り付けられます。

下記の例だとこのようになります。

Position = new Vector3(0.00f, 1.00f, -10.00f),
Rotate = new Vector3(0.00f, 0.00f, 0.00f),

まとめ

今回は自分のオリジナルショートカットキーを作成する方法を
私が実際に作成したサンプルを例に解説してみました。

私でよければ
何かわからないことをXのDM等でいただければ
時間があるときに返信しますので
お気軽にご連絡ください♪

参考資料

GUIUtility-systemCopyBuffer - Unity スクリプトリファレンス
Get access to the system-wide clipboard.
タイトルとURLをコピーしました