1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【小ネタ】指定したtitleのEditorWindowを取得してをRepaintする

Last updated at Posted at 2022-03-15

追記

いや、改めてググったら EditorApplication.RepaintProjectWindow() が有るじゃん。

という事でこっちを使います。
ただ「自由なTitle名を指定して、EditorWindowを引っ張ったり、Repaintしたりするための知見」として、下記の記事を残しておきます

はじめに

ふと「ProjectWindowを描画更新したい」と思い、方法を調べていました。

ProjectBrowserについて

先ず「とっかかり」は無いかなぁ、と探したところ EditorUtility.FocusProjectWindow() が有りました。

「おっ、あっさり実装できそうじゃん」と思い、Riderで内部コードを見てみると、

Resources.FindObjectsOfTypeAll(typeof (ProjectBrowser));

でProjectBrowserを確保してフォーカスを当てているようですが、
どうやらProjectWindowことProjectBrowserクラスはUnityEditor.dllのinternalクラスのようです。
「うーん、わざわざRefrectionを使うほどの話でもないし、じゃあまぁEditorUtility.FocusProjectWindow()を呼べばRepaint()もかかるかなぁ」とも思いましたが、
別にフォーカスを当てる事まではしたいわけではないのです。
Repaint()が出来れば十分。

EditorWindowで確保して名前比較

という事で、どうしたもんかなーと考えた結果、基底クラスのEditorWindowはinternalではないので、
そちらでFindObjectsOfTypeAll()を行いRepaintをすることにしました。
ProjectBrowserかどうか、についてはシンプルにtitleの文字列比較で。。
文字列比較は重めですが、まぁEditor用なのでそれほどヒステリックに負荷を気にしなくても良いでしょう。
※FindObjectsOfTypeAll()を使っている時点で負荷的な話は言及しない方向で…。

という事でコードはこちら。

コードの一部
    /// <summary>
    /// ProjectorWindowをRepaintする
    /// </summary>
    private static void RepaintProjectWindow()
    {
        const string projectBrowserTitleText = "Project";
        RepaintEditorWindow(projectBrowserTitleText);
    }
    
    /// <summary>
    /// 渡されたtitleのEditorWindowをRepaintする
    /// </summary>
    /// <param name="title">目的のEditorWindowのtitle</param>
    private static void RepaintEditorWindow(string title)
    {
        var editorWindows = Resources.FindObjectsOfTypeAll<EditorWindow>();
        var targetEditorWindow = System.Array.Find(editorWindows, editorWindow => editorWindow.titleContent.text == title);
        if (targetEditorWindow == null)
        {
            //見つからなかったら抜ける
            return;
        }

        targetEditorWindow.Repaint();
    }

という事で、単純にEditorWindowを引っ張ってきて名前で取得する形にしておきました。

RepaintProjectWindow();

を呼ぶことでProjectWindowを描画更新できます。

もしかするともっとイケている実装があるかもしれませんが、とりあえずわかりやすさ優先という事で。
titleさえ一致すればRepaintできるので

RepaintEditorWindow("Inspector");

とすればInspectorWindowを外部からRepaintする事も可能です。

注意点

当然ですが、他に「Project」というタイトルを付けたEditorWindowを作ってしまうと挙動が不安定になりますのでご注意ください…ってそんな名付け(既存ウィンドウと同名の名付け)する人はいないか。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?