目录
第 一部分 基础篇
第 1章 基础知识 2
1.1 Unity简介 2
1.2 跨平台 2
1.3 协作开发 3
1.4 Unity版本 4
1.5 Package Manager 5
1.6 示例项目与发布 7
1.7 Unity服务 8
1.8 小结 9
第 2章 编辑器的结构 10
2.1 Unity Hub 10
2.2 编辑器布局 11
2.3 Project视图 12
2.4 Hierarchy视图 13
2.5 Inspector视图 14
2.6 Scene视图 15
2.7 Game视图 16
2.8 导航栏视图 17
2.9 小结 17
第3章 游戏脚本 18
3.1 C#运行时 18
3.2 C#与引擎交互 22
3.3 游戏对象 27
3.4 游戏组件 29
3.4.1 Transform(变换)组件 29
3.4.2 Mesh Filter(网格过滤器)组件 30
3.4.3 Mesh Renderer(网格渲染)组件 31
3.4.4 Skinned Mesh Renderer(蒙皮网格渲染)组件 32
3.5 游戏脚本 35
3.6 脚本的生命周期 35
3.6.1 初始化和销毁 37
3.6.2 二次初始化 38
3.6.3 固定更新 39
3.6.4 内置协程回调 43
3.6.5 鼠标事件 45
3.6.6 脚本逻辑更新 46
3.6.7 场景渲染 47
3.6.8 编辑器UI 更新 48
3.7 脚本的管理 50
3.7.1 脚本的执行顺序 50
3.7.2 多脚本优化 51
3.8 脚本序列化 52
3.8.1 查看数据 53
3.8.2 序列化数据标签 54
3.8.3 SerializedObject 55
3.8.4 监听修改事件 56
3.8.5 序列化/反序列化监听 58
3.8.6 序列化嵌套 60
3.8.7 序列化引用 61
3.8.8 序列化继承 62
3.8.9 ScriptableObject 63
3.9 脚本属性 65
3.9.1 序列化属性 65
3.9.2 Header属性 66
3.9.3 编辑模式下执行脚本 66
3.9.4 枚举序列化别名 67
3.9.5 必须包含的组件 68
3.9.6 其他UI扩展面板 68
3.9.7 可选择属性 69
3.9.8 自定义属性 69
3.10 协程任务 70
3.10.1 异步代码流程 71
3.10.2 当前帧最后执行 71
3.10.3 定时器 73
3.10.4 CustomYieldInstruction 75
3.10.5 Awaitable 76
3.11 通过脚本操作对象和组件 78
3.11.1 对象的创建与删除 78
3.11.2 对象层级排序 80
3.11.3 对象子节点的获取 80
3.11.4 多场景根节点 81
3.11.5 脚本的添加与删除 82
3.11.6 DontDestroyOnLoad 83
3.12 调试 83
3.13 小结 85
第4章 UGUI 86
4.1 游戏界面 86
4.1.1 Text组件 86
4.1.2 富文本 89
4.1.3 描边和阴影 91
4.1.4 动态字体 92
4.1.5 字体花屏 93
4.1.6 Text Mesh Pro 94
4.1.7 SDF字体 97
4.1.8 图文混排 99
4.1.9 样式 101
4.1.10 文字fallback 103
4.1.11 点击事件 104
4.1.12 Image组件 105
4.1.13 Raw Image组件 107
4.1.14 Button组件 109
4.1.15 Toggle组件 110
4.1.16 Scroll View组件 111
4.1.17 其他组件 113
4.2 界面布局 114
4.2.1 Rect Transform组件 114
4.2.2 拉伸 117
4.2.3 自动布局 118
4.2.4 文本自适应 120
4.2.5 Layout Element组件 121
4.2.6 Layout Group组件 122
4.2.7 Content Size Fitter组件 123
4.3 Canvas组件 126
4.3.1 UI摄像机 126
4.3.2 3D界面 128
4.3.3 自适应UI 130
4.3.4 Canvas与3D排序 133
4.3.5 裁剪 135
4.3.6 裁剪粒子 136
4.4 Atlas 137
4.4.1 创建Atlas 138
4.4.2 读取Atlas 139
4.4.3 Variant 140
4.4.4 监听加载事件 140
4.4.5 多图集管理 141
4.5 事件系统 141
4.5.1 Graphic Raycaster组件 142
4.5.2 UI事件 143
4.5.3 UI事件管理 144
4.5.4 UnityAction和UnityEvent 146
4.5.5 C#事件系统 147
4.5.6 3D事件 148
4.5.7 K帧动画 149
4.5.8 使用Scroll Rect组件制作游戏摇杆 150
4.5.9 点击区域优化 151
4.5.10 显示帧率 152
4.5.11 查看UGUI源代码 153
4.6 小结 153
第5章 UI Toolkit 154
5.1 UI Toolkit简介 154
5.2 UI Builder编辑器 154
5.2.1 StyleSheets视图 156
5.2.2 Hierarchy视图 159
5.2.3 Library视图 161
5.2.4 Viewport视图 162
5.2.5 Inspector视图 64
5.3 UI组件 180
5.3.1 Text组件 181
5.3.2 Visual Element组件 183
5.3.3 其他UI组件 184
5.3.4 基础容器 185
5.3.5 ScrollView组件 186
5.3.6 ListView组件 188
5.3.7 ListView事件 190
5.3.8 TreeView组件 191
5.3.9 GroupBox组件 192
5.3.10 控制组件 192
5.3.11 加载与嵌套 195
5.3.12 自适应UI 196
5.3.13 动态图集 198
5.3.14 自定义UI组件 199
5.4 事件系统 200
5.4.1 点击事件 200
5.4.2 焦点事件 201
5.4.3 键盘事件 202
5.4.4 拖动事件 202
5.5 进阶技巧 203
5.5.1 3D与2D坐标转换 203
5.5.2 覆盖样式 204
5.5.3 多样式管理 206
5.5.4 调试 207
5.5.5 编辑器窗口面板 208
5.5.6 编辑器脚本面板 209
5.5.7 编辑器组合面板 210
5.5.8 布局与裁剪 211
5.5.9 与UGUI混合使用 213
5.5.10 UI动画 213
5.6 UI Toolkit渲染 214
5.6.1 IMGUI 214
5.6.2 UGUI 214
5.6.3 图集 214
5.6.4 UI Toolkit与UGUI的比较 216
5.7 UI Toolk学习资料 217
5.8 小结 218
第6章 2D游戏开发 219
6.1 Sprite Renderer组件 220
6.1.1 渲染原理 222
6.1.2 渲染排序 224
6.1.3 裁剪 226
6.1.4 2D帧动画 227
6.1.5 脚本播放动画 231
6.1.6 2D骨骼动画 232
6.1.7 IK反向运动 238
6.1.8 精灵资源库 239
6.2 Tile地图 241
6.2.1 创建Tile 242
6.2.2 创建地图 243
6.2.3 编辑Tile 245
6.2.4 Tile排序 247
6.2.5 扩展笔刷 248
6.2.6 扩展Tile 251
6.2.7 更新Tile 252
6.2.8 Tile动画 253
6.3 2D物理系统 254
6.3.1 Collider 2D组件 254
6.3.2 Rigidbody 2D组件 255
6.3.3 碰撞事件 257
6.3.4 碰撞方向 259
6.3.5 触发器监听 261
6.3.6 复合碰撞体 262
6.3.7 自定义碰撞体 263
6.3.8 Effectors 2D组件 264
6.3.9 关节 264
6.3.10 物理材质和恒定力 264
6.3.11 计算区域 265
6.4 像素风 265
6.5 精灵形状 267
6.6 精灵编辑器 268
6.7 小结 270
第7章 3D游戏开发 271
7.1 Renderer 271
7.1.1 Mesh Renderer(网格渲染器) 271
7.1.2 Skinned Mesh Renderer(蒙皮网格渲染器) 273
7.1.3 Particle System(粒子系统) 275
7.1.4 Trail Renderer(拖尾渲染器) 276
7.1.5 Line Renderer(线渲染器) 276
7.1.6 Terrain(地形) 277
7.2 游戏对象和资源 278
7.2.1 静态对象 278
7.2.2 标记 279
7.2.3 层 280
7.2.4 Prefab 280
7.2.5 Prefab嵌套 282
7.2.6 Prefab和游戏对象 285
7.2.7 实例化 286
7.2.8 游戏资源 287
7.2.9 场景 289
7.2.10 场景模板 291
7.3 动画系统 293
7.3.1 动画文件 293
7.3.2 制作动画 296
7.3.3 动画事件 297
7.3.4 骨骼动画优化 298
7.3.5 播放动画 300
7.3.6 切换动画 301
7.3.7 动画混合 302
7.3.8 老版动画 304
7.3.9 Simple Animation组件 305
7.3.10 控制动画进度 307
7.3.11 特殊动画行为 308
7.3.12 Playable组件 309
7.3.13 使用Playable自定义脚本 312
7.3.14 模型换装 313
7.4 3D物理系统 316
7.4.1 角色控制器 316
7.4.2 碰撞体 319
7.4.3 Rigidbody组件 321
7.4.4 碰撞事件 321
7.4.5 布娃娃系统 323
7.4.6 布料系统 324
7.4.7 其他 325
7.5 输入系统 325
7.5.1 实体输入事件 326
7.5.2 虚拟输入事件 327
7.5.3 鼠标位置 328
7.5.4 点选模型 330
7.5.5 通过点击控制移动 332
7.5.6 射线 333
7.6 Transform组件 334
7.6.1 控制角色移动 335
7.6.2 摄像机跟随 336
7.6.3 插值移动 337
7.6.4 约束条件 338
7.7 小结 339
第8章 静态对象 340
8.1 光照贴图 341
8.1.1 光源 341
8.1.2 开始烘焙 342
8.1.3 烘焙结果在不同平台上的差异 346
8.1.4 烘焙贴图UV 347
8.1.5 光照探针 348
8.1.6 运行时更换烘焙贴图 349
8.1.7 复制烘焙信息 350
8.1.8 复制工具 351
8.2 反射探针 352
8.3 遮挡剔除 354
8.3.1 遮挡关系 354
8.3.2 遮挡与被遮挡事件 356
8.3.3 动态剔除 356
8.3.4 遮挡剔除的原理 356
8.3.5 裁剪组 357
8.4 静态合批 358
8.4.1 设置静态合批 358
8.4.2 脚本静态合批 360
8.4.3 动态合批 361
8.5 导航网格 361
8.5.1 设置寻路 362
8.5.2 动态阻挡 364
8.5.3 连接两点 365
8.5.4 连接两个区域 366
8.5.5 烘焙修改器 366
8.5.6 运行时烘焙 367
8.5.7 获取寻路路径 368
8.5.8 导出导航网格信息 369
8.6 小结 372
第9章 持久化数据 373
9.1 Excel 373
9.1.1 EPPlus 374
9.1.2 读取Excel文件 374
9.1.3 写入Excel文件 376
9.2 SQLite 377
9.2.1 创建数据库 378
9.2.2 跨平台读取数据库 379
9.3 JSON 382
9.3.1 JsonUtility 382
9.3.2 JSON支持字典 384
9.3.3 Newtonsoft Json 385
9.4 文件的读取与写入 386
9.4.1 PlayerPrefs 386
9.4.2 EditorPrefs 387
9.4.3 用PlayerPrefs保存复杂的数据结构 388
9.4.4 PlayerPrefs版本升级 389
9.4.5 文件读写 389
9.4.6 文件流 390
9.4.7 打包后读写文本 392
9.4.8 PersistentDataPath目录 393
9.5 XML 393
9.5.1 创建XML字符串 393
9.5.2 读取与修改 394
9.5.3 XML文件 395
9.5.4 XML与JSON的转换 397
9.6 YAML 397
9.6.1 YamlDotNet 398
9.6.2 序列化和反序列化 398
9.7 生成代码 400
9.7.1 把数据从Excel表导出到数据库 400
9.7.2 运行时读取数据 402
9.7.3 RazorEngine 403
9.7.4 生成代码的条件 404
9.7.5 模板文件 405
9.8 小结 406
第 10章 多媒体 407
10.1 音频 407
10.1.1 音频文件 407
10.1.2 Audio Source 408
10.1.3 3D音频 410
10.1.4 代码控制播放 411
10.1.5 AudioMixer 412
10.1.6 混音区 414
10.1.7 麦克风 415
10.1.8 声音进度 416
10.2 视频 417
10.2.1 视频文件 417
10.2.2 视频渲染模式 419
10.2.3 视频自适应 420
10.2.4 UI覆盖在视频之上 421
10.2.5 视频渲染在材质上 422
10.2.6 视频渲染在纹理上 422
10.2.7 播放网络视频 423
10.2.8 自定义视频显示 424
10.2.9 视频进度 425
10.2.10 下载视频 425
10.2.11 全景视频 426
10.3 小结 426
第 11章 Netcode与网络编程 427
11.1 UnityWebRequest 427
11.1.1 下载文件和上传文件 428
11.1.2 下载进度与异常 429
11.1.3 验证文件 431
11.1.4 DownloadHandlerScript 431
11.1.5 控制下载速度 433
11.2 Socket 436
11.2.1 拼接包 439
11.2.2 Protocol Buffer 440
11.3 Netcode 442
11.3.1 托管服务器 443
11.3.2 UNet与Netcode的区别 445
11.3.3 前后端同步 446
11.3.4 软连接 448
11.3.5 同步坐标 450
11.3.6 服务器RPC 452
11.3.7 客户端RPC 454
11.3.8 网络变量 457
11.3.9 网络场景 459
11.3.10 网络底层消息 460
11.3.11 FastBufferWriter与FastBufferReader 463
11.3.12 网络连接事件 464
11.3.13 网络对象 465
11.3.14 隐藏与显示 467
11.3.15 前后端时间 468
11.3.16 网络脚本内置方法 469
11.3.17 前后端打包 469
11.3.18 密码 472
11.4 小结 474
第二部分 进阶篇
第 12章 渲染管线 476
12.1 SRP 476
12.1.1 SRP Core 479
12.1.2 安装与配置 480
12.1.3 摄像机组件工具 482
12.1.4 Look Dev 483
12.1.5 Render Graph Viewer 484
12.1.6 对URP的展望 485
12.2 URP 489
12.2.1 URP调试与修改 489
12.2.2 URP与内置渲染管线对比 491
12.2.3 升级着色器 503
12.2.4 LightMode 509
12.2.5 Shader Graph 510
12.2.6 Renderer Pipeline Asset 512
12.2.7 Renderer Pipeline Asset Data 516
12.2.8 URP Global Settings 519
12.2.9 URP Renderer Feature 520
12.3 SRP Batch 527
12.3.1 不透明物体绘制 527
12.3.2 半透明物体绘制 528
12.3.3 Early-Z 529
12.3.4 Alpha Test 529
12.3.5 Alpha Blend 530
12.3.6 Set Pass Call与Draw Call 531
12.3.7 SRP Batch原理 534
12.3.8 SRP Batch使用 536
12.4 渲染技术 538
12.4.1 Blinn-Phong光照计算 538
12.4.2 PBR光照计算 540
12.4.3 阴影 543
12.4.4 渲染数据传递 546
12.4.5 SRP流程 549
12.4.6 GPU渲染管线 550
12.4.7 SRP裁剪 553
12.4.8 前向渲染流程 554
12.4.9 多摄像机与FinalBlit 557
12.4.10 ScriptableRenderPass 560
12.5 自定义渲染管线 562
12.5.1 参与渲染的对象 562
12.5.2 MVP矩阵计算 563
12.5.3 Render Objects 566
12.5.4 Rendering Layer Mask 568
12.5.5 自定义Render Feature 569
12.5.6 裁剪与层 571
12.5.7 后处理与自定义 573
12.5.8 UI部分模糊 576
12.5.9 降低分辨率不包含UI 576
12.6 小结 578
第 13章 DOTS 1.0 579
13.1 DOTS的组成 579
13.1.1 ECS简介 581
13.1.2 Job System简介 583
13.1.3 Burst Compiler简介 584
13.1.4 安装 585
13.2 游戏对象转到ECS 585
13.2.1 传统的对象与组件 585
13.2.2 Entity(实体)586
13.2.3 Archetype(原型)587
13.2.4 Component(组件)589
13.2.5 System(系统)591
13.3 实体组件 592
13.3.1 非托管组件 592
13.3.2 托管组件 593
13.3.3 共享组件 593
13.3.4 清理组件 594
13.3.5 标记组件 595
13.3.6 动态缓冲组件 595
13.3.7 Chunk组件 596
13.3.8 启动组件 598
13.4 系统 599
13.4.1 系统组件 600
13.4.2 系统分组与排序 601
13.4.3 系统遍历 602
13.4.4 系统查询 603
13.4.5 写组与版本号 604
13.4.6 SystemAPI.Query 606
13.5 Job 607
13.5.1 线程与同步 608
13.5.2 Job的种类 610
13.5.3 Entity Command Buffers实体缓冲 611
13.6 Burst 612
13.6.1 启动Burst 613
13.6.2 高性能C# 615
13.6.3 Unity.Mathematics数学库 617
13.7 渲染 619
13.7.1 自定义材质 620
13.7.2 更换模型材质 621
13.7.3 修改材质属性 622
13.7.4 GPU Instancing 624
13.7.5 BatchRendererGroup 627
13.7.6 Aspect包装器 629
13.7.7 调试 630
13.8 小结 634
第 14章 扩展编辑器 635
14.1 扩展Project视图 635
14.1.1 扩展右键菜单 635
14.1.2 创建脚本模板 637
14.1.3 扩展布局 639
14.1.4 监听资源导入 640
14.1.5 监听资源修改事件 641
14.1.6 自定义资源导入类型 642
14.2 扩展Hierarchy视图 643
14.2.1 扩展菜单 643
14.2.2 扩展布局 644
14.2.3 自动选择游戏对象 645
14.3 扩展Inspector视图 645
14.3.1 扩展原生组件 646
14.3.2 扩展继承组件 646
14.3.3 限制组件编辑 648
14.3.4 Context菜单 649
14.4 扩展Scene视图 650
14.4.1 工具栏扩展 650
14.4.2 辅助元素 651
14.4.3 辅助UI 652
14.4.4 常驻辅助UI 653
14.5 扩展Game视图 654
14.6 导航栏扩展 654
14.6.1 自定义菜单 655
14.6.2 菜单项自动执行 655
14.6.3 导航条 656
14.6.4 标题栏扩展 657
14.6.5 默认面板 658
14.7 查看源代码 658
14.8 小结 659
第 15章 资源管理 660
15.1 编辑器模式 660
15.1.1 游戏资源 660
15.1.2 加载资源 661
15.1.3 卸载资源 663
15.1.4 创建与修改资源 663
15.1.5 创建与修改游戏对象 664
15.2 运行模式 665
15.2.1 参与打包的资源 665
15.2.2 Resources 666
15.2.3 通过脚本计算依赖 667
15.2.4 StreamingAssets 668
15.2.5 场景资源 668
15.3 AssetBundle 668
15.3.1 设置AB 669
15.3.2 设置依赖 670
15.3.3 纯脚本打包 671
15.3.4 差异打包 672
15.3.5 AB压缩格式 672
15.3.6 加载AB 673
15.3.7 内存与卸载 674
15.3.8 场景AB 675
15.3.9 CDN下载流程 675
15.3.10 加载流程 676
15.3.11 多进程AB构建 676
15.4 代码编译 677
15.4.1 Plugins 677
15.4.2 Assembly 677
15.4.3 Editor 678
15.4.4 IL2CPP 678
15.4.5 AB中的脚本 679
15.4.6 热更新代码 680
15.5 Shader(着色器)编译 682
15.5.1 打包与运行 682
15.5.2 Shader重复打包 682
15.5.3 Shader宏 683
15.5.4 Shader与AB包 686
15.5.5 Shader打包剥离 686
15.6 美术资源管理 688
15.6.1 版本管理 688
15.6.2 材质丢失 689
15.6.3 协作开发与多工程 689
15.6.4 美术资源生成 690
15.7 小结 690
第 16章 自动化与打包 691
16.1 自动化设置资源 691
16.1.1 设置贴图格式 691
16.1.2 动画控制器 694
16.1.3 设置模型格式 695
16.1.4 导出动画文件 695
16.1.5 生成角色Prefab 696
16.1.6 生成场景 697
16.1.7 场景无法保存 699
16.1.8 自动生成UI图集 699
16.1.9 更换Shader残留宏 700
16.1.10 自动生成变种收集器 703
16.1.11 剔除顶点色 704
16.2 自动化打包 705
16.2.1 打包过程中的事件 706
16.2.2 打包机的选择 707
16.2.3 打包后自动压缩 707
16.2.4 调用shell脚本 708
16.2.5 命令行打开工程 709
16.2.6 脚本化打包参数 711
16.2.7 Jenkins 712
16.3 小结 714
第 17章 代码优化 715
17.1 Unity代码优化 715
17.1.1 缓存对象 715
17.1.2 减少脚本 716
17.1.3 减少Update()执行 716
17.1.4 缓存池 717
17.1.5 日志优化 718
17.2 C#代码优化 719
17.2.1 入栈和出栈 720
17.2.2 值类型和引用类型 721
17.2.3 装箱和拆箱 722
17.2.4 字符串 723
17.2.5 struct 724
17.2.6 GC 725
17.3 Profiler内存管理 726
17.3.1 内存泄漏 726
17.3.2 耗时函数统计 727
17.3.3 自定义采样 729
17.3.4 堆内存分配 730
17.3.5 原生内存分配 731
17.3.6 Unity内存 732
17.3.7 Memory Profiler 733
17.3.8 真机Profiler 735
17.3.9 Profiler写入和读取 736
17.3.10 渲染性能调试 737
17.4 着色器优化 739
17.4.1 顶点着色器 740
17.4.2 片元着色器 741
17.4.3 条件分支 742
17.5 小结 742
第 18章 通用案例与优化 743
18.1 客户端框架 743
18.1.1 UI框架 743
18.1.2 UI代码生成 745
18.1.3 协议代码生成 746
18.1.4 其他代码生成 747
18.1.5 数据监听 747
18.1.6 事件管理器 749
18.2 客户端优化与案例 752
18.2.1 懒加载 752
18.2.2 懒加载UI 752
18.2.3 懒加载UI 特效 754
18.2.4 编辑与运行时加载资源 756
18.2.5 资源名与路径 758
18.2.6 异步加载 759
18.2.7 界面返回 760
18.2.8 过度绘制 760
18.2.9 UGUI网格重建 763
18.2.10 RaycastTarget优化 765
18.2.11 小地图优化 766
18.2.12 覆盖材质 766
18.2.13 通用Shader面板 767
18.2.14 离线合并贴图 770
18.2.15 运行时合并ASTC贴图 771
18.2.16 运行时合并图集 773
18.2.17 运行时合并网格 774
18.2.18 Prefab嵌套与只读 776
18.2.19 AB文件合并 777
18.3 小结 778