第1章 Hello Unity 3D 1
1.1 Unity 3D游戏引擎进化史 1
1.2 Unity 3D编辑器初印象 5
1.2.1 Project视图 5
1.2.2 Inspector视图 8
1.2.3 Hierarchy视图 9
1.2.4 Game视图 10
1.2.5 Scene视图 12
1.2.6 绘图模式 14
1.2.7 渲染模式 16
1.2.8 场景视图控制 17
1.2.9 Effects菜单和Gizmos菜单 18
1.3 Unity 3D的组成 18
1.4 为何需要游戏脚本 20
1.5 本章总结 21
第2章 Mono所搭建的脚本核心基础 22
2.1 Mono是什么 22
2.1.1 Mono的组成 22
2.1.2 Mono运行时 23
2.2 Mono如何扮演脚本的角色 24
2.2.1 Mono和脚本 24
2.2.2 Mono运行时的嵌入 26
2.3 Unity 3D为何能跨平台?聊聊CIL 38
2.3.1 Unity 3D为何能跨平台 38
2.3.2 CIL是什么 40
2.3.3 Unity 3D如何使用CIL跨平台 44
2.4 脚本的选择,C#或JavaScript 48
2.4.1 最熟悉的陌生人——UnityScript 48
2.4.2 UnityScript与JavaScript 51
2.4.3 C#与UnityScript 55
2.5 本章总结 57
第3章 Unity 3D脚本语言的类型系统 58
3.1 C#的类型系统 58
3.2 值类型和引用类型 65
3.3 Unity 3D脚本语言中的引用类型 73
3.4 Unity 3D游戏脚本中的值类型 90
3.4.1 Vector2、 Vector3以及Vector4 90
3.4.2 其他常见的值类型 94
3.5 装箱和拆箱 95
3.6 本章总结 98
第4章 Unity 3D中常用的数据结构 99
4.1 Array数组 100
4.2 ArrayList数组 101
4.3 List<T>数组 102
4.4 C#中的链表——LinkedList<T> 103
4.5 队列(Queue<T>)和栈(Stack<T>) 107
4.6 Hash Table(哈希表)和Dictionary<K,T>(字典) 112
4.7 本章总结 120
第5章 在Unity 3D中使用泛型 121
5.1 为什么需要泛型机制 121
5.2 Unity 3D中常见的泛型 124
5.3 泛型机制的基础 127
5.3.1 泛型类型和类型参数 128
5.3.2 泛型类型和继承 131
5.3.3 泛型接口和泛型委托 131
5.3.4 泛型方法 136
5.4 泛型中的类型约束和类型推断 139
5.4.1 泛型中的类型约束 139
5.4.2 类型推断 144
5.5 本章总结 146
第6章 在Unity 3D中使用委托 149
6.1 向Unity 3D中的SendMessage和BroadcastMessage说拜拜 150
6.2 认识回调函数机制——委托 151
6.3 委托是如何实现的 154
6.4 委托是如何调用多个方法的 160
6.5 用事件(Event)实现消息系统 164
6.6 事件是如何工作的 169
6.7 定义事件的观察者,实现观察者模式 172
6.8 委托的简化语法 177
6.8.1 不必构造委托对象 177
6.8.2 匿名方法 178
6.8.3 Lambda表达式 196
6.9 本章总结 201
第7章 Unity 3D中的定制特性 202
7.1 初识特性——Attribute 202
7.1.1 DllImport特性 203
7.1.2 Serializable特性 205
7.1.3 定制特性到底是谁 207
7.2 Unity 3D中提供的常用定制特性 208
7.3 定义自己的定制特性类 213
7.4 检测定制特性 216
7.5 亲手拓展Unity 3D的编辑器 217
7.6 本章总结 227
第8章 Unity 3D协程背后的迭代器 228
8.1 初识Unity 3D中的协程 228
8.1.1 使用StartCoroutine方法开启协程 229
8.1.2 使用StopCoroutine方法停止一个协程 233
8.2 使用协程实现延时效果 234
8.3 Unity 3D协程背后的秘密——迭代器 238
8.3.1 你好,迭代器 238
8.3.2 原来是状态机 242
8.3.3.状态管理 248
8.4 WWW和协程 253
8.5 Unity 3D协程代码实例 257
8.6 本章总结 259
第9章 在Unity 3D中使用可空型 260
9.1 如果没有值 260
9.2 表示空值的一些方案 261
9.2.1 使用魔值 261
9.2.2 使用标志位 261
9.2.3 借助引用类型来表示值类型的空值 265
9.3 使用可空值类型 267
9.4 可空值类型的简化语法 272
9.5 可空值类型的装箱和拆箱 278
9.6 本章总结 280
第10章 从序列化和反序列化看Unity 3D的存储机制 281
10.1 初识序列化和反序列化 281
10.2 控制类型的序列化和反序列化 290
10.2.1 如何使类型可以序列化 290
10.2.2 如何选择序列化的字段和控制反序列化的流程 292
10.2.3 序列化、反序列化中流的上下文介绍及应用 296
10.3 Unity 3D中的序列化和反序列化 299
10.3.1 Unity 3D的序列化概览 299
10.3.2 对Unity 3D游戏脚本进行序列化的注意事项 302
10.3.3 如何利用Unity 3D提供的序列化器对自定义类型进行序列化 305
10.4 Prefab和实例化之谜——序列化和反序列化的过程 309
10.4.1 认识预制体Prefab 309
10.4.2 实例化一个游戏对象 311
10.4.3 序列化和反序列化之谜 314
10.5 本章总结 317
第11章 移动平台动态读取外部文件 318
11.1 假如我想在编辑器里动态读取文件 318
11.2 移动平台的资源路径问题 320
11.3 移动平台读取外部文件的方法 323
11.4 使用Resources类加载资源 330
11.5 使用WWW类加载资源 332
11.5.1 利用WWW类的构造函数实现资源下载 332
11.5.2 利用WWW.LoadFromCacheOrDownload方法实现资源下载 333
11.5.3 利用WWWForm类实现POST请求 335
11.6 本章总结 335
第12章 在Unity 3D中使用AssetBundle 336
12.1 初识AssetBundle 336
12.2 使用AssetBundle的工作流程 337
12.2.1 开发阶段 337
12.2.2 运行阶段 340
12.3 如何使用本地磁盘中的AssetBundle文件 344
12.4 AssetBundle文件的平台兼容性 345
12.5 AssetBundle如何识别资源 345
12.6 本章总结 346
第13章 Unity 3D优化 347
13.1 看看Unity 3D优化需要从哪里着手 347
13.2 CPU方面的优化 348
13.2.1 对DrawCall的优化 348
13.2.2 对物理组件的优化 354
13.2.3 处理内存,却让CPU受伤的GC 355
13.2.4 对代码质量的优化 356
13.3 对GPU的优化 357
13.3.1 减少绘制的数目 358
13.3.2 优化显存带宽 358
13.4 内存的优化 359
13.4.1 Unity 3D的内部内存 359
13.4.2 Mono的托管内存 360
13.5 本章总结 363
第14章 Unity 3D的脚本编译 365
14.1 Unity 3D脚本编译流程概览 365
14.2 JIT即时编译 368
14.2.1 使用编译器将游戏脚本编译为托管模块 368
14.2.2 托管模块和程序集 369
14.2.3 使用JIT编译执行程序集的代码 370
14.2.4 使用 JIT即时编译的优势 371
14.3 AOT提前编译 372
14.3.1 在Unity 3D中使用AOT编译 372
14.3.2 iOS平台和Full-AOT编译 373
14.3.3 AOT编译的优势 374
14.4 谁偷了我的热更新?Mono、JIT还是iOS 374
14.4.1 从一个常见的报错说起 375
14.4.2 美丽的JIT 377
14.4.3 模拟JIT的过程 378
14.4.4 iOS平台的自我保护 381
14.5 Unity 3D项目的编译与发布 382
14.5.1 选择游戏场景和目标平台 382
14.5.2 Unity 3D发布项目的内部过程 384
14.5.3 Unity 3D部署到Android平台 384
14.5.4 Unity 3D部署到iOS平台 386
14.6 本章总结 389