unity Build 導出可執行文件後,很多時候需要把配置文件或者相關的文件拷貝到與導出包體同級的目錄,如果每次多手動去拷貝,未免過於麻煩和繁瑣,這個時候我們希望打包完成後通過代碼自動拷貝相關文件到導出路徑。爲此,我們就必須知道什麼打包完成,和導出包體的路徑,Unity給我們提供了一個特性:
[PostProcessBuild(1)]
它的功能是打包完成後的回調
/// <summary>
/// Build完成後的回調
/// </summary>
/// <param name="target">打包的目標平臺</param>
/// <param name="pathToBuiltProject">包體的完整路徑</param>
[PostProcessBuild(1)]
public static void AfterBuild(BuildTarget target, string pathToBuiltProject)
{
Debug.Log("Build Success 輸出平臺: " + target + " 輸出路徑: " + pathToBuiltProject);
//打開文件或文件夾
System.Diagnostics.Process.Start(pathToBuiltProject);
int index = pathToBuiltProject.LastIndexOf("/");
Debug.Log("導出包體的目錄 :"+pathToBuiltProject.Substring(0, index));
}
打包完成後,拷貝相關文件夾到與包體同級的目錄
[PostProcessBuild(1)]
public static void AfterBuild(BuildTarget target, string pathToBuiltProject)
{
Debug.Log("Build Success 輸出平臺: " + target + " 輸出路徑: " + pathToBuiltProject);
string buildPath = pathToBuiltProject.Substring(0, pathToBuiltProject.LastIndexOf("/"));
Debug.Log(buildPath);
string configName = "config.ini";
string allConfigDirName = "SceneModeInFo";
DirectoryInfo appDir = new DirectoryInfo(Application.dataPath);
File.Copy(Path.Combine(appDir.Parent.FullName,configName), Path.Combine(buildPath, configName), true);
string copyDir = Path.Combine(appDir.Parent.FullName, allConfigDirName);
string tgtDir = Path.Combine(buildPath, allConfigDirName);
CopyDirectory(copyDir, tgtDir);
Debug.Log("打包完成!");
}
/// <summary>
/// 複製文件夾
/// </summary>
/// <param name="srcDir"></param>
/// <param name="tgtDir"></param>
public static void CopyDirectory(string srcDir, string tgtDir)
{
DirectoryInfo source = new DirectoryInfo(srcDir);
DirectoryInfo target = new DirectoryInfo(tgtDir);
if (target.FullName.StartsWith(source.FullName, StringComparison.CurrentCultureIgnoreCase))
{
throw new Exception("父目錄不能拷貝到子目錄!");
}
if (!source.Exists)
{
return;
}
if (!target.Exists)
{
target.Create();
}
FileInfo[] files = source.GetFiles();
for (int i = 0; i < files.Length; i++)
{
File.Copy(files[i].FullName, Path.Combine(target.FullName, files[i].Name), true);
}
DirectoryInfo[] dirs = source.GetDirectories();
for (int j = 0; j < dirs.Length; j++)
{
CopyDirectory(dirs[j].FullName, Path.Combine(target.FullName, dirs[j].Name));
}
}