【Unity】パネルのスクリプトを開く【エディタ拡張】

こんにちは。
Unityのエディタ拡張ではUIパネルを使用できますが、そのエディタ拡張を実際に使用する中で機能の修正や追加変更を行いたいことがままありそうだと思った。

という訳で、右クリックメニューから自身のスクリプトを開けるスクリプトを書いてみた。

■やりたいこと

・GUIを使用したエディタ拡張を作成する(いずれ)
・そのエディタ拡張を実際に利用する(予定)
・利用する中で改善案や追加機能を思いつく(はず)
・そのときにスクリプトの編集をスムーズに始めたい←そもそもその時にはスクリプト名を覚えてない可能性もある(と思う)

■制作した環境

・Win10
・Unity Version 2019.4.10f1

■ソースコード

// ExtensionPanelMenuusing System;
using UnityEditor;
using UnityEngine;
namespace gyaricsontool.editorextension
{
   public class ExtensionPanelMenu : EditorWindow
   {
       [MenuItem("Tool/SamplePanel")]
       public static void Init()
       {
           EditorWindow.GetWindow<ExtensionPanelMenu>("SamplePanel");
       }

       public void OnGUI()
       {
           // ユーザー入力を取得
           var e = Event.current;
           Rect rc = new Rect(0.0f, 0.0f, Screen.width, Screen.height);
           if(e.type == EventType.ContextClick)
           {
               // 右クリック
               GenericMenu menu = new GenericMenu();   // Menuを作成
               menu.AddItem(new GUIContent("SampleFunc"), false, SampleFunc, null);    // Menuにアイテムを追加
               /*
                * アイテム名, アイテムの有効状況, 実行する関数, 関数への引数
                */
               menu.AddSeparator("");
               menu.ShowAsContext();   // Menuを表示
               e.Use();    // イベント消費
           }
       }
       /// <summary>
       /// コンテキストメニューから実行するSampleFunc
       /// パネルのスクリプトを開く
       /// </summary>
       /// <param name="obj"></param>
       public void SampleFunc(object obj)
       {
           var mono = MonoScript.FromScriptableObject(this);
           if(mono != null)
           {
               var path = AssetDatabase.GetAssetPath(mono);
               UnityEngine.Object ueObj = AssetDatabase.LoadAssetAtPath(path, typeof(UnityEngine.Object)) as UnityEngine.Object;
               if(ueObj != null)
               {
                   Selection.activeObject = ueObj;
                   AssetDatabase.OpenAsset(ueObj);
               }
           }
           Debug.Log($"Hallo, Now time is {DateTime.Now}");
       }
   }
}

■解説

メニューバーから [Tool] → [SamplePanel] を選択すると空のパネルを開きます。

画像1

そのパネルの上で右クリックでコンテキストメニューの [SampleFunc] を選択するとスクリプトを開きます。

画像2

スクリプトはUnityに関連付けされているエディタで開かれます。

■改善について

今後新たにGUIを使用するスクリプトを作成する際に、このクラスを継承?したものを利用してコンテキストメニューの作成を簡単にできるようにしたい。
ちなみに、筆者はもともとCがメインときどきVBAやESTK程度の経験なのでオブジェクト指向系自体が全然わかっておらず、実際どうすればいい感じにできるのかまるで見当がついていない。
気長にがんばろうと思います。

■参考

https://docs.unity3d.com/ja/2018.4/ScriptReference/GenericMenu.AddItem.html

https://docs.unity3d.com/ja/2018.4/ScriptReference/AssetDatabase.OpenAsset.html


この記事が気に入ったらサポートをしてみませんか?