はじめに
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等でいただければ
時間があるときに返信しますので
お気軽にご連絡ください♪