追記
いや、改めてググったら 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を作ってしまうと挙動が不安定になりますのでご注意ください…ってそんな名付け(既存ウィンドウと同名の名付け)する人はいないか。