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