想要制作當今熱門的網絡游戲,特別是開發(fā)手機網絡游戲,或者想要到游戲公司求職,都需要深入了解網絡游戲的開發(fā)技術。
《Unity3D網絡游戲實戰(zhàn)(第2版)》分為三大部分,揭示網絡游戲開發(fā)的細節(jié)。
第-部分“扎基礎”(第1-5章)
介紹TCP網絡游戲開發(fā)的必備知識。包括TCP異步連接、多路復用技術;處理粘包分包的方法;設置正確的網絡參數、完整的發(fā)送數據、安全的關閉連接等方法。第3章介紹了一款簡單網絡游戲開發(fā)的全過程。
第二部分“搭框架”(第6章和第7章)
介紹了商業(yè)級客戶端網絡框架的實現方法。這套框架具有較高的通用性,解決了網絡游戲開發(fā)中常遇到的問題,且達到極點的性能要求,可以運用在多種游戲上。書中還實現了一套C#服務端框架,使用select多路復用,做到底層與邏輯分離,具有消息分發(fā)、事件處理等模塊。
第三部分“做游戲”(第8-12章)
通過一個完整的實例,講解網絡游戲的設計思路。包括游戲實體的類設計、怎樣組織代碼、怎樣實現游戲大廳(房間系統(tǒng))、怎樣實現實體的同步。這一部分會使用第二部分搭好的框架,逐步做出完整的游戲。
為什么要寫這本書
玩到好玩的游戲時,我總希望有朝一日能做出優(yōu)秀的游戲作品;對生活有感悟時,也總會期待在游戲中表達感想。自Unity引擎流行開來,個人和小團隊也能制作精良的游戲,實現夢想不再遙遠。
使用Unity引擎,游戲開發(fā)者再也不用過度關心底層復雜系統(tǒng)的實現,只需關心具體的游戲邏輯。一般來說,游戲引擎都能夠很好地處理渲染、物理等通用的底層模塊,但對于那些不完全通用的功能,比如本書介紹的網絡模塊,引擎往往沒能提供通用的解決方案。這就要求開發(fā)者對網絡底層有足夠深刻的理解,才能做出優(yōu)質的網絡游戲。
如今,游戲聯網是一大趨勢。幾大熱門的手機游戲廠商只開發(fā)網絡游戲,老牌單機游戲也紛紛添加聯網功能。作為有志于從事游戲行業(yè)、渴望做出頂級產品的我們,更需要深入探討網絡游戲的開發(fā)技術。然而市面上的Unity教程,大多是介紹引擎的使用方法和簡單的單機游戲的開發(fā)過程,就算涉及網絡,也只是簡單帶過。市面上也有不少介紹網絡底層的資料,但大部分沒有和游戲開發(fā)結合起來,更不可能提供完整的游戲示例。想要制作當今熱門的網絡游戲,特別是開發(fā)手機網絡游戲,或者想要到網游公司求職,很難找到實用的教程。
本書以制作一款完整的多人坦克對戰(zhàn)游戲為例,詳細介紹網絡游戲的開發(fā)過程。書中還介紹一套通用的服務端框架和客戶端網絡模塊—它是商業(yè)游戲的簡化版本。相信通過本書,讀者能夠掌握Unity網絡游戲開發(fā)的大部分知識,能夠深入了解TCP底層機制,能夠親自搭建一套可重復使用的客戶端框架,也能夠從框架設計中了解商業(yè)游戲的設計思路。本書分為三個部分,分別是“扎基礎”“搭框架”和“做游戲”,本書結合實例,循序漸進,深入地講解網絡游戲開發(fā)所需的知識。
2013年8月,在籌備第一本著作《手把手教你用C#制作RPG游戲》的同時,我也在規(guī)劃這本介紹網絡游戲技術的書籍。2016年11月,《Unity3D網絡游戲實戰(zhàn)》正式出版。此后一年多的時間里,陸續(xù)有熱心讀者與我交流,探討網絡游戲的開發(fā)知識,我也一直在學習和積累。2018年1月,在收集了足夠多的反饋,也相信自己的技術水平又上一個層次之后,我便著手本書第2版的寫作。第2版的結構與第1版有頗多差異,對網絡底層有更詳細的介紹,而對場景搭建和單機游戲部分做了必要的精簡,代碼質量也有了很大提高,可以說全書幾乎重寫。
這本書凝結了我多年的工作經驗,也凝結著我對國產游戲的美好愿景。愿與諸位一同努力,造就舉世矚目的游戲。
讀者對象
這里將根據用戶需求劃分出一些可能使用本書的用戶。
游戲開發(fā)愛好者:想要自己制作一款游戲的人。書中理論與實踐結合,很適合作為自學的參考書。
求職者:想要謀求游戲公司開發(fā)崗位的人。書中對網絡底層和商業(yè)游戲常遇到的問題都有介紹,覆蓋常見的面試內容。
職場新人:剛入行的程序員。書中所介紹的網絡知識和問題,是每個游戲從業(yè)人員都會遇到且必須去解決的。本書很適合作為提升技術水平的資料。
游戲公司:作為新人培訓材料,本書能夠幫助新人快速提高自身技術水平,同時書中有完整的實踐項目,可使新人更快融入實際工作。
學校:可作為大學或游戲培訓機構的教科書。本書結構安排合理,循序漸進,理論實踐相結合,適合教學。
如何閱讀本書
本書給予讀者一個明確的學習目標,即制作一款完整的多人對戰(zhàn)游戲,然后一步一步去實現它。全書涉及TCP網絡底層知識、常見網絡問題解決方法、客戶端網絡框架、客戶端界面系統(tǒng)、網絡游戲房間系統(tǒng)、坦克游戲戰(zhàn)斗系統(tǒng)等多項內容。在涉及相關知識點時,書中會有詳細的講解。本書分為三個部分,閱讀時要注意它們之間的遞進關系。
第一部分“扎基礎”主要介紹TCP網絡游戲開發(fā)的必備知識,包括TCP異步連接、多路復用的處理,以及怎樣處理粘包分包、怎樣發(fā)送完整的網絡數據、怎樣設置正確的網絡參數。第3章介紹了一款簡單網絡游戲開發(fā)的全過程,在后續(xù)章節(jié)中會逐步完善這個游戲。
第二部分“搭框架”主要介紹商業(yè)級客戶端網絡框架的實現方法。這套框架具有較高的通用性,解決了網絡游戲開發(fā)中常遇到的問題,且達到極致的性能要求,可以運用在多款游戲上。書中還介紹了一套單進程服務端框架的實現,服務端框架使用select多路復用,做到底層與邏輯分離,設有消息分發(fā)、事件處理等模塊。
第三部分“做游戲”通過一個完整的實例講解網絡游戲的設計思路,包括游戲實體的類設計、怎樣組織代碼、怎樣實現游戲大廳(房間系統(tǒng))、怎樣實現角色的同步。這一部分會使用第二部分搭好的框架,一步步地做出完整的游戲項目。
由于本書重點在網絡部分,因此不會過多著墨于Unity的基礎操作和C#語言的基本語法。同時作為實例教程,本書偏重于例子涉及的知識點。讀者如果想要深入地了解某些內容,或者了解實現某種功能的更多方法,建議在閱讀本書的過程中多多查詢相關資料,以做到舉一反三。
本書提供的所有示例的源碼和素材,讀者可以在Github或網盤下載。我也會在Github上發(fā)表勘誤、補充篇等內容,歡迎關注。由于網盤的不穩(wěn)定性,作者不能保證多年后網盤地址還有效。若讀者發(fā)現網盤地址失效,可以發(fā)送郵件到我的郵箱,我將會把最新的下載地址發(fā)給你
羅培羽,正在創(chuàng)作好玩游戲的程序員,目前任職于廣州四三九九公司。
在四三九九公司,參與《卡布西游》《卡布仙蹤》《卡布魔鏡》《坦克射擊》《海陸大戰(zhàn)》等多個項目研發(fā)工作;作為獨立游戲開發(fā)者,主導《仙劍5前傳之心愿》《蝕夢》等項目研發(fā),擁有豐富的實戰(zhàn)經驗。
自2009年發(fā)布第一部視頻教程《教你用VB制作RPG游戲》以來,先后發(fā)布了《教你制作3DRPG游戲》《手把手教你用C#制作RPG游戲》等教程,并出版了《Unity3D網絡游戲實戰(zhàn)(第1版)》一書;作為游戲蠻牛專欄作家,撰寫數十篇技術文章。
目前關注手機游戲、AI技術等領域;并以第三方視角記錄普通開發(fā)者的心路歷程。
前言
第1章 網絡游戲的開端:Echo 1
1.1 藏在幕后的服務端 1
1.2 網絡連接的端點:Socket 3
1.2.1 Socket 3
1.2.2 IP地址 3
1.2.3 端口 4
1.2.4 Socket通信的流程 6
1.2.5 TCP和UDP協議 7
1.3 開始網絡編程:Echo 8
1.3.1 什么是Echo程序 8
1.3.2 編寫客戶端程序 8
1.3.3 客戶端代碼知識點 10
1.3.4 完成客戶端 11
1.3.5 創(chuàng)建服務端程序 12
1.3.6 編寫服務端程序 14
1.3.7 服務端知識點 15
1.3.8 測試Echo程序 15
1.4 更多API 16
1.5 公網和局域網 17
第2章 分身有術:異步和多路復用 19
2.1 什么樣的代碼是異步代碼 19
2.2 異步客戶端 20
2.2.1 異步Connect 21
2.2.2 Show Me The Code 22
2.2.3 異步Receive 23
2.2.4 異步Send 26
2.3 異步服務端 29
2.3.1 管理客戶端 29
2.3.2 異步Accept 30
2.3.3 程序結構 31
2.3.4 代碼展示 31
2.4 實踐:做個聊天室 35
2.4.1 服務端 35
2.4.2 客戶端 35
2.4.3 測試 36
2.5 狀態(tài)檢測Poll 36
2.5.1 什么是Poll 36
2.5.2 Poll客戶端 37
2.5.3 Poll服務端 38
2.6 多路復用Select 41
2.6.1 什么是多路復用 41
2.6.2 Select服務端 42
2.6.3 Select客戶端 44
第3章 實踐出真知:大亂斗游戲 45
3.1 什么是大亂斗游戲 45
3.2 搭建場景 46
3.3 角色類Human 49
3.3.1 類結構設計 49
3.3.2 BaseHuman 49
3.3.3 角色預設 51
3.3.4 CtrlHuman 54
3.3.5 SyncHuman 57
3.4 如何使用網絡模塊 57
3.4.1 委托 57
3.4.2 通信協議 59
3.4.3 消息隊列 60
3.4.4 NetManager類 60
3.4.5 測試網絡模塊 64
3.5 進入游戲:Enter協議 66
3.5.1 創(chuàng)建角色 67
3.5.2 接收Enter協議 70
3.5.3 測試Enter協議 70
3.6 服務端如何處理消息 72
3.6.1 反射機制 72
3.6.2 消息處理函數 73
3.6.3 事件處理 74
3.6.4 玩家數據 76
3.6.5 處理Enter協議 77
3.7 玩家列表:List協議 77
3.7.1 客戶端處理 78
3.7.2 服務端處理 79
3.7.3 測試 79
3.8 移動同步:Move協議 80
3.8.1 客戶端處理 80
3.8.2 服務端處理 81
3.8.3 測試 81
3.9 玩家離開:Leave協議 82
3.9.1 客戶端處理 82
3.9.2 服務端處理 82
3.9.3 測試 82
3.10 攻擊動作:Attack協議 83
3.10.1 播放攻擊動作 83
3.10.2 客戶端處理 87
3.10.3 服務端處理 88
3.10.4 測試 88
3.11 攻擊傷害:Hit協議 89
3.11.1 客戶端處理 89
3.11.2 服務端處理 91
3.12 角色死亡:Die協議 91
3.12.1 客戶端處理 91
3.12.2 測試 92
第4章 正確收發(fā)數據流 94
4.1 TCP數據流 94
4.1.1 系統(tǒng)緩沖區(qū) 94
4.1.2 粘包半包現象 96
4.1.3 人工重現粘包現象 97
4.2 解決粘包問題的方法 97
4.2.1 長度信息法 97
4.2.2 固定長度法 98
4.2.3 結束符號法 98
4.3 解決粘包的代碼實現 99
4.3.1 發(fā)送數據 99
4.3.2 接收數據 99
4.3.3 處理數據 101
4.3.4 完整的示例 104
4.3.5 測試程序 106
4.4 大端小端問題 109
4.4.1 為什么會有大端小端之分 110
4.4.2 使用Reverse()兼容大小端編碼 111
4.4.3 手動還原數值 111
4.5 完整發(fā)送數據 112
4.5.1 不完整發(fā)送示例 113
4.5.2 如何解決發(fā)送不完整問題 113
4.5.3 ByteArray和Queue 117
4.5.4 解決線程沖突 120
4.5.5 為什么要使用隊列 121
4.6 高效的接收數據 122
4.6.1 不足之處 122
4.6.2 完整的ByteArray 123
4.6.3 將ByteArray應用到異步程序 129
第5章 深入了解TCP,解決暗藏問題 133
5.1 從TCP到銅線 133
5.1.1 應用層 133
5.1.2 傳輸層 134
5.1.3 網絡層 135
5.1.4 網絡接口 135
5.2 數據傳輸流程 136
5.2.1 TCP連接的建立 136
5.2.2 TCP的數據傳輸 137
5.2.3 TCP連接的終止 138
5.3 常用TCP參數 138
5.3.1 ReceiveBufferSize 138
5.3.2 SendBufferSize 139
5.3.3 NoDelay 139
5.3.4 TTL 140
5.3.5 ReuseAddress 141
5.3.6 LingerState 142
5.4 Close的恰當時機 144
5.5 異常處理 146
5.6 心跳機制 147
第6章 通用客戶端網絡模塊 148
6.1 網絡模塊設計 148
6.1.1 對外接口 148
6.1.2 內部設計 149
6.2 網絡事件 150
6.2.1 事件類型 151
6.2.2 監(jiān)聽列表 151
6.2.3 分發(fā)事件 152
6.3 連接服務端 152
6.3.1 Connect 152
6.3.2 ConnectCallback 154
6.3.3 測試程序 155
6.4 關閉連接 156
6.4.1 isClosing? 157
6.4.2 Close 157
6.4.3 測試 158
6.5 Json協議 158
6.5.1 為什么會有協議類 158
6.5.2 使用JsonUtility 159
6.5.3 協議格式 160
6.5.4 協議文件 161
6.5.5 協議體的編碼解碼 162
6.5.6 協議名的編碼解碼 163
6.6 發(fā)送數據 165
6.6.1 Send 165
6.6.2 SendCallback 166
6.6.3 測試 167
6.7 消息