目标:具备团队协作与发布上线能力
第23章:版本控制(Git)
23.1 Unity Git 配置
# .gitignore 核心规则Library/# 缓存(最大,自动重建)Temp/ Obj/ Build/ Logs/ UserSettings/ *.csproj *.sln# 保留:Assets/, Packages/, ProjectSettings/23.2 Git LFS(大文件存储)
# 安装 Git LFSgitlfsinstall# .gitattributes 配置*.psdfilter=lfsdiff=lfsmerge=lfs-text*.pngfilter=lfsdiff=lfsmerge=lfs-text*.jpgfilter=lfsdiff=lfsmerge=lfs-text*.fbxfilter=lfsdiff=lfsmerge=lfs-text*.wavfilter=lfsdiff=lfsmerge=lfs-text*.mp3filter=lfsdiff=lfsmerge=lfs-text*.unitypackagefilter=lfsdiff=lfsmerge=lfs-text23.3 Unity 序列化设置
Edit → Project Settings → Editor: ├── Asset Serialization → Force Text(必须!方便diff/merge) ├── Version Control → Visible Meta Files └── Default Behavior Mode → 3D/2D 合并冲突处理: ├── 场景(.unity)/预制体(.prefab)尽量避免多人同时编辑 ├── 使用 Smart Merge(UnityYAMLMerge) └── 分配场景所有权或使用 Prefab 拆分23.4 Git 工作流
推荐:Git Flow ├── main ← 发布版本 ├── develop ← 开发主线 ├── feature/* ← 功能分支 ├── release/* ← 发布准备 └── hotfix/* ← 紧急修复 分支命名: feature/player-movement feature/ui-inventory bugfix/physics-collision release/v1.2.0第24章:测试体系
24.1 Unity Test Framework
usingNUnit.Framework;usingUnityEngine;usingUnityEngine.TestTools;usingSystem.Collections;// ═══ Edit Mode Test(纯逻辑测试,不启动引擎)═══publicclassDamageCalcTests{[Test]publicvoidTakeDamage_ReducesHP(){varplayer=newPlayerData(100);player.TakeDamage(30);Assert.AreEqual(70,player.HP);}[Test]publicvoidTakeDamage_HPCannotBelowZero(){varplayer=newPlayerData(10);player.TakeDamage(999);Assert.AreEqual(0,player.HP);}[TestCase(100,30,70)][TestCase(50,50,0)][TestCase(0,10,0)]publicvoidTakeDamage_Parametrized(intinitHP,intdamage,intexpected){varplayer=newPlayerData(initHP);player.TakeDamage(damage);Assert.AreEqual(expected,player.HP);}}// ═══ Play Mode Test(运行时测试,模拟真实场景)═══publicclassPlayerMovementTests{[UnityTest]publicIEnumeratorPlayer_Moves_When_Input(){vargo=newGameObject("Player");varrb=go.AddComponent<Rigidbody>();varcontroller=go.AddComponent<PlayerController>();Vector3startPos=go.transform.position;yieldreturnnewWaitForSeconds(0.5f);// 断言Assert.AreNotEqual(startPos,go.transform.position);Object.DestroyImmediate(go);}}24.2 测试策略
测试金字塔: / E2E \ ← 少量(集成验证) / 集成测试 \ ← 适量(系统交互) / 单元测试 \ ← 大量(逻辑验证) 覆盖优先级: 1. 核心数值系统(伤害/经济/概率) 2. 状态机转换逻辑 3. 数据序列化/反序列化 4. 边界条件/异常处理第25章:打包与发布
25.1 Build Settings
File → Build Settings: 平台切换: ├── PC (Windows/Mac/Linux) ├── Android ├── iOS ├── WebGL └── Console (PS5/Xbox/Switch) 构建选项: ├── Development Build → 开发版(含Profiler) ├── Autoconnect Profiler → 自动连接Profiler ├── Script Debugging → 脚本调试 ├── Compression Method → LZ4(推荐) / LZ4HC └── IL2CPP → 发布版必须使用(性能+安全)25.2 Android 打包
Player Settings (Android): ├── Package Name: com.company.gamename ├── Minimum API Level: Android 7.0 (API 24) ├── Target API Level: 34 (最新) ├── Scripting Backend: IL2CPP(必须) ├── Target Architectures: ARM64 ├── Keystore: 签名文件配置 └── Texture Compression: ASTC 构建类型: ├── APK → 测试安装包 └── AAB → Google Play上传格式25.3 iOS 打包
Player Settings (iOS): ├── Bundle Identifier: com.company.gamename ├── Target Minimum iOS Version: 15.0 ├── Scripting Backend: IL2CPP(唯一选项) ├── Architecture: ARM64 └── Signing Team ID: 开发者账号 流程: Unity Build → Xcode Project → Archive → App Store Connect第26章:CI/CD 自动化
26.1 Unity 命令行构建
# 命令行构建(无需打开Editor)Unity-quit-batchmode-projectPath./MyProject\-executeMethodBuildScript.Build\-logFilebuild.log# 构建脚本public class BuildScript{[MenuItem("Build/Build Android")]public static voidBuild(){var options=new BuildPlayerOptions{scenes=new[]{"Assets/Scenes/Main.unity"}, locationPathName="Build/game.apk", target=BuildTarget.Android, options=BuildOptions.None};BuildPipeline.BuildPlayer(options);}}26.2 GitHub Actions 配置
name:Unity Buildon:push:branches:[main,develop]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v4with:lfs:true-uses:game-ci/unity-builder@v4with:targetPlatform:AndroidunityVersion:2023.2.12f1-uses:actions/upload-artifact@v4with:name:Buildpath:build26.3 自动化流程
代码提交 → 自动编译检查 → 单元测试 → 构建APK/IPA → → 上传到测试平台 → 通知测试团队 → → 通过后合并到main → 正式构建 → 发布下一篇:第六篇:专项方向