質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1976閲覧

Unity ゲームオブジェクトを選択し直したときに常にインスペクターのコンポーネントを折りたたんで表示したい

7le2nniy

総合スコア6

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/10/23 02:48

前提・実現したいこと

イメージ説明

選択を切り替えたときに常に上の画像にある「すべてのコンポーネントを折りたたむ」の状態に
なるようにしたいです。

理由

TopDownEngineというアセットを使用しています。
敵キャラを作る際にゲームオブジェクトに取り付けるコンポーネントが多くなってしまいます。
(取り付けるコンポーネントを分割する機能もドキュメントにありましたがそれでも多くなります。)
切り替えたときに毎回コンポーネントが展開されて表示されて視認性が悪いです。

試したこと

ネットで検索してエディタ拡張という機能が近いようにも思いましたが
検索に使用する言葉選びが悪かったのか、自分の理解が及んでいないだけなのか
実現できるような記事等を見つけられませんでした。

補足情報(FW/ツールのバージョンなど)

unity 2020.3.9f1

TopDownEngine(アセット)のドキュメント

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エディタ拡張について調べるというのはもっともだと思います。ですがエディタ拡張というのは、自前でエディタ用スクリプトを作るなどでUnityエディタの機能を追加・改変する行為全般を指すものかと思いますので、範囲が広くて情報を得にくいかもしれませんね。

インスペクター周りについては、「自作のスクリプト用に専用のインスペクターを作って設定しやすくする」みたいなことでしたらUnity側に用意されている手段も充実していて、製作例も見つかりやすいかと思います。ですがちょっと調べてみたところでは、インスペクターウィンドウ自体への操作はUnityユーザ側から隠されていて、リファレンスにも情報が載っていないようです。

しかたないのでUnityCsReferenceの中の怪しそうなところを探してみたところ、インスペクターウィンドウの取得はInspectorWindow.GetInspectorsを、すべてのコンポーネントを折りたたむのはPropertyEditor.CollapseAllComponentsを使えそうな感じでした。
そこでプロジェクト内に「Editor」フォルダを作り、下記のようなスクリプトを入れたところ...

lang

1using System.Collections; 2using System.Reflection; 3using UnityEditor; 4 5[InitializeOnLoad] 6public static class AutomaticInspectorCollapser 7{ 8 // メニューのオン・オフを保持しておくための環境設定キー 9 private const string EnableCollapseComponentsAutomaticallyKey = "AutomaticInspectorCollapser.EnableCollapseComponentsAutomatically"; 10 11 // メニューを表示する場所 12 private const string CollapseComponentsAutomaticallyMenuPath = "Utility/Collapse Components Automatically"; 13 14 // メニューのオン・オフ状態 15 private static bool enableCollapseComponentsAutomatically; 16 17 // すべてのインスペクターウィンドウを取得するメソッド 18 private static readonly MethodInfo GetInspectorsMethod; 19 20 // インスペクター上のコンポーネントをすべて折りたたむメソッド 21 private static readonly MethodInfo CollapseAllComponentsMethod; 22 23 // 初期化処理 24 static AutomaticInspectorCollapser() 25 { 26 // 環境設定からメニューのオン・オフ状態を取得する 27 enableCollapseComponentsAutomatically = EditorPrefs.GetBool(EnableCollapseComponentsAutomaticallyKey); 28 29 // メソッド情報を取得する 30 var coreModuleAssembly = typeof(EditorWindow).Assembly; 31 var inspectorWindowType = coreModuleAssembly.GetType("UnityEditor.InspectorWindow"); 32 GetInspectorsMethod = inspectorWindowType.GetMethod( 33 "GetInspectors", 34 BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.NonPublic); 35 var propertyEditorType = coreModuleAssembly.GetType("UnityEditor.PropertyEditor"); 36 CollapseAllComponentsMethod = propertyEditorType.GetMethod( 37 "CollapseAllComponents", 38 BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.NonPublic); 39 40 // オン・オフ状態に応じて自動折りたたみ機能のオン・オフを切り替える 41 UpdateState(); 42 } 43 44 // メニューコマンド実行時の処理 45 [MenuItem(CollapseComponentsAutomaticallyMenuPath)] 46 private static void ToggleEnableCollapseComponentsAutomatically() 47 { 48 // オン・オフ状態を切り替えて... 49 enableCollapseComponentsAutomatically = !enableCollapseComponentsAutomatically; 50 51 // 現在のオン・オフ状態を環境設定に保存し... 52 EditorPrefs.SetBool(EnableCollapseComponentsAutomaticallyKey, enableCollapseComponentsAutomatically); 53 54 // オン・オフ状態に応じて自動折りたたみ機能のオン・オフを切り替える 55 UpdateState(); 56 } 57 58 // 自動折りたたみ機能のオン・オフ切り替え処理 59 private static void UpdateState() 60 { 61 // オン・オフ状態に応じてメニュー項目にチェックマークを入れる 62 Menu.SetChecked(CollapseComponentsAutomaticallyMenuPath, enableCollapseComponentsAutomatically); 63 64 if (enableCollapseComponentsAutomatically) 65 { 66 // オン状態なら、選択対象切り替え時に折りたたみを実行するよう設定し... 67 Selection.selectionChanged += CollapseComponents; 68 } 69 else 70 { 71 // オフ状態なら、折りたたみ処理を解除する 72 Selection.selectionChanged -= CollapseComponents; 73 } 74 } 75 76 // 折りたたみ処理 77 private static void CollapseComponents() 78 { 79 // すべてのインスペクターウィンドウを取得し... 80 var inspectors = GetInspectorsMethod.Invoke(null, null) as IEnumerable; 81 82 // それぞれについてコンポーネント折りたたみを実行する 83 foreach (var inspector in inspectors) 84 { 85 CollapseAllComponentsMethod.Invoke(inspector, null); 86 } 87 } 88}

メニューバーに「Utility」→「Collapse Components Automatically」メニューが追加されますので、それをオンにするとオブジェクト切り替え時にインスペクター上の各コンポーネントが折りたたまれるようになりました。

図

投稿2021/10/23 13:30

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

7le2nniy

2021/10/24 11:31

回答ありがとうございます。 自分の環境でもできるようになりました。 丁寧なコメント付きのコードで非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問