本書(shū)以Unity 3D的跨平臺(tái)基礎(chǔ)Mono以及其游戲腳本語(yǔ)言C#為基礎(chǔ)進(jìn)行講解。全面系統(tǒng)地剖析了Unity 3D的跨平臺(tái)原理以及游戲腳本開(kāi)發(fā)的特點(diǎn)。第1章主要介紹了Unity 3D引擎的歷史以及編輯器的基本知識(shí);第2章主要介紹了Mono,以及Unity 3D利用Mono實(shí)現(xiàn)跨平臺(tái)的原理,并且分析了C#語(yǔ)言為何更加適合Unity 3D游戲開(kāi)發(fā);第3章到第10章主要介紹了Unity 3D游戲腳本語(yǔ)言C#在使用Unity 3D開(kāi)發(fā)過(guò)程中的知識(shí)點(diǎn),包括Unity 3D腳本的類(lèi)型基礎(chǔ)、數(shù)據(jù)結(jié)構(gòu)、在Unity 3D腳本中使用泛型、使用委托和事件打造自己的消息系統(tǒng)、利用定制特性來(lái)拓展Unity 3D的編輯器、Unity 3D協(xié)程背后的秘密――迭代器以及可空類(lèi)型和序列化在Unity 3D中使用的相關(guān)知識(shí);第11章到第14章,則主要介紹了Unity 3D的資源管理以及優(yōu)化和編譯的內(nèi)容。
1 微軟MVP張善友傾情作序,力薦本書(shū)。
2 本書(shū)作者是2015年微軟MVP,博客園推薦博客博主,在游戲蠻牛及InfoQ網(wǎng)站發(fā)表過(guò)多篇文章。
3 本書(shū)以Unity 3D的跨平臺(tái)基礎(chǔ)Mono及其游戲腳本語(yǔ)言C#為基礎(chǔ)進(jìn)行講解,全面系統(tǒng)地剖析了Unity 3D的跨平臺(tái)原理以及游戲腳本開(kāi)發(fā)的特點(diǎn)。
4 無(wú)論是初次接觸Unity 3D腳本編程的新人,還是有一定經(jīng)驗(yàn)的老手,相信都可以借本書(shū)來(lái)提高自己在Unity 3D 方面的水平。
推薦序
Unity 3D 是由兩個(gè)具有巨大吸引力而極其令人愉悅的領(lǐng)域混合而成的——C#語(yǔ)言和游戲開(kāi)發(fā)。Unity 團(tuán)隊(duì)設(shè)計(jì)Unity 3D 將這兩者有機(jī)地結(jié)合起來(lái)。
對(duì)于C#語(yǔ)言的喜愛(ài)要回溯至2000 年,當(dāng)時(shí)微軟向世界推出了新的語(yǔ)言C#,不僅震驚了
Windows 領(lǐng)域,它同時(shí)也震驚了開(kāi)源世界。GNOME 項(xiàng)目的領(lǐng)導(dǎo)者M(jìn)eguel de Icaza 就看到了C#語(yǔ)言在桌面開(kāi)發(fā)的前景,著手創(chuàng)建了開(kāi)源的.NET 跨平臺(tái)實(shí)現(xiàn)Mono,如今Mono 已經(jīng)用于從嵌入式系統(tǒng)到服務(wù)器、工業(yè)控制、移動(dòng)開(kāi)發(fā)和游戲的所有方面。.NET 語(yǔ)言不僅確保了我們不再受限于某一種當(dāng)下的語(yǔ)言,而且確保了我們可以繼續(xù)重用之前使用C 和C++編寫(xiě)的現(xiàn)有代碼,C#使我們和我們所處的世界更加高效。隨著微軟成立.NET 基金會(huì),大力發(fā)展開(kāi)源跨平臺(tái)的.NET,同時(shí)Unity 公司也是.NET 基金會(huì)成員,我們有理由相信使用C#的Unity 3D 平臺(tái)也會(huì)發(fā)展得更好。
正如Unity Technologies 的CEO David Helgason 先生所說(shuō):“Unity 是一個(gè)用來(lái)構(gòu)建游戲的工具箱,它整合了圖像、音頻、物理引擎、人機(jī)交互以及網(wǎng)絡(luò)等技術(shù)!盪nity 3D 因?yàn)樗目焖匍_(kāi)發(fā)以及跨平臺(tái)能力而為人所知。Unity 3D 的快速開(kāi)發(fā)和跨平臺(tái)能力正是來(lái)自于它對(duì)Mono平臺(tái)和C#語(yǔ)言的依賴,使用C/C++來(lái)編寫(xiě)高性能要求的引擎代碼,針對(duì)開(kāi)發(fā)人員采用高級(jí)的C#、UnityScript、Boo 語(yǔ)言作為游戲開(kāi)發(fā)的腳本。
本書(shū)作者陳嘉棟帶著激情投身于Unity 游戲開(kāi)發(fā),他在Unity 社區(qū)也非常活躍,他也通過(guò)博客寫(xiě)了大量和Unity 3D 相關(guān)的文章,如今他將這些在社區(qū)上的貢獻(xiàn)匯集成這樣一個(gè)涉及Unity 3D 跨平臺(tái)原理分析、Unity 3D 和Mono 的結(jié)合,以及在游戲腳本編程中使用C#語(yǔ)言的作品。希望無(wú)論是初次接觸Unity 3D 腳本編程的新人,還是有一定經(jīng)驗(yàn)的老手都能對(duì)Unity 3D 了解得更全面深刻,對(duì)C#語(yǔ)言在開(kāi)發(fā)游戲腳本過(guò)程中的知識(shí)點(diǎn)掌握得更牢固,寫(xiě)出更高效的代碼。
使用C#和Unity 3D 構(gòu)建游戲是一件極佳的事情。你能夠使用一種強(qiáng)類(lèi)型的、類(lèi)型安全的、垃圾回收的、具有最熱門(mén)API 的語(yǔ)言來(lái)開(kāi)發(fā)游戲,下面開(kāi)始學(xué)習(xí)陳嘉棟創(chuàng)作的這本佳作吧!
微軟MVP 張善友
2016.7.13 書(shū)于 深圳
收起全部↑
陳嘉棟,畢業(yè)于大連海事大學(xué),目前任光宇在線客戶端高級(jí)開(kāi)發(fā)工程師。博客園推薦博客作者,微軟2015年度Visual Studio and Development Technologies有價(jià)值專(zhuān)家(Most Valuable Professional)。認(rèn)為編程首先是愛(ài)好,其次才是職業(yè)。專(zhuān)注前沿技術(shù),熱愛(ài)開(kāi)源。深信代碼改變世界。
沒(méi)有值得吹噓的項(xiàng)目,只有不斷前行的動(dòng)力。
第1 章 Hello Unity 3D 1
1.1 Unity 3D 游戲引擎進(jìn)化史 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 場(chǎng)景視圖控制 17
1.2.9 Effects 菜單和Gizmos 菜單18
1.3 Unity 3D 的組成 18
1.4 為何需要游戲腳本 20
1.5 本章總結(jié) 21
第2 章 Mono 所搭建的腳本核心基礎(chǔ)22
2.1 Mono 是什么22
2.1.1 Mono 的組成22
2.1.2 Mono 運(yùn)行時(shí) 23
2.2 Mono 如何扮演腳本的角色24
2.2.1 Mono 和腳本 24
2.2.2 Mono 運(yùn)行時(shí)的嵌入26
2.3 Unity 3D 為何能跨平臺(tái)?聊聊CIL38
2.3.1 Unity 3D 為何能跨平臺(tái) 38
2.3.2 CIL 是什么 40
2.3.3 Unity 3D 如何使用CIL 跨平臺(tái) 44
2.4 腳本的選擇,C# 或 JavaScript48
2.4.1 最熟悉的陌生人——UnityScript48
2.4.2 UnityScript 與 JavaScript 51
2.4.3 C#與UnityScript 55
2.5 本章總結(jié)57
第3 章 Unity 3D 腳本語(yǔ)言的類(lèi)型系統(tǒng)58
3.1 C#的類(lèi)型系統(tǒng) 58
3.2 值類(lèi)型和引用類(lèi)型 65
3.3 Unity 3D 腳本語(yǔ)言中的引用類(lèi)型73
3.4 Unity 3D 游戲腳本中的值類(lèi)型90
3.4.1 Vector2、Vector3 以及Vector4 90
3.4.2 其他常見(jiàn)的值類(lèi)型94
3.5 裝箱和拆箱95
3.6 本章總結(jié)98
第4 章 Unity 3D 中常用的數(shù)據(jù)結(jié)構(gòu)99
4.1 Array 數(shù)組100
4.2 ArrayList 數(shù)組101
4.3 List<T>數(shù)組102
4.4 C#中的鏈表——LinkedList<T>103
4.5 隊(duì)列(Queue<T>)和棧(Stack<T>)107
4.6 Hash Table(哈希表)和Dictionary<K,T>(字典)112
4.7 本章總結(jié)120
第5 章 在Unity 3D 中使用泛型121
5.1 為什么需要泛型機(jī)制121
5.2 Unity 3D 中常見(jiàn)的泛型 124
5.3 泛型機(jī)制的基礎(chǔ)127
5.3.1 泛型類(lèi)型和類(lèi)型參數(shù) 128
5.3.2 泛型類(lèi)型和繼承131
5.3.3 泛型接口和泛型委托 131
5.3.4 泛型方法136
5.4 泛型中的類(lèi)型約束和類(lèi)型推斷139
5.4.1 泛型中的類(lèi)型約束139
5.4.2 類(lèi)型推斷144
5.5 本章總結(jié)146
第6 章 在Unity 3D 中使用委托149
6.1 向Unity 3D 中的SendMessage 和BroadcastMessage 說(shuō)拜拜150
6.2 認(rèn)識(shí)回調(diào)函數(shù)機(jī)制——委托151
6.3 委托是如何實(shí)現(xiàn)的154
6.4 委托是如何調(diào)用多個(gè)方法的 160
6.5 用事件(Event)實(shí)現(xiàn)消息系統(tǒng)164
6.6 事件是如何工作的 169
6.7 定義事件的觀察者,實(shí)現(xiàn)觀察者模式 172
6.8 委托的簡(jiǎn)化語(yǔ)法 177
6.8.1 不必構(gòu)造委托對(duì)象177
6.8.2 匿名方法 178
6.8.3 Lambda 表達(dá)式 196
6.9 本章總結(jié) 201
第7 章 Unity 3D 中的定制特性 202
7.1 初識(shí)特性——Attribute 202
7.1.1 DllImport 特性203
7.1.2 Serializable 特性 205
7.1.3 定制特性到底是誰(shuí) 207
7.2 Unity 3D 中提供的常用定制特性208
7.3 定義自己的定制特性類(lèi) 213
7.4 檢測(cè)定制特性 216
7.5 親手拓展Unity 3D 的編輯器 217
7.6 本章總結(jié)227
第8 章 Unity 3D 協(xié)程背后的迭代器 228
8.1 初識(shí)Unity 3D 中的協(xié)程 228
8.1.1 使用StartCoroutine 方法開(kāi)啟協(xié)程 229
8.1.2 使用StopCoroutine 方法停止一個(gè)協(xié)程 233
8.2 使用協(xié)程實(shí)現(xiàn)延時(shí)效果234
8.3 Unity 3D 協(xié)程背后的秘密——迭代器 238
8.3.1 你好,迭代器 238
8.3.2 原來(lái)是狀態(tài)機(jī) 242
8.3.3. 狀態(tài)管理 248
8.4 WWW和協(xié)程 253
8.5 Unity 3D 協(xié)程代碼實(shí)例 257
8.6 本章總結(jié)259
第9 章 在Unity 3D 中使用可空型 260
9.1 如果沒(méi)有值260
9.2 表示空值的一些方案 261
9.2.1 使用魔值 261
9.2.2 使用標(biāo)志位 261
9.2.3 借助引用類(lèi)型來(lái)表示值類(lèi)型的空值 265
9.3 使用可空值類(lèi)型 267
9.4 可空值類(lèi)型的簡(jiǎn)化語(yǔ)法 272
9.5 可空值類(lèi)型的裝箱和拆箱 278
9.6 本章總結(jié) 280
第10 章 從序列化和反序列化看Unity 3D 的存儲(chǔ)機(jī)制 281
10.1 初識(shí)序列化和反序列化 281
10.2 控制類(lèi)型的序列化和反序列化 290
10.2.1 如何使類(lèi)型可以序列化 290
10.2.2 如何選擇序列化的字段和控制反序列化的流程 292
10.2.3 序列化、反序列化中流的上下文介紹及應(yīng)用 296
10.3 Unity 3D 中的序列化和反序列化 299
10.3.1 Unity 3D 的序列化概覽 299
10.3.2 對(duì)Unity 3D 游戲腳本進(jìn)行序列化的注意事項(xiàng)302
10.3.3 如何利用Unity 3D 提供的序列化器對(duì)自定義類(lèi)型進(jìn)行序列化 305
10.4 Prefab 和實(shí)例化之謎——序列化和反序列化的過(guò)程309
10.4.1 認(rèn)識(shí)預(yù)制體Prefab 309
10.4.2 實(shí)例化一個(gè)游戲?qū)ο?11
10.4.3 序列化和反序列化之謎314
10.5 本章總結(jié)317
第11 章 移動(dòng)平臺(tái)動(dòng)態(tài)讀取外部文件 318
11.1 假如我想在編輯器里動(dòng)態(tài)讀取文件318
11.2 移動(dòng)平臺(tái)的資源路徑問(wèn)題 320
11.3 移動(dòng)平臺(tái)讀取外部文件的方法323
11.4 使用Resources 類(lèi)加載資源330
11.5 使用WWW類(lèi)加載資源332
11.5.1 利用WWW類(lèi)的構(gòu)造函數(shù)實(shí)現(xiàn)資源下載332
11.5.2 利用 WWW.LoadFromCacheOrDownload 方法實(shí)現(xiàn)資源下載333
11.5.3 利用WWWForm 類(lèi)實(shí)現(xiàn)POST 請(qǐng)求335
11.6 本章總結(jié)335
第12 章 在Unity 3D 中使用AssetBundle 336
12.1 初識(shí)AssetBundle 336
12.2 使用AssetBundle 的工作流程337
12.2.1 開(kāi)發(fā)階段 337
12.2.2 運(yùn)行階段340
12.3 如何使用本地磁盤(pán)中的AssetBundle 文件344
12.4 AssetBundle 文件的平臺(tái)兼容性345
12.5 AssetBundle 如何識(shí)別資源345
12.6 本章總結(jié)346
第13 章 Unity 3D 優(yōu)化347
13.1 看看Unity 3D 優(yōu)化需要從哪里著手 347
13.2 CPU 方面的優(yōu)化348
13.2.1 對(duì)DrawCall 的優(yōu)化 348
13.2.2 對(duì)物理組件的優(yōu)化 354
13.2.3 處理內(nèi)存,卻讓CPU 受傷的GC355
13.2.4 對(duì)代碼質(zhì)量的優(yōu)化356
13.3 對(duì)GPU 的優(yōu)化 357
13.3.1 減少繪制的數(shù)目358
13.3.2 優(yōu)化顯存帶寬358
13.4 內(nèi)存的優(yōu)化 359
13.4.1 Unity 3D 的內(nèi)部?jī)?nèi)存 359
13.4.2 Mono 的托管內(nèi)存 360
13.5 本章總結(jié) 363
第14 章 Unity 3D 的腳本編譯 365
14.1 Unity 3D 腳本編譯流程概覽365
14.2 JIT 即時(shí)編譯368
14.2.1 使用編譯器將游戲腳本編譯為托管模塊368
14.2.2 托管模塊和程序集 369
14.2.3 使用JIT 編譯執(zhí)行程序集的代碼 370
14.2.4 使用JIT 即時(shí)編譯的優(yōu)勢(shì) 371
14.3 AOT 提前編譯372
14.3.1 在Unity 3D 中使用AOT 編譯372
14.3.2 iOS 平臺(tái)和Full-AOT 編譯 373
14.3.3 AOT 編譯的優(yōu)勢(shì) 374
14.4 誰(shuí)偷了我的熱更新?Mono、JIT 還是iOS 374
14.4.1 從一個(gè)常見(jiàn)的報(bào)錯(cuò)說(shuō)起375
14.4.2 美麗的JIT 377
14.4.3 模擬JIT 的過(guò)程 378
14.4.4 iOS 平臺(tái)的自我保護(hù) 381
14.5 Unity 3D 項(xiàng)目的編譯與發(fā)布 382
14.5.1 選擇游戲場(chǎng)景和目標(biāo)平臺(tái) 382
14.5.2 Unity 3D 發(fā)布項(xiàng)目的內(nèi)部過(guò)程384
14.5.3 Unity 3D 部署到Android 平臺(tái) 384
14.5.4 Unity 3D 部署到iOS 平臺(tái) 386
14.6 本章總結(jié) 389