第五篇:Unity工程化能力

目标:具备团队协作与发布上线能力


第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 → 正式构建 → 发布

下一篇: 第六篇:专项方向

相关推荐
Elastic 中国社区官方博客14 小时前
Elasticsearch DiskBBQ:使用原生 SIMD Blocks 实现快 40% 的向量评分计算
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·diskbbq
小拉达不是臭老鼠15 小时前
Unity学习_ScriptableObject
学习·unity
Elastic 中国社区官方博客16 小时前
Kibana:使用 AI Chat 及 MCP 轻松创建 AI 原生仪表板
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·信息可视化
Thomas_YXQ16 小时前
Unity无GC读取图片与网格完整方案
大数据·人工智能·unity·微信·产品运营
jiayong2318 小时前
虚幻引擎 Unreal Engine 通俗指南
游戏引擎·虚幻
可乐ea19 小时前
【知识获取与分享社区项目 | 项目日记第 21 天】索引构建与联想建议:Outbox 增量更新 + Completion Suggester
java·大数据·mysql·elasticsearch·搜索引擎
郝学胜-神的一滴20 小时前
中级OpenGL教程 008:精准控制高光光斑大小与强度
c++·unity·godot·three.js·图形学·opengl·unreal
醉颜凉20 小时前
深度解析 Elasticsearch 搜索过程:Query Then Fetch 两阶段详解
大数据·elasticsearch·搜索引擎
大傻^20 小时前
07_Elasticsearch知识体系之集群架构高可用与快照恢复实战
elasticsearch·架构·jenkins