うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】UnityProject 外のファイルを UnityProject にコピーする

UnityProject 内のファイル操作なら AssetDatabase を利用すれば可能ですが
UnityProject 外からファイルを操作する場合は System.IO 系を利用する必要があり
こちらはルートからのフルパスで指定する必要がある

※ AssetDatabase であれば "Assets/" から始まるパスで良い

外部のパスを取得するのには EditorUtility.OpenFilePanel を利用します

これでコピー元のパスはわかったので

次はコピー先のパスが必要です

コピー先のパスを知るには UnityProjectまでのパスを知れる Application.dataPath を利用します
Application.dataPathAssets/ から始まるパス を 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);
}