同じ階層にゲームオブジェクト(きょうだいオブジェクト)を生成するショートカット【Unity】【エディタ拡張】

Unityにはゲームオブジェクトを生成するショートカットが3つあるのですが、

Ctrl(Cmd)+Shift+N一番上の階層にオブジェクトを生成
Alt+Shift+N選択中のオブジェクトの子としてオブジェクトを生成
Ctrl(Cmd)+Shift+G選択中のオブジェクトの親としてオブジェクトを生成

なぜか、同じ階層にオブジェクトを生成するショートカットがないので作ることにしました。

スポンサーリンク

ソースコード

using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;

namespace Norakyo.Internal
{
    internal static class Shortcuts
    {
        [MenuItem("GameObject/Create Empty Sibling %&n")]
        private static void CreateEmptySibling()
        { 
            //選択中のオブジェクトを取得
            var selectedObject = Selection.activeGameObject;
            if (!selectedObject)
            {
                return;
            }
            var parent = selectedObject.transform.parent;
            if (!parent)
            {
                return;
            }
            Place(ObjectFactory.CreateGameObject("GameObject"), parent.gameObject);
        }
   
        private static void SetGameObjectParent(GameObject go, Transform parentTransform)
        {
            var transform = go.transform;
            Undo.SetTransformParent(transform, parentTransform, "Reparenting");
            transform.localPosition = Vector3.zero;
            transform.localRotation = Quaternion.identity;
            transform.localScale = Vector3.one;
            go.layer = parentTransform.gameObject.layer;

            if (parentTransform.GetComponent<RectTransform>())
                ObjectFactory.AddComponent<RectTransform>(go);
        }

        private static void Place(GameObject go, GameObject parent)
        {
            SetGameObjectParent(go, parent.transform);
            //同じ名前のオブジェクトがきょうだいにいないかどうかをさがしてあったら改名する
            GameObjectUtility.EnsureUniqueNameForSibling(go);
            Undo.SetCurrentGroupName("Create " + go.name);
            var shwType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.SceneHierarchyWindow");
            //ヒエラルキーウィンドウをフォーカスする
            EditorWindow.FocusWindowIfItsOpen(shwType);
            //選択中のオブジェクトを変更
            Selection.activeGameObject = go;
            //リネームモードにする
            shwType.InvokeMember("FrameAndRenameNewGameObject", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod , null, null, new object[] { });
        }
    }
}

使い方

ショートカットは、Ctrl(Cmd)+Alt+Nに割り当てました。

変えたい場合は、MenuItemの”%&n“(%はCtrl(Cmd)、&はShiftを表している)の部分を変えるか

Edit/Shortcuts」から

Main Menu」にある「GameObject/Create Empty Sibling」のショートカットを変更してください。

結果

おわりに

バージョンは2020.3向けに作ったので、それ以外のバージョンで正常に動作する保証はないです。(Internalなメソッドを使用しているので使えなくなる可能性があります)

ちなみに、ソースコードで使われている「Sibling」は「男女の区別なくきょうだい」を表す言葉らしいです。今回初めて知りました。

参考

https://github.com/Unity-Technologies/UnityCsReference/blob/2020.3/Editor/Mono/Commands/GOCreationCommands.cs

コメント

タイトルとURLをコピーしました