编辑推荐

适读人群:无论是初次接触Unity3D脚本编程的新人,还是有一定经验的老手,都可以借由《Unity 3D脚本编程:使用C#语言开发跨平台游戏》来提高自己的水平。
  1微软MVP张善友倾情作序,力荐《Unity 3D脚本编程:使用C#语言开发跨平台游戏》。
  2《Unity 3D脚本编程:使用C#语言开发跨平台游戏》作者是2015年微软MVP,博客园推荐博客博主,在游戏蛮牛及InfoQ网站发表过多篇文章。
  3《Unity 3D脚本编程:使用C#语言开发跨平台游戏》以Unity3D的跨平台基础Mono及其游戏脚本语言C#为基础进行讲解,全面系统地剖析了Unity3D的跨平台原理以及游戏脚本开发的特点。
  4无论是初次接触Unity3D脚本编程的新人,还是有一定经验的老手,相信都可以借《Unity 3D脚本编程:使用C#语言开发跨平台游戏》来提高自己在Unity3D方面的水平。

内容简介

  《Unity 3D脚本编程:使用C#语言开发跨平台游戏》以Unity3D的跨平台基础Mono以及其游戏脚本语言C#为基础进行讲解。全面系统地剖析了Unity3D的跨平台原理以及游戏脚本开发的特点。第1章主要介绍了Unity3D引擎的历史以及编辑器的基本知识;第2章主要介绍了Mono,以及Unity3D利用Mono实现跨平台的原理,并且分析了C#语言为何更加适合Unity3D游戏开发;第3章到第10章主要介绍了Unity3D游戏脚本语言C#在使用Unity3D开发过程中的知识点,包括Unity3D脚本的类型基础、数据结构、在Unity3D脚本中使用泛型、使用委托和事件打造自己的消息系统、利用定制特性来拓展Unity3D的编辑器、Unity3D协程背后的秘密――迭代器以及可空类型和序列化在Unity3D中使用的相关知识;第11章到第14章,则主要介绍了Unity3D的资源管理以及优化和编译的内容。

作者简介

陈嘉栋,毕业于大连海事大学,目前任光宇在线客户端高级开发工程师。博客园推荐博客作者,微软2015年度VisualStudioandDevelopmentTechnologies有价值专家(MostValuableProfessional)。认为编程首先是爱好,其次才是职业。专注前沿技术,热爱开源。深信代码改变世界。

没有值得吹嘘的项目,只有不断前行的动力。

目录

第1章HelloUnity3D1

1.1Unity3D游戏引擎进化史1

1.2Unity3D编辑器初印象5

1.2.1Project视图5

1.2.2Inspector视图8

1.2.3Hierarchy视图9

1.2.4Game视图10

1.2.5Scene视图12

1.2.6绘图模式14

1.2.7渲染模式16

1.2.8场景视图控制17

1.2.9Effects菜单和Gizmos菜单18

1.3Unity3D的组成18

1.4为何需要游戏脚本20

1.5本章总结21

第2章Mono所搭建的脚本核心基础22

2.1Mono是什么22

2.1.1Mono的组成22

2.1.2Mono运行时23

2.2Mono如何扮演脚本的角色24

2.2.1Mono和脚本24

2.2.2Mono运行时的嵌入26

2.3Unity3D为何能跨平台?聊聊CIL38

2.3.1Unity3D为何能跨平台38

2.3.2CIL是什么40

2.3.3Unity3D如何使用CIL跨平台44

2.4脚本的选择,C#或JavaScript48

2.4.1最熟悉的陌生人——UnityScript48

2.4.2UnityScript与JavaScript51

2.4.3C#与UnityScript55

2.5本章总结57

第3章Unity3D脚本语言的类型系统58

3.1C#的类型系统58

3.2值类型和引用类型65

3.3Unity3D脚本语言中的引用类型73

3.4Unity3D游戏脚本中的值类型90

3.4.1Vector2、Vector3以及Vector490

3.4.2其他常见的值类型94

3.5装箱和拆箱95

3.6本章总结98

第4章Unity3D中常用的数据结构99

4.1Array数组100

4.2ArrayList数组101

4.3List<T>数组102

4.4C#中的链表——LinkedList<T>103

4.5队列(Queue<T>)和栈(Stack<T>)107

4.6HashTable(哈希表)和Dictionary<K,T>(字典)112

4.7本章总结120

第5章在Unity3D中使用泛型121

5.1为什么需要泛型机制121

5.2Unity3D中常见的泛型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章在Unity3D中使用委托149

6.1向Unity3D中的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.3Lambda表达式196

6.9本章总结201

第7章Unity3D中的定制特性202

7.1初识特性——Attribute202

7.1.1DllImport特性203

7.1.2Serializable特性205

7.1.3定制特性到底是谁207

7.2Unity3D中提供的常用定制特性208

7.3定义自己的定制特性类213

7.4检测定制特性216

7.5亲手拓展Unity3D的编辑器217

7.6本章总结227

第8章Unity3D协程背后的迭代器228

8.1初识Unity3D中的协程228

8.1.1使用StartCoroutine方法开启协程229

8.1.2使用StopCoroutine方法停止一个协程233

8.2使用协程实现延时效果234

8.3Unity3D协程背后的秘密——迭代器238

