在游戏开发团队协作中,我们经常遇到这样的场景:主程完成功能开发后需要将Unity工程打包成可执行文件,然后手动复制到共享目录,最后还要记得提交到SVN版本库。这套流程看似简单,但实际开发中常常出现以下问题:
我在参与某MMO手游项目时,就曾因为打包流程不规范导致测试团队拿到了错误的版本,造成整整半天的测试资源浪费。痛定思痛后,我设计了这个自动化方案,现在分享给各位游戏开发者。
实现自动化打包后处理,主要有三个技术关键点:
为什么不使用CI/CD工具?对于中小团队来说,搭建Jenkins等持续集成系统学习成本较高,而本文方案只需在Unity工程中添加一个脚本即可实现基础自动化。
plaintext复制Unity打包完成
→ 触发PostProcessBuild脚本
→ 校验输出目录
→ 复制到指定位置
→ 调用svn.exe提交
→ 生成操作日志
在Editor文件夹下创建PostBuildProcessor.cs:
csharp复制using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using System.IO;
using System.Diagnostics;
public class PostBuildProcessor : IPostprocessBuildWithReport
{
public int callbackOrder => 0;
public void OnPostprocessBuild(BuildReport report)
{
string buildPath = report.summary.outputPath;
string targetPath = @"\\192.168.1.100\Builds\Latest";
// 复制文件
if(Directory.Exists(targetPath))
{
Directory.Delete(targetPath, true);
}
Directory.CreateDirectory(targetPath);
CopyFilesRecursively(buildPath, targetPath);
// SVN提交
SVNCommit(targetPath);
}
private void CopyFilesRecursively(string source, string target)
{
// 递归复制实现...
}
private void SVNCommit(string path)
{
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = @"C:\Program Files\TortoiseSVN\bin\svn.exe";
psi.Arguments = $"commit \"{path}\" -m \"Auto commit after build\"";
psi.UseShellExecute = false;
Process.Start(psi)?.WaitForExit();
}
}
注意:如果使用Git替代SVN,只需修改提交命令为git push即可
不同平台的构建后处理需要特殊处理:
csharp复制switch(report.summary.platform)
{
case BuildTarget.Android:
// 处理APK重命名
break;
case BuildTarget.iOS:
// 处理Xcode工程
break;
case BuildTarget.StandaloneWindows:
// 处理exe文件
break;
}
建议在复制前自动更新版本号:
csharp复制string version = PlayerSettings.bundleVersion;
targetPath = Path.Combine(targetPath, version);
构建完成后发送通知邮件:
csharp复制using System.Net.Mail;
void SendNotification(string version)
{
MailMessage mail = new MailMessage();
mail.Subject = $"新版本构建完成: {version}";
// 配置SMTP...
}
症状:复制到网络共享失败
解决方案:
csharp复制using (new NetworkConnection(@"\\server\share", new NetworkCredential("user","pass")))
{
// 文件操作...
}
典型错误:
处理策略:
csharp复制private void SVNCommit(string path)
{
// 先更新
RunSVNCommand("update", path);
// 解决冲突
if(CheckConflicts(path))
{
RunSVNCommand("resolve", path);
}
// 再提交
RunSVNCommand("commit", path);
}
Windows系统默认路径长度限制为260字符,解决方法:
csharp复制Stopwatch sw = Stopwatch.StartNew();
// 复制操作...
sw.Stop();
Debug.Log($"文件复制耗时: {sw.ElapsedMilliseconds}ms");
重要:建议在PlayerSettings中设置AllowDebugging=false发布正式版本
在某卡牌游戏项目中,我们扩展了这个方案:
实施后构建部署时间从原来的15分钟缩短到2分钟,且实现了100%的操作准确率。
这个基础方案可以进一步扩展:
对于大型团队,建议结合Jenkins等CI工具实现更完整的流水线,但本文方案已经能解决80%的中小团队需求。
当脚本不工作时,按以下步骤排查:
一个实用的调试代码片段:
csharp复制try {
// 你的代码...
}
catch(Exception e) {
Debug.LogError($"构建后处理失败: {e.ToString()}");
EditorUtility.DisplayDialog("错误", e.Message, "确定");
}
这个方案在我们团队已经稳定运行3年,处理了超过2000次构建任务。最大的收获不是节省了多少时间,而是彻底消除了人为失误导致的版本问题。建议每个Unity团队都尽早实施类似的自动化流程,你会惊讶于它带来的改变。