UnityProject 内のファイル操作なら AssetDatabase
を利用すれば可能ですが
UnityProject 外からファイルを操作する場合は System.IO
系を利用する必要があり
こちらはルートからのフルパスで指定する必要がある
※ AssetDatabase であれば "Assets/" から始まるパスで良い
外部のパスを取得するのには EditorUtility.OpenFilePanel
を利用します
これでコピー元のパスはわかったので
次はコピー先のパスが必要です
コピー先のパスを知るには UnityProjectまでのパスを知れる Application.dataPath
を利用します
Application.dataPath
と Assets/
から始まるパス を Replace("Assets", "Assets/...") することでフルパスが取得できます
また環境によってはファイルパスの区切りがことなるので System.IO.Path.DirectorySeparatorChar
を利用して
環境が変わっても動作するように変換処理をしておきます
これで両方のパスがわかったので System.IO.File.Copy(srcPath, fullDstPath);
でコピーすれば完了です
コピーしたあとは AssetDatabase.Refresh();
を呼び出さないとインポートされないファイルを
ロードしたりできないのでこのあとに操作する場合は忘れずに呼び出しましょう
サンプル
/// <summary> /// Unity外のファイルをコピー /// </summary> /// <param name="dstPath">Begin "Assets/"</param> private static void Copy(string dstPath) { var srcPath = EditorUtility.OpenFilePanel("Select File", "", ""); if (string.IsNullOrEmpty(srcPath)) return; // System.IO で コピーするので区切りを DirectorySeparatorChar に変更する srcPath = srcPath.Replace('/', System.IO.Path.DirectorySeparatorChar); var fileName = System.IO.Path.GetFileName(srcPath); var savePath = dstPath + System.IO.Path.DirectorySeparatorChar + fileName; // System.IO.File.Copy で コピーする場合は フルパス 変換する必要があるので Application.dataPath でReplace var fullDstPath = Application.dataPath.Replace("Assets", savePath).Replace('/', System.IO.Path.DirectorySeparatorChar); System.IO.File.Copy(srcPath, fullDstPath); }