目标:具备团队协作与发布上线能力
第23章:版本控制(Git)
23.1 Unity Git 配置
bash
# .gitignore 核心规则
Library/ # 缓存(最大,自动重建)
Temp/
Obj/
Build/
Logs/
UserSettings/
*.csproj
*.sln
# 保留:Assets/, Packages/, ProjectSettings/
23.2 Git LFS(大文件存储)
bash
# 安装 Git LFS
git lfs install
# .gitattributes 配置
*.psd filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.unitypackage filter=lfs diff=lfs merge=lfs -text
23.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
csharp
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
using System.Collections;
// ═══ Edit Mode Test(纯逻辑测试,不启动引擎)═══
public class DamageCalcTests
{
[Test]
public void TakeDamage_ReducesHP()
{
var player = new PlayerData(100);
player.TakeDamage(30);
Assert.AreEqual(70, player.HP);
}
[Test]
public void TakeDamage_HPCannotBelowZero()
{
var player = new PlayerData(10);
player.TakeDamage(999);
Assert.AreEqual(0, player.HP);
}
[TestCase(100, 30, 70)]
[TestCase(50, 50, 0)]
[TestCase(0, 10, 0)]
public void TakeDamage_Parametrized(int initHP, int damage, int expected)
{
var player = new PlayerData(initHP);
player.TakeDamage(damage);
Assert.AreEqual(expected, player.HP);
}
}
// ═══ Play Mode Test(运行时测试,模拟真实场景)═══
public class PlayerMovementTests
{
[UnityTest]
public IEnumerator Player_Moves_When_Input()
{
var go = new GameObject("Player");
var rb = go.AddComponent<Rigidbody>();
var controller = go.AddComponent<PlayerController>();
Vector3 startPos = go.transform.position;
yield return new WaitForSeconds(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 命令行构建
bash
# 命令行构建(无需打开Editor)
Unity -quit -batchmode -projectPath ./MyProject \
-executeMethod BuildScript.Build \
-logFile build.log
# 构建脚本
public class BuildScript
{
[MenuItem("Build/Build Android")]
public static void Build()
{
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 配置
yaml
name: Unity Build
on:
push:
branches: [main, develop]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
lfs: true
- uses: game-ci/unity-builder@v4
with:
targetPlatform: Android
unityVersion: 2023.2.12f1
- uses: actions/upload-artifact@v4
with:
name: Build
path: build
26.3 自动化流程
代码提交 → 自动编译检查 → 单元测试 → 构建APK/IPA →
→ 上传到测试平台 → 通知测试团队 →
→ 通过后合并到main → 正式构建 → 发布
下一篇: 第六篇:专项方向