本書分 10 章,每章都是一個獨立的知識領域,讀者可以按照章節(jié)順序閱讀本書,也可以根據(jù)喜好挑選自己感興趣的章節(jié)學習。第 1 章講了架構的意義、架構的原理以及如何實現(xiàn)架構。第 2 章對 C# 技術的基礎知識做了詳細的講解。第 3 章主要針對客戶端中的表格數(shù)據(jù)、程序的協(xié)作與應用進行講解。第 4章介紹的是用戶界面(UI)的工作原理與優(yōu)化手段。第 5 章針對 3D 模型的原理、動畫的原理以及兩者的優(yōu)化做了詳細的講解。第 6 章介紹的是網(wǎng)絡層的業(yè)務與底層原理。第 7 章針對各種 AI 類型進行了解析。第 8 章主要介紹場景構建與優(yōu)化、地圖構建以及尋路算法優(yōu)化的相關知識。第 9 章則給出了圖形數(shù)學、圖形學常用算法、渲染管線的相關知識。第 10 章針對客戶端各類渲染技術的渲染原理進行了詳細的解析。
為什么要寫這本書
編寫本書的來龍去脈要從很多年前說起。2009年畢業(yè)的我自視甚高,錯過了很多好的學習機會,待我清醒過來時已經(jīng)是2011年,周圍的人已經(jīng)走了很遠。一天晚上,我幡然醒悟,告訴自己不能再渾渾噩噩下去,我得學些可以傍身的技能。非常幸運的是,我趕上了Unity3D引擎的大潮,它讓我有機會入門游戲開發(fā)領域,跨過前人需要數(shù)年甚至數(shù)十年才能跨過的技術難關。那時,Unity3D剛發(fā)布2.4版本,我邊學理論邊實踐,從此與其結下了不解之緣。
2013年,我開始擔任Unity3D主程一職,雖然現(xiàn)在回頭來看,那時的我仍是個“菜鳥”,但當時的我可并不這么認為,我認為自己的技術已經(jīng)強大到可以駕馭整個客戶端,并且能扎實地完成游戲項目從開發(fā)到上線的整個過程,年輕人敢闖敢拼的勁頭在那時的我的身上體現(xiàn)得淋漓盡致。雖然當時是次當主程,卻敢承諾老板3個月內(nèi)開發(fā)出對方想要的游戲。事實上,到后,3個月又3個月,半年之后該游戲才完成開發(fā)。
2014年手機游戲開始火遍全球,游戲主程突然成了一個熱門職業(yè),我也陸續(xù)在各公司里擔任主程,曾為日企交接過暢銷項目,也為動視暴雪Activision開發(fā)過“使命召喚”系列手游,還在歷史悠久的盛大游戲里工作了一段時間。就這樣跌跌撞撞地,6年過去了,2020年,我到了一家新公司,這里的技術讓我大開眼界,也讓我對技術有了更高層次的理解,我如饑似渴地學習著,學習的不只是技術,還有生活。
回過頭來看,我比較幸運,搭上了Unity3D的便車,搭上了手機游戲的便車,但不可否認的是,我的學習熱情與拼命三郎般的努力,是讓自己在浪潮中牢牢抓住機會的主因。說到努力,古今中外,不少先賢和前輩都是長期努力拼搏的典范,遠如孔孟與管仲、唐太宗與成吉思汗、富蘭克林與林肯等,近到游戲業(yè)界的UWA張鑫、云風(吳云洋的筆名)、吳軍等,他們?yōu)樽约旱氖聵I(yè)傾注了大量的心血和汗水。前面的路還很長,我告訴自己要學習他們十年如一日的自律精神,并保持飽滿的精力不斷前進。
2016年,我有了寫一本關于自己是如何理解Unity3D和游戲開發(fā)的書的想法,但一直未付諸行動,直到2018年年初才著手寫了些草稿。行動是好的開始,也是自信的良藥,我試著把所寫的文章發(fā)到網(wǎng)上,雖然當時的文字功底不足,文句時有不通,結構也存在不合理的情況,但許多網(wǎng)友看了之后仍給我點贊和鼓勵,實在讓我感激不盡、感動不已。從此之后,我喜歡上了寫作的感覺,一發(fā)不可收拾,一篇又一篇,一章又一章。在寫作過程中,我發(fā)現(xiàn)自己的知識面存在諸多不足,甚至對有些知識點的理解是錯誤的,于是我拼命查看各類技術書籍和資料,以完善自己的知識體系。
可是,知識的吸收是一個漸進的過程,不可能一下子就融會貫通,雖然短期內(nèi)我寫文章的進步不大,但的安慰是,在我的努力下,書有了比較明確的框架,我對技術面的理解也到了一個新的高度。
為了彌補我的短板,在寫書期間我除了閱讀各類技術書以外,還開始閱讀一些人文類的圖書,并嘗試在博客上寫一些故事,訓練自己的寫作能力。漸漸地,我的博客上有了很多非技術類的文章,我把它們稱為我的學習之路,這些文章包括我對人和事的理解、自我反省和一些閱讀感想。讓我驚喜的是,這些非技術性的內(nèi)容竟然讓我對技術的理解達到了更高的層次,我突然發(fā)現(xiàn)生活和工作是可以融合在一起的,這是多么奇妙的一件事!
在努力加強自己的文字功底,完善自己的知識體系的同時,我也在項目中不斷地實踐所學的知識,日積月累,我的寫作素材越來越豐富,終完成了本書的創(chuàng)作。
在寫作過程中,我對本書進行了3次重構,為的就是能更好地表達技術原理,更全面和準確地講解技術要點。本書包括架構、C#技術知識、數(shù)據(jù)表與程序、UI、3D模型與動畫、網(wǎng)絡通信、人工智能、地圖與尋路、渲染管線與圖形學等,覆蓋了Unity3D游戲項目幾乎所有的技術要點,確保讀者能看到Unity3D游戲項目的技術全貌,進而對各項技術與知識點有更深層次的理解。書中不僅關注了項目中比較大的解決方案,還講解了具體的技術細節(jié),讓讀者不僅有更宏觀的視野去審視自己的項目,還能在書中找到接地氣的技術細節(jié),從而更深入地理解技術原理。
感謝讀者閱讀前言,本人在閱覽圖書時愛看前言,前言是能體現(xiàn)作者心境的地方,它可以讓你了解創(chuàng)作的起因和過程,以及其間發(fā)生的故事和感悟,讓你對所讀之書有更深的了解。
讀者對象
從行業(yè)用戶角度來看,本書適合以下讀者閱讀:
Unity3D程序員和愛好者
游戲開發(fā)者和游戲前端主程
虛擬現(xiàn)實項目的開發(fā)者
技術美術工程師和愛好者
致力于圖形圖像和引擎架構的程序員
開設相關課程的院校
如何閱讀本書
本書共10章,每章都是一個獨立的知識領域,讀者可以按照章節(jié)順序閱讀本書,也可以根據(jù)喜好挑選自己感興趣的章節(jié)學習。如果你是一名經(jīng)驗豐富的程序員,能夠理解游戲編程的相關基礎知識,那么你可以直接閱讀你感興趣的章節(jié)。如果你是一名初學者,建議盡量從第1章開始學習。
第1章講了架構的意義、架構的原理以及如何實現(xiàn)架構。第2章對C#技術的基礎知識做了詳細的講解。第3章主要針對客戶端中的表格數(shù)據(jù)、程序的協(xié)作與應用進行講解。第4章介紹的是用戶界面(UI)的工作原理與優(yōu)化手段。第5章針對3D模型的原理、動畫的原理以及兩者的優(yōu)化做了詳細的講解。第6章介紹的是網(wǎng)絡層的業(yè)務與底層原理。第7章針對各種AI類型進行了解析。第8章主要介紹場景構建與優(yōu)化、地圖構建以及尋路算法優(yōu)化的相關知識。第9章則給出了圖形數(shù)學、圖形學常用算法、渲染管線的相關知識。后一章(第10章)針對客戶端各類渲染技術的渲染原理進行了詳細的解析。
勘誤和支持
由于筆者的水平有限,寫書的時間也很緊張,書中難免會出現(xiàn)一些錯誤或者不準確的地方,懇請讀者批評指正。我在Github上開了個倉庫做問題集記錄:https://github.com/luzexi/Unity3dToBeLeader/issues,如果你發(fā)現(xiàn)書中的錯誤,可以將其發(fā)布到這個網(wǎng)頁地址的問題列表中,我將會及時反饋。本書內(nèi)容基于我的個人博客(http://www.luzexi.com)整理而成,此系列后續(xù)還會更新,本書涉及的參考資料也會發(fā)布到此博客上。如果你有更多的寶貴意見,也歡迎發(fā)送郵件至郵箱jesse_luzexi@163.com,很期待聽到你們的真摯反饋。
致謝
感謝同事以及網(wǎng)友的支持和點贊,感謝《Unity3D網(wǎng)絡游戲?qū)崙?zhàn)》的作者羅培羽給予的幫助,感謝機械工業(yè)出版社楊繡國老師細致縝密的審閱。特別要感謝我的妻子余勝男,為了支持我安心地寫書和工作,她不僅承擔了所有家務,辛苦萬分,還不忘開導我,當我的心理醫(yī)生,為我排憂,這本書實在是應該作為禮物獻給她。感謝我的兩個女兒陸秀恩(Sharon)與陸安妮(Anne),她們是世界上好的女兒,知道該如何說出自己的訴求,并懂得遵守規(guī)則的重要性,時常還能“曲線救國”,她們經(jīng)常鼓勵我“爸爸加油!”,很感激孩子們能和我一起努力,學習的路上又多了兩個知己,真開心!
陸澤西
中國,深圳
前 言
第1章軟件架構 1
1.1 架構的意義 1
1.2 軟件架構的思維方式 5
1.3 如何構建Unity3D項目 9
第2章C#技術要點 14
2.1Unity3D中C#的底層原理 14
2.2List底層源碼剖析 17
2.3Dictionary底層源碼剖析 27
2.4浮點數(shù)的精度問題 39
2.5委托、事件、裝箱、拆箱 44
2.5.1委托與事件 44
2.5.2裝箱和拆箱 45
2.6排序算法 48
2.6.1快速排序算法 48
2.6.2小堆 50
2.6.3其他排序算法概述 51
2.7各類搜索算法 51
2.7.1搜索算法概述 52
2.7.2二分查找算法 52
2.7.3二叉樹、二叉查找樹、平衡二叉樹、紅黑樹和B樹 52
2.7.4四叉樹搜索算法 53
2.7.5八叉樹搜索算法 54
2.8業(yè)務邏輯優(yōu)化技巧 54
2.8.1使用List和Dictionary時提高效率 55
2.8.2巧用struct 55
2.8.3盡可能地使用對象池 57
2.8.4字符串導致的性能問題 61
2.8.5字符串的隱藏問題 64
2.8.6程序運行原理 65
第3章數(shù)據(jù)表與程序 68
3.1數(shù)據(jù)表的種類 68
3.1.1大部分數(shù)據(jù)都是在Excel里生成的 68
3.1.2原始的數(shù)據(jù)方式—代碼數(shù)據(jù) 69
3.1.3文本數(shù)據(jù) 69
3.1.4比特流數(shù)據(jù) 70
3.2數(shù)據(jù)表的制作方式 71
3.2.1制作方式簡介 71
3.2.2讓數(shù)據(jù)使用起來更加方便 72
3.3多語言的實現(xiàn) 75
第4章用戶界面 78
4.1用戶界面系統(tǒng)的比較 78
4.2UGUI系統(tǒng)的原理及其組件使用 79
4.2.1UGUI系統(tǒng)的運行原理 79
4.2.2UGUI系統(tǒng)的組件 80
4.3UGUI事件模塊剖析 82
4.3.1UGUI事件系統(tǒng)源碼剖析 82
4.3.2輸入事件源碼 82
4.3.3事件數(shù)據(jù)模塊 83
4.3.4輸入事件捕獲模塊源碼 84
4.3.5射線碰撞檢測模塊源碼 89
4.3.6事件邏輯處理模塊 91
4.4UGUI核心源碼剖析 91
4.4.1UGUI核心源碼結構 91
4.4.2Culling模塊 91
4.4.3Layout模塊 93
4.4.4MaterialModif?iers、Specialized-Collections和Utility 94
4.4.5VertexModif?iers 95
4.4.6核心渲染類 96
4.5快速構建一個簡單易用的UI框架 101
4.6UI優(yōu)化 107
4.6.1UI動靜分離 108
4.6.2拆分過重的UI 108
4.6.3UI預加載 109
4.6.4UI圖集Alpha分離 110
4.6.5UI字體拆分 111
4.6.6Scroll View優(yōu)化 112
4.6.7網(wǎng)格重構的優(yōu)化 113
4.6.8UI展示與關閉的優(yōu)化 114
4.6.9對象池的運用 114
4.6.10UI貼圖設置的優(yōu)化 115
4.6.11內(nèi)存泄漏 117
4.6.12針對高低端機型的優(yōu)化 123
4.6.13UI圖集拼接的優(yōu)化 126
4.6.14GC的優(yōu)化 127
第5章3D模型與動畫 134
5.1美術資源規(guī)范 134
5.2合并3D模型 141
5.2.1網(wǎng)格模型的基礎知識 141
5.2.2動態(tài)批處理 143
5.2.3靜態(tài)批處理 144
5.2.4自己編寫合并3D模型的程序 145
5.3狀態(tài)機 147
5.3.1如何用狀態(tài)機模擬人物行為動作 147
5.3.2在游戲的人物行為動作中使用狀態(tài)機 148
5.3.3在游戲項目中使用狀態(tài)機的地方 148
5.43D模型的變與換 152
5.4.1切割模型 154
5.4.2扭曲模型 156
5.4.3簡化模型 157
5.4.4蒙皮骨骼動畫 159
5.4.5人物3D模型動畫換皮換裝 165
5.4.6捏臉 167
5.4.7動畫優(yōu)化 169
5.5資源的加載與釋放 176
第6章網(wǎng)絡通信 183
6.1TCP與UDP 183
6.1.1TCP和UDP簡介 183
6.1.2UDP的特點 185
6.1.3是用TCP還是用UDP 186
6.2C#實現(xiàn)TCP 187
6.2.1程序?qū)崿F(xiàn)TCP長連接 187
6.2.2TCP的API庫 187
6.2.3線程鎖 188
6.2.4緩沖隊列 188
6.2.5雙隊列結構 190
6.2.6發(fā)送數(shù)據(jù) 191
6.2.7協(xié)議數(shù)據(jù)定義標準 192
6.2.8斷線檢測 195
6.3C#實現(xiàn)UDP 196
6.3.1實現(xiàn)UDP 196
6.3.2連接確認機制 196
6.3.3數(shù)據(jù)包校驗與重發(fā)機制 199
6.3.4丟包問題分析 201
6.4封裝HTTP 202
6.4.1HTTP協(xié)議原理 202
6.4.2HTTP1.0、HTTP1.1、HTTP2.0簡述 204
6.4.3在Unity3D中的HTTP封裝 206
6.4.4多次請求時連續(xù)發(fā)送HTTP請求引起的問題 209
6.5網(wǎng)絡數(shù)據(jù)協(xié)議原理 222
6.5.1協(xié)議包的格式 222
6.5.2JSON 223
6.5.3自定義二進制數(shù)據(jù)流協(xié)議格式 224
6.5.4MessagePack 226
6.5.5Protobuf 229
6.5.6限定符的規(guī)則 231
6.5.7Protobuf的原理:序列化和反序列化 232
6.5.8Protobuf更改數(shù)據(jù)結構后的兼容問題 235
6.5.9Protobuf的優(yōu)點 236
6.5.10Protobuf的不足 237
6.6網(wǎng)絡同步解決方案 237
6.6.1狀態(tài)同步法 237
6.6.2實時廣播同步法 239
6.6.3幀同步 240
6.6.4同步快進 242
6.6.5精度問題 243
6.6.6同步鎖機制 244