スクリプトからオブジェクトをリネーム可能な状態にする

スクリプトから以下のような画像の状態にする方法解説します。

スポンサーリンク

ソースコード

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

namespace Norakyo.Internal
{
    internal static class Sample
    {
        [MenuItem("Edit/RenameSample")]
        private static void Rename()
        {
            var shwType = typeof(UnityEditor.Editor)
                .Assembly.GetTypes().First(x => x.FullName == "UnityEditor.SceneHierarchyWindow");
            
            shwType.InvokeMember("FrameAndRenameNewGameObject"
                , BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod 
                , null, null, new object[] { });
        }
    }
}

解説

1行目

var shwType = typeof(UnityEditor.Editor)
                  .Assembly.GetType("UnityEditor.SceneHierarchyWindow");

UnityEditor.SceneHierarchyWindowクラスのTypeを取得しています。

typeof(UnityEditor.Editor).Assembly の部分でアセンブリを取得しています。

たんに Type.GetType(“UnityEditor.SceneHierarchyWindow”); と書くだけでは取得できないので注意。

2行目

shwType.InvokeMember("FrameAndRenameNewGameObject"
    , BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod 
    , null, null, new object[] { });

オブジェクトをリネーム可能な状態にする関数は「FrameAndRenameNewGameObject」という関数なのですが、アクセス修飾子がinternalなので、InvokeMember関数を利用して呼び出します。

おわりに

スクリプトからオブジェクトを生成した時に、同時に名前も変えたいときなどに使えると思います。

以下の記事が利用例です

ちなみに、リネームのショートカットは”F2“です。覚えておくと便利でしょう。

参考

https://github.com/Unity-Technologies/UnityCsReference/blob/e740821767d2290238ea7954457333f06e952bad/Editor/Mono/SceneHierarchyWindow.cs

コメント

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