困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

Unityの話~エディター拡張を頑張る話3:GameObjectに対する振舞~

使いそうな物を何点か実装。

〇transformの値を初期化する。

// GameObjectのpos/rotate/scaleを初期化する
[UnityEditor.MenuItem("ShortCutCommand/VimParameterClear &u")]
public static void VimParameterClear() {
    Debug.Log("Para Clear");
    GameObject obj = Selection.activeGameObject;
    obj.transform.localScale = Vector3.one;
    obj.transform.localPosition = Vector3.zero;
    obj.transform.localRotation = Quaternion.Euler(Vector3.zero);
}

Selection.activeGameObjectというのが、Hieraricy上で選択している物。無ければNULLになる。

〇選択しているオブジェクトの保存

public static GameObject SaveObject = null;
// GameObjectの内容を保存する
[UnityEditor.MenuItem("ShortCutCommand/VimParameterSave &y")]
public static void VimParameterSave() {
    Debug.Log("Para Save");
    SaveObject = Selection.activeGameObject;
}

どうやら、staticの値も使えるようだ。ただし、一度Unityを実行するなど、再ビルドが走ると初期化されるようなので注意。
これ単体では何も使えないが、以下の物と組み合わせて使う想定。

〇transformの値を上書き

// GameObjectのpos/rotate/scaleを上書きする
[UnityEditor.MenuItem("ShortCutCommand/VimParameterPaste &v")]
public static void VimParameterPaste() {
    if (SaveObject != null) {
        Debug.Log("Para Paste");
        GameObject obj = Selection.activeGameObject;
        obj.transform.localPosition = SaveObject.transform.localPosition;
        obj.transform.localScale= SaveObject.transform.localScale;
        obj.transform.localRotation = SaveObject.transform.localRotation;
    }
}

保存したオブジェクトのtransformの値で上書き。使うかどうか微妙なところだが、結構同じ値を入れるような事があった気がするので作ってみた。

〇オブジェクトを、選択しているオブジェクトの子供にする

// GameObjectを移動させる
[UnityEditor.MenuItem("ShortCutCommand/VimMoveObject &p")]
public static void VimMoveObject() {
    if (SaveObject != null) {
        Debug.Log("Para Move");
        GameObject obj = Selection.activeGameObject;
        if (obj != null) {
            SaveObject.transform.SetParent(obj.transform);
        } else {
            SaveObject.transform.SetParent(null);
        }
    }
}

保存したオブジェクトを、今フォーカスしているオブジェクトの子供にする。つまり、移動機能である。何もフォーカスしなければ、いわゆるSetParent(null)と同じ挙動をする。

〇AddComponentを呼び出す

// AddComponentをする
[UnityEditor.MenuItem("ShortCutCommand/VimAddComponent &a")]
public static void VimAddComponent() {
    Debug.Log("AddComponent");
    EditorApplication.ExecuteMenuItem("Component/Add...");
}

InspectorのAddComponentを押した時と同じ挙動をさせる。
EditorAppication.ExecuteMenuItemというのは、すでにUnityの存在するメニューを呼び出す関数のようだ。
見落としがちだが、実は結構有能なメニューとショートカットコマンドがデフォで使えるようになっているのに気が付いた。ちゃんと見てみないとダメだね。
このコマンドは、その備え付けのAddComponentを呼び出しているだけだ。呼び出した後、きちんと入力エディットにフォーカスが入っているのもGood。

とりあえず、GameObjectに対する振舞は上記機能だけ使ってみて様子見をしてみることにする。また追加があれば更新する。