アドカレ情報
前の日は...@LuminousNecoさんのUnityでもGithub Copilotをおすすめします
次の日は...@am1tanakaさんのUnity6ではじめてのAwaitable
要約
プロジェクトウィンドウのタイトルに開いているフォルダのパス(名前)を表示しておくと便利だよ。
本文
初めまして、ゲームエンジニアのwrsmAです。Unityとは仲良くさせてもらってます。
突然ですが、自分の環境ではプロジェクトウィンドウを複数画面出しておく機会が多いです。
このとき、ウィンドウ名が全て「Project」なので「どのウィンドウで何を見ていたか?」がとても分かりづらいと思っていました。
そこでEditorを拡張してウィンドウ名に現在開いているフォルダのパスを表示したら便利になりました。
実装
プロジェクトウィンドウはスクリプト上ではProjectBrowserとして実装されています。
ここから、実際に行った実装を以下の手順で紹介します。
- ProjectBrowserの実体を取得する
- 現在開いているパスを取得する
- ウィンドウの名前に反映する
1. ProjectBrowserの実体を取得する
Reflectionを用いてTypeの取得からObjectの取得までを行っています。
AssemblyやTypeは適宜キャッシュしておくと良いと思います。
また、後の手順でtitleContent
にアクセスするためEditorWindow
の配列にキャストしています。
using System;
using System.Reflection;
using UnityEditor;
using UnityEngine;
public static class ProjectBrowserExtender{
private static readonly Type _projectBrowserType;
static ProjectBrowserExtender(){
var asm = Assembly.Load("UnityEditor");
_projectBrowserType = asm.GetType("UnityEditor.ProjectBrowser");
}
/// <summary>
/// 全てのProjectBrowserの実体を取得する
/// </summary>
public static EditorWindow[] GetAllProjectBrowsers(){
return Resources.FindObjectsOfTypeAll(_projectBrowserType) as EditorWindow[];
}
}
2. 現在開いているパスを取得する
ProjectBrowser
に、現在開いているパスを取得するためのGetActiveFolderPath
メソッドが存在するので、
それを用いてパスの取得を行います。
念のため、引数に渡された実体がProjectBrowser
かどうかをチェックしています。
public static class ProjectBrowserExtender{
.
.
.
/// <summary>
/// ProjectBrowserが開いているフォルダのパスを取得する
/// </summary>
public static string GetActiveFolderPath(EditorWindow window){
if (_projectBrowserType.IsInstanceOfType(window) == false){
throw new Exception("window is not ProjectBrowser");
}
var methodInfo = _projectBrowserType.GetMethod("GetActiveFolderPath", BindingFlags.NonPublic | BindingFlags.Instance);
return (string)methodInfo.Invoke(window, null);
}
}
3. ウィンドウの名前に反映する
ウィンドウの名前はEditorWindow
クラスが持つtitleContent
を書き換えることで変更できます。
[InitializeOnLoad]
public static class ProjectBrowserTitleOverwriter{
static ProjectBrowserTitleOverwriter(){
EditorApplication.update -= OnUpdate;
EditorApplication.update += OnUpdate;
}
static void OnUpdate(){
foreach (var window in ProjectBrowserExtender.GetAllProjectBrowsers()){
var activeFolderPathStr = ProjectBrowserExtender.GetActiveFolderPath(window);
window.titleContent = EditorGUIUtility.TrTextContent(activeFolderPathStr);
}
}
あとがき
紹介した実装では、OnUpdateにそのまま書きましたがEditorPrefsなどと連携して機能の切り替えができるようにしても良いと思います。
階層の深いフォルダなどは、かえって分かりづらいこともあるので表示する文字列を調節するのもアリだと思います。