8.3.1你好,迭代器238

8.3.2原来是状态机242

8.3.3.状态管理248

8.4WWW和协程253

8.5Unity3D协程代码实例257

8.6本章总结259

第9章在Unity3D中使用可空型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章从序列化和反序列化看Unity3D的存储机制281

10.1初识序列化和反序列化281

10.2控制类型的序列化和反序列化290

10.2.1如何使类型可以序列化290

10.2.2如何选择序列化的字段和控制反序列化的流程292

10.2.3序列化、反序列化中流的上下文介绍及应用296

10.3Unity3D中的序列化和反序列化299

10.3.1Unity3D的序列化概览299

10.3.2对Unity3D游戏脚本进行序列化的注意事项302

10.3.3如何利用Unity3D提供的序列化器对自定义类型进行序列化305

10.4Prefab和实例化之谜——序列化和反序列化的过程309

10.4.1认识预制体Prefab309

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章在Unity3D中使用AssetBundle336

12.1初识AssetBundle336

12.2使用AssetBundle的工作流程337

12.2.1开发阶段337

12.2.2运行阶段340

12.3如何使用本地磁盘中的AssetBundle文件344

12.4AssetBundle文件的平台兼容性345

12.5AssetBundle如何识别资源345

12.6本章总结346

第13章Unity3D优化347

13.1看看Unity3D优化需要从哪里着手347

13.2CPU方面的优化348

13.2.1对DrawCall的优化348

13.2.2对物理组件的优化354

13.2.3处理内存,却让CPU受伤的GC355

13.2.4对代码质量的优化356

13.3对GPU的优化357

13.3.1减少绘制的数目358

13.3.2优化显存带宽358

13.4内存的优化359

13.4.1Unity3D的内部内存359

13.4.2Mono的托管内存360

13.5本章总结363

第14章Unity3D的脚本编译365

14.1Unity3D脚本编译流程概览365

14.2JIT即时编译368

14.2.1使用编译器将游戏脚本编译为托管模块368

14.2.2托管模块和程序集369

14.2.3使用JIT编译执行程序集的代码370

14.2.4使用JIT即时编译的优势371

14.3AOT提前编译372

14.3.1在Unity3D中使用AOT编译372

14.3.2iOS平台和Full-AOT编译373

14.3.3AOT编译的优势374

14.4谁偷了我的热更新?Mono、JIT还是iOS374

14.4.1从一个常见的报错说起375

14.4.2美丽的JIT377

14.4.3模拟JIT的过程378

14.4.4iOS平台的自我保护381

14.5Unity3D项目的编译与发布382

14.5.1选择游戏场景和目标平台382

14.5.2Unity3D发布项目的内部过程384

14.5.3Unity3D部署到Android平台384

14.5.4Unity3D部署到iOS平台386

14.6本章总结389

前言/序言

  推荐序
  Unity3D是由两个具有巨大吸引力而极其令人愉悦的领域混合而成的——C#语言和游戏开发。Unity团队设计Unity3D将这两者有机地结合起来。
  对于C#语言的喜爱要回溯至2000年,当时微软向世界推出了新的语言C#,不仅震惊了
  Windows领域,它同时也震惊了开源世界。GNOME项目的领导者MegueldeIcaza就看到了C#语言在桌面开发的前景,着手创建了开源的.NET跨平台实现Mono,如今Mono已经用于从嵌入式系统到服务器、工业控制、移动开发和游戏的所有方面。.NET语言不仅确保了我们不再受限于某一种当下的语言,而且确保了我们可以继续重用之前使用C和C++编写的现有代码,C#使我们和我们所处的世界更加高效。随着微软成立.NET基金会,大力发展开源跨平台的.NET,同时Unity公司也是.NET基金会成员,我们有理由相信使用C#的Unity3D平台也会发展得更好。
  正如UnityTechnologies的CEODavidHelgason先生所说:“Unity是一个用来构建游戏的工具箱,它整合了图像、音频、物理引擎、人机交互以及网络等技术。”Unity3D因为它的快速开发以及跨平台能力而为人所知。Unity3D的快速开发和跨平台能力正是来自于它对Mono平台和C#语言的依赖,使用C/C++来编写高性能要求的引擎代码,针对开发人员采用高级的C#、UnityScript、Boo语言作为游戏开发的脚本。
  《Unity 3D脚本编程:使用C#语言开发跨平台游戏》作者陈嘉栋带着激情投身于Unity游戏开发,他在Unity社区也非常活跃,他也通过博客写了大量和Unity3D相关的文章,如今他将这些在社区上的贡献汇集成这样一个涉及Unity3D跨平台原理分析、Unity3D和Mono的结合,以及在游戏脚本编程中使用C#语言的作品。希望无论是初次接触Unity3D脚本编程的新人,还是有一定经验的老手都能对Unity3D了解得更全面深刻,对C#语言在开发游戏脚本过程中的知识点掌握得更牢固,写出更高效的代码。
  使用C#和Unity3D构建游戏是一件极佳的事情。你能够使用一种强类型的、类型安全的、垃圾回收的、具有最热门API的语言来开发游戏,下面开始学习陈嘉栋创作的这本佳作吧!
  微软MVP张善友
  2016.7.13书于深圳



其他推荐