【Unity】空のフォルダを一括で削除してくれるエディタ拡張を作った

ことはじめ

gitではフォルダは基本的に管理されず、中にファイルが有った場合にはフォルダを作る、という仕組みになっています。

対して、Unityではフォルダごとにmetaファイルが生成されるようになっています。

そのため、Unityのプロジェクトをgitで管理しているとき、他の人が削除したフォルダがローカルで反映されず、再度metaファイルが生成されてしまうなどの事故が起こりがちです。

その都度ローカルでも不要なフォルダを削除してやれば問題ないのですが、地味に面倒な作業だったため、自動で消してくれるエディタ拡張を作りました。

動作

不要なファイル群

f:id:notargs:20170510203847p:plain

ToolメニューからRemove empty foldersを選択

f:id:notargs:20170510204016p:plain

ログ

f:id:notargs:20170510203855p:plain

すっきり

f:id:notargs:20170510203907p:plain

コード

/*
EmptyFolderRemover

Copyright (c) 2017 Yutaka Sato

This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
*/
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class EmptyFolderRemover : Editor
{
    [MenuItem("Tools/Remove empty folders")]
    public static void Run()
    {
        var emptyDirectories = new List<string>();
        while (true)
        {
            emptyDirectories.Clear();
            ListUpEmptyDirectories("Assets", emptyDirectories);
            if (emptyDirectories.Count == 0) break;

            foreach (var path in emptyDirectories)
            {
                Directory.Delete(path);
                Debug.Log("Deleted: " + path);
            }
            AssetDatabase.Refresh();
        }
    }

    public static void ListUpEmptyDirectories(string path, List<string> emptyDirectories)
    {
        var directories = Directory.GetDirectories(path);
        var files = Directory.GetFiles(path);
        if (directories.Length + files.Length == 0)
        {
            emptyDirectories.Add(path);
            return;
        }
        foreach (var directory in directories)
        {
            ListUpEmptyDirectories(directory, emptyDirectories);
        }
    }
}