4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UnityAdvent Calendar 2024

Day 11

プロジェクトウィンドウにパスを表示する話

Last updated at Posted at 2024-12-11

アドカレ情報

前の日は...@LuminousNecoさんのUnityでもGithub Copilotをおすすめします
次の日は...@am1tanakaさんのUnity6ではじめてのAwaitable

要約

プロジェクトウィンドウのタイトルに開いているフォルダのパス(名前)を表示しておくと便利だよ。

本文

初めまして、ゲームエンジニアのwrsmAです。Unityとは仲良くさせてもらってます。
突然ですが、自分の環境ではプロジェクトウィンドウを複数画面出しておく機会が多いです。

image.png

このとき、ウィンドウ名が全て「Project」なので「どのウィンドウで何を見ていたか?」がとても分かりづらいと思っていました。

そこでEditorを拡張してウィンドウ名に現在開いているフォルダのパスを表示したら便利になりました。

image.png

実装

プロジェクトウィンドウはスクリプト上ではProjectBrowserとして実装されています。
ここから、実際に行った実装を以下の手順で紹介します。

  1. ProjectBrowserの実体を取得する
  2. 現在開いているパスを取得する
  3. ウィンドウの名前に反映する

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などと連携して機能の切り替えができるようにしても良いと思います。

階層の深いフォルダなどは、かえって分かりづらいこともあるので表示する文字列を調節するのもアリだと思います。

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?