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

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

相关推荐
℡終嚸♂6802 小时前
Gogs CVE-2025-64111 CTF Writeup
大数据·elasticsearch·搜索引擎
LF男男2 小时前
TouchPad(单例)
unity·c#
天人合一peng2 小时前
Unity 3D 电脑端和手机端都实现画线与清除功能
3d·unity·智能手机
前端若水2 小时前
Git 全命令超级详细指南
大数据·git·elasticsearch
末代程序员_C2 小时前
Maven版本管控:多分支并行开发中的API版本管理之道
大数据·elasticsearch·maven
陈陈CHENCHEN2 小时前
【ES & Kibana】Kibana 启动 statusCode: 429 报错
elasticsearch
Elivs.Xiang2 小时前
基于docker安装MySQL、RabbitMQ、ElasticSearch、minio
linux·mysql·elasticsearch·docker·rabbitmq
云上空2 小时前
Unity 角色“防卡墙”实战:不用动态物理材质,也能稳定解决 Wedging 问题
unity·游戏引擎·材质
Elastic 中国社区官方博客11 小时前
为 Elastic Cloud Serverless 和 Elasticsearch 引入统一的 API 密钥
大数据·运维·elasticsearch·搜索引擎·云原生·serverless