【Unity】Projectビューの左側に表示されているフォルダ一覧を取得する

  • 1
    いいね
  • 0
    コメント

はじめに

Projectビューの左側に表示されている情報を取得する方法を調べてみました。
UnityのバージョンはUnity5.5.0b7です。

実装

UnityのAPIにはProjectビューの情報を取得する機能が用意されていません。
そこで、C#のリフレクションを使って強引にデータを取得してみます。 

Test.cs
/// <summary>
/// ProjectBrowserの左に表示されているフォルダ名を取得
/// </summary>
private static IEnumerable<string> GetFolderTreeNames()
{
    // Projectウィンドウ取得
    var asm = Assembly.Load("UnityEditor.dll");
    var typeProjectBrowser = asm.GetType("UnityEditor.ProjectBrowser");
    var projectBrowserWindow = EditorWindow.GetWindow(typeProjectBrowser, false, "Project", false);

    // フォルダの一覧取得
    var flag = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance;
    var m_FolderTree = typeProjectBrowser.GetField("m_FolderTree", flag).GetValue(projectBrowserWindow);
    var data = m_FolderTree.GetType().GetProperty("data", flag).GetValue(m_FolderTree, null);
    var m_Rows = data.GetType().GetField("m_Rows", flag).GetValue(data);
    var rowList = (IList)m_Rows;

    // フォルダの一覧取得
    for (int i = 0; i < rowList.Count; i++)
    {
        if (rowList[i].GetType().ToString() != "UnityEditor.IMGUI.Controls.TreeViewItem")
        {
            continue;
        }

        yield return (string)rowList[i].GetType().GetProperty("displayName", flag).GetValue(rowList[i], null);
    }
}

なお、この方法はUnityのバージョンが上がると使えなくなる可能性があるのでご了承ください。

実行

Linqを使ってConsoleに出力してみます。

Test.cs
GetFolderTreeNames().ToList().ForEach(s => Debug.Log(s));

実行結果
image

フォルダ一覧の名前を正しく取得できていることが確認できました(完