目标:根据职业方向深入专精
第27章:2D 游戏开发专项
27.1 Sprite 系统
csharp
// SpriteRenderer 属性
SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.sprite = mySprite;
sr.color = Color.red;
sr.flipX = true; // 水平翻转
sr.sortingOrder = 5; // 渲染排序
// Sprite Atlas(精灵图集)
// 将多个小图合并为一张大图,减少DrawCall
// 创建:Create → 2D → Sprite Atlas
// 自动打包:设置Include目录
27.2 Tilemap 瓦片地图
使用流程:
1. 创建 Tilemap:2D Object → Tilemap → Rectangular
2. 绘制瓦片:Window → 2D → Tile Palette
3. 添加碰撞:TilemapCollider2D → 合并碰撞 CompositeCollider2D
4. 渲染排序:Tilemap Renderer → Sort Order
多层结构:
├── Background(背景层)sortingOrder = 0
├── Ground(地面层)sortingOrder = 1
├── Objects(物件层)sortingOrder = 2
└── Foreground(前景层)sortingOrder = 3
27.3 2D 物理
csharp
// 2D 物理组件(独立于3D物理系统)
Rigidbody2D rb2d;
rb2d.velocity = new Vector2(speed, rb2d.velocity.y);
rb2d.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
rb2d.gravityScale = 2f; // 重力缩放
// 2D 碰撞器
BoxCollider2D, CircleCollider2D, CapsuleCollider2D, PolygonCollider2D
// 2D 射线
RaycastHit2D hit = Physics2D.Raycast(origin, direction, distance, layerMask);
// 2D 碰撞回调
void OnCollisionEnter2D(Collision2D collision) { }
void OnTriggerEnter2D(Collider2D other) { }
27.4 2D 动画
Sprite Animation:
├── 逐帧动画:将多个Sprite拖入Scene自动创建
├── Animator:与3D动画系统相同
├── DOTween:插值动画(平滑移动/缩放/旋转)
└── Spine/DragonBones:骨骼动画(角色动画标准方案)
第28章:3D 图形进阶
28.1 光照系统
光源类型:
├── Directional Light ← 太阳光(全局方向光)
├── Point Light ← 点光源(灯泡)
├── Spot Light ← 聚光灯(手电筒)
└── Area Light ← 面光源(仅烘焙)
光照模式:
├── Realtime ← 实时(高性能消耗)
├── Mixed ← 混合(静态烘焙+动态实时)
└── Baked ← 完全烘焙(仅静态物体,最佳性能)
Lightmap烘焙:
Window → Rendering → Lighting → Generate Lighting
├── 物体必须标记Static
├── 需要第二套UV(Unity自动生成)
└── 输出Lightmap纹理存储光照信息
Light Probe(光照探针):
└── 为动态物体提供烘焙光照的近似值
在场景中放置探针点,动态物体插值获取光照
Reflection Probe(反射探针):
└── 为物体提供环境反射
实时/烘焙模式,影响金属/光滑材质的反射效果
28.2 材质与 PBR
PBR(Physically Based Rendering)标准材质属性:
├── Albedo ← 基础颜色/纹理
├── Metallic ← 金属度(0=非金属, 1=金属)
├── Smoothness ← 光滑度(0=粗糙, 1=镜面)
├── Normal Map ← 法线贴图(凹凸细节)
├── Height Map ← 高度贴图(视差效果)
├── Occlusion ← 环境遮蔽(阴影增强)
└── Emission ← 自发光
纹理类型:
├── _MainTex ← 主贴图(Albedo)
├── _BumpMap ← 法线贴图
├── _MetallicGlossMap ← 金属光滑贴图
├── _OcclusionMap ← AO贴图
└── _EmissionMap ← 自发光贴图
28.3 粒子系统
Particle System 核心模块:
├── Main ← 持续时间/循环/发射速率
├── Emission ← 发射数量/突发
├── Shape ← 发射形状(球/锥/盒)
├── Velocity ← 速度(方向/大小)
├── Color over Lifetime ← 颜色渐变
├── Size over Lifetime ← 大小变化
├── Noise ← 噪声扰动
├── Collision ← 碰撞
├── Sub Emitters ← 子发射器
└── Renderer ← 渲染模式
常见特效:
├── 火焰:橙红渐变 + 上升速度 + 噪声
├── 烟雾:灰色半透明 + 扩散 + 旋转
├── 爆炸:突发发射 + 快速衰减 + 子弹片
├── 魔法:环形发射 + 颜色循环 + 拖尾
└── 血液:喷射 + 重力 + 碰撞贴花
VFX Graph(GPU粒子):
└── 支持百万级粒子,节点式编辑器
适合:大量粒子、复杂效果、GPU计算
第29章:跨平台适配
29.1 平台差异处理
csharp
// 预编译指令
#if UNITY_ANDROID
Debug.Log("Android平台");
#elif UNITY_IOS
Debug.Log("iOS平台");
#elif UNITY_WEBGL
Debug.Log("WebGL平台");
#elif UNITY_STANDALONE
Debug.Log("PC平台");
#endif
// 运行时平台检测
if (Application.platform == RuntimePlatform.Android)
SetupAndroid();
// 触屏/PC输入适配
bool isMobile = Application.isMobilePlatform;
29.2 性能分级
csharp
// 根据设备性能自动分级
public enum QualityTier { Low, Medium, High, Ultra }
QualityTier DetectTier()
{
int mem = SystemInfo.systemMemorySize; // MB
int gpu = SystemInfo.graphicsMemorySize;
int cores = SystemInfo.processorCount;
if (mem >= 8000 && gpu >= 4000) return QualityTier.Ultra;
if (mem >= 4000 && gpu >= 2000) return QualityTier.High;
if (mem >= 2000) return QualityTier.Medium;
return QualityTier.Low;
}
void ApplyQuality(QualityTier tier)
{
switch (tier)
{
case QualityTier.Low:
QualitySettings.SetQualityLevel(0);
Application.targetFrameRate = 30;
break;
case QualityTier.High:
QualitySettings.SetQualityLevel(3);
Application.targetFrameRate = 60;
break;
}
}
29.3 屏幕适配
csharp
// 安全区域适配(刘海屏/折叠屏)
Rect safeArea = Screen.safeArea;
// 调整UI面板位置到安全区域内
// 分辨率适配
float aspect = (float)Screen.width / Screen.height;
// 16:9 → 1.78
// 18:9 → 2.0
// 21:9 → 2.33
// CanvasScaler适配策略
// matchWidthOrHeight = 0 → 宽度优先(横屏游戏)
// matchWidthOrHeight = 1 → 高度优先(竖屏游戏)
// matchWidthOrHeight = 0.5 → 混合(推荐)
第30章:热更新方案
30.1 资源热更新(Addressables)
流程:
1. 配置Addressables Remote路径(CDN地址)
2. 标记需要热更的资源
3. Build Content → 上传到CDN
4. 客户端启动时检查更新
代码:
AsyncOperationHandle<List<string>> checkHandle =
Addressables.CheckForCatalogUpdates();
yield return checkHandle;
if (checkHandle.Result.Count > 0)
{
// 有更新,下载新资源
AsyncOperationHandle updateHandle =
Addressables.UpdateCatalogs(checkHandle.Result);
yield return updateHandle;
}
30.2 代码热更新方案
方案对比:
┌────────────┬────────────┬──────────┬──────────┐
│ 方案 │ 语言 │ 性能 │ 适用 │
├────────────┼────────────┼──────────┼──────────┤
│ Lua(xLua) │ Lua │ 中 │ 国内主流 │
│ HybridCLR │ C# │ 高 │ 新趋势 │
│ ILRuntime │ C# │ 中 │ 成熟方案 │
│ Puerts │ TypeScript │ 中 │ 前端背景 │
└────────────┴────────────┴──────────┴──────────┘
HybridCLR(推荐):
├── 原理:扩展IL2CPP,支持动态加载DLL
├── 优势:原生C#开发,无需学新语言
├── 性能:接近原生IL2CPP
└── 支持:Unity 2020.3+
30.3 完整热更流程
启动App → 检查版本号 → 对比清单(Manifest)
→ 下载差异文件 → 校验MD5 → 解压到本地
→ 加载新代码/资源 → 进入游戏
版本管理策略:
├── 大版本更新 → 整包更新(App Store)
├── 中版本更新 → 资源+代码热更
└── 小版本更新 → 仅资源热更(配置/美术)
附录:学习路线总结
入门(1-2月):1-5章
├── C# 基础 + Unity编辑器 + 生命周期
├── 做一个简单3D场景(移动+拾取)
└── 产出:理解 MonoBehaviour 体系
中级(2-3月):6-11章
├── 物理 + UI + 动画 + 音频 + 资源
├── 做一个完整小游戏(如平台跳跃)
└── 产出:独立完成小型游戏
进阶(3-4月):12-17章
├── 架构 + 事件 + 对象池 + 存档 + AI + 编辑器
├── 做一个有AI敌人的RPG Demo
└── 产出:掌握常用设计模式
高级(4-6月):18-22章
├── 资源管理 + 异步 + Shader + 优化 + 网络
├── 参与或主导一个完整项目
└── 产出:可处理工程级问题
工程化(持续):23-30章
├── Git + 测试 + 打包 + CI/CD + 热更新
├── 在团队中实践
└── 产出:具备完整项目交付能力
🎮 本知识体系配套 Unity Demo 工程
路径:
UnityLearningDemo/使用 Unity 2023.2.12f1 打开,按 F1-F12 切换各章节 Demo