Unityでディレクトリ操作する
Pathの取得
C#の System.IO を用いてUnityのプロジェクトないのファイルにアクセスするために絶対パスを用いる必要がある。以下で取得できる。
string assetsPath = Application.dataPath; // assetsPath : /Users/ **hoge** / ~プロジェクトまでのパス~ /Assets // 実際にアクセスする際には以下のようにする string targetPath = assetsPath + "/Scripts/Game/Player/Player.cs";
AssetDataBaseの更新
ファイル操作を行なった情報を更新するためにAssetDataBaseを更新する必要がある。ファイルを作成したり削除した際には更新処理を呼び出す必要がある。
// ~ファイルやディレクトリの生成、削除処理~
AssetDatabase.Refresh();
ディレクトリ操作
string path = "絶対パス"; // ディレクトリが存在するかどうか bool isExist = Directory.Exsists(path); // ディレクトリを作成する DirectoryInfo info = Directory.CreateDirectory(path); AssetDatabase.Refresh();
ディレクトリを作成する場合親ディレクトリが存在しなかったら階層的にディレクトリを作成していく。既に存在している場合には何も起こらない。
ディレクトリを削除する際にはmetaファイルも消さなくてはならない。Assets/Scripts/Test
というディレクトリを削除する際にディレクトリだけを削除するとmeta
ファイルが残ってしまいAssetsDatabase.Refresh()
が起こった際に再度生成されてしまうことがある。metaファイルも同時に削除する。また削除する際に指定したディレクトリが存在しない時にDirectoryNotFoundException
のエラーが出てしまうためディレクトリの存在確認をする必要がある。そのままではディレクトリが空でない時にエラーが生じる。ディレクトリが空でない時は第二引数にtrueを入れることで再起的に削除することができる。
string path = "絶対パス"; if(Directory.Exists(path)){ // ディレクトリ自体の削除(ディレクトリが空の時) Directory.Delete(path); // ディレクトリを再起的に削除(子ディレクトリも削除) // Directory.Delete(path, true); // ディレクトリ情報を持つmetaファイルの削除 File.Delete(path + ".meta"); AssetDatabase.Refresh(); } else { Debug.LogWarning($"{path} は存在しませんでした"): }
ディレクトリ以下のファイルを取得する
ディレクトリ以下のファイルを全て取得する。ディレクトリの名前はfilesには入らないがmetaファイルは入る。
string path = "絶対パス"; if(Directory.Exists(path)){ string[] files = Directory.GetFiles(targetPath); // 再起的にディレクトリ以下のファイル全てを取得したい場合 // string[] files = Directory.GetFiles(targetPath, "*", SearchOption.AllDirectories); Debug.LogWarning(files.Length); for (int i = 0; i < files.Length; i++) { // files[i]は絶対パスで返される。metaファイルも含まれる。ディレクトリは含まれない。 Debug.Log(files[i]); } } else { Debug.LogWarning($"{path} は存在しませんでした"): }
まとめ
Application.datapathを使用して絶対パスを取得してからはAssets以下のディレクトリ操作を行うことができる。metaファイルを削除してAssetsDatabaseを更新しないと予期せぬエラーが生じることがあるので注意する必要がある。ディレクトリが存在しない時のエラー対応も必要である。