[Unity] AssetDatabase.DeleteAssetをディレクトリに実行して失敗するときの対処法

ヨメレバCSS
オリジナルCSS


※本サイトはアフィリエイトプログラムによる収益を得ています。
 ページ内のリンクがアフィリエイトリンクの場合があります。

 エディターでAssetDatabase.DeleteAssetをディレクトリに指定すると、再帰的にそれ以下のアセットも消してくれます。ですがそうやってディレクトリをまとめて消そうとしたときに、falseが返ってきて失敗することがあります。

 他のアプリで開いてるファイルがありロックされている、読み取り専用になっているなどの場合はそれぞれ対処してから再実行してもらうといいのですが、なんかディレクトリ以下のファイル数が多いときにも失敗することがある。

 そういうときには再帰処理を組んで、下層のファイル/ディレクトリを個別に消していってやると上手くいきます。

コード的にはこんな感じ。

	[MenuItem("Sample/Delete asset")]
	public static void Delete() {
		// Assets/Sampleを削除してみる
		DeleteAssetDirectory ("Assets/Sample");
	}

	private static bool DeleteAssetDirectory(string assetPath) {
		// 自分をDeleteAssetで消すのを試してみる
		// これに失敗したら、個別に消す
		if ( AssetDatabase.DeleteAsset (assetPath)) {
			Debug.Log("Delete Asset: "+assetPath);
			return true;
		}

		string[] dirpathlist = Directory.GetDirectories (assetPath);

		// ディレクトリをひとつづつ消す
		foreach (string path in dirpathlist) {
			if ( false == DeleteAssetDirectory(path) ) {
				Debug.LogError("Delete Asset Directory Error: "+path);
				return false;
			}
		}

		// ファイルをひとつづつ消す
		string[] filepathlist = Directory.GetFiles (assetPath);
		foreach (string path in filepathlist) {
			// metaファイルは避ける
			if ( path.EndsWith(".meta") ) {
				continue;
			}

			if ( false == AssetDatabase.DeleteAsset(path) ) {
				Debug.LogError("Delete Asset Files Error: "+path);
				return false;
			}
		}

		Debug.Log("Delete Asset: "+assetPath);
		return true;
	}

 これはサンプルなので実際に使うときにはそれぞれまとめてください。

 また、以下の部分が注意点になります。

・一つづつ再帰的に消すより、DeleteAssetしたほうが圧倒的に速い

 圧倒的に速い。これは実際に大量のファイルで試していただければおわかりになると思います。

 なのでコードサンプルでも、まずDeleteAssetで消せないか試しています。

 DeleteAssetをしたあとにAssetの再読込しているようなので、纏めて消すよう指示したほうがオーバーヘッドが少ないのでしょう。

・.metaファイルは避ける

 Direcotry.GetFilesはC#標準のメソッドになるため、unityの管理ファイルである.metaも拾ってきます。これはDeleteAssetできないので除くようにします。

・最悪、Directory.Deleteなど、ファイルシステム操作から消してしまう

 これは本当に最後の手段ですが、C#標準メソッドのDiretory.Deleteはファイルシステムから削除かけてくれるからつよい。

 ただですね、Unityのマニュアルには、

Unity はアセットファイルのメタデータを保持するため、絶対に Unity 以外のファイルシステムを使用してアセットの作成、移動、削除をすべきではありません。Unity上でAssetDatabase.ContainsAssetDatabase.CreateAssetAssetDatabase.CreateFolderAssetDatabase.RenameAssetAssetDatabase.CopyAssetAssetDatabase.MoveAssetAssetDatabase.MoveAssetToTrashAssetDatabase.DeleteAssetの API を使用してファイルを操作します。

とはっきり書いてあります。使用しないに超したことはないと思います。

スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)