前 言
由於智慧型手機近些年井噴似的發展和普及,極大地帶動了手機遊戲的發展,還因此誕生了一個專有名詞——手遊。由於這類設備自身的限制,它迫使遊戲必須具備操作簡單和低硬體性能需求的特點,所以手遊里2D遊戲居多,如憤怒的小鳥和植物大戰殭屍。而2D遊戲相對於3D遊戲,開發過程更簡單,所以更適合新手。
Unity是世界知名的遊戲引擎和開發工具。它支持多平台開發,而使用它開發的遊戲不計其數。為了方便用戶開發2D遊戲,2013年11月發布的Unity 4.3提供了對2D遊戲的專項支持,即提供相應的開發工具和視圖。而國內遊戲開發者也開始廣泛採用Unity來實施2D遊戲開發。
目前國內圖書市場上還沒有一本專門講解Unity 2D遊戲開發的圖書。筆者花費了大量時間從Unity官網和其他網站蒐集了大量2D遊戲開發的技術文檔,深入研究並總結出了Unity原生和非原生的2D遊戲開發方式,最後集結成冊。本書是國內唯一一本專門講解Unity 2D遊戲開發的圖書。全書遵循行業開發通用流程,詳細地講解了開發中各種常見問題的處理,還深入分析了各種基礎知識。為了方便讀者快速上手,書中提供了較為完整的遊戲供讀者練習,以幫助讀者儘快進入遊戲開發領域的殿堂。本書不僅有助於傳統Unity開發者從3D開發轉向2D開發,還有助於初學者快速掌握2D遊戲開發的基本技能。
本書特色
1.國內第一本專門講解Unity 2D遊戲開發的圖書
通過對遊戲製作過程的詳細介紹,幫助Unity開發人員儘快熟悉2D遊戲的開發流程和方式。同時,為了照顧遊戲開發的初學者,本書還對2D遊戲各種理論做了必要描述。
2.注重操作
由於Unity為開發者提供了全套的界面化設計工具,用戶只需要進行各種操作設定,就可以完成遊戲開發工作的絕大部分。根據這個特點,本書著重講解了開發各個流程所涉及的操作。
3.貼近實際
本書嚴格遵循開發流程,安排圖書內容順序。通過本書的學習,讀者可以培養良好的開發習慣,融入遊戲開發公司的工作環境。
4.講解詳盡
遊戲開發是一個專業領域。在講解Unity的過程中,經常會遇到各種專業知識。本書對涉及的各類知識都給予了詳細講解。
5.難度適中
由於遊戲開發所涉方面眾多,往往將一個完整遊戲的講解全盤灌輸給讀者可能反而會造成各種學習障礙。本書對所涉及的實例遊戲都進行了合理取捨。既保證讀者可以掌握相關的開發內容,又最大程度地保證了遊戲的完整性。
6.提供多種多樣的交流溝通方式
學習的最佳方式是共同學習。但是由於環境所限,大部分讀者都是獨自前行。為了便於讀者更好地學習Unity,我們構建了多樣化的網路學習環境。
本書內容及體系結構
第1篇 戰機遊戲——飛船大戰外星人(第1~3章)
本篇主要內容包括:Unity及其組成的介紹、材質、紋理,以及著手開發的第一個遊戲。通過本篇的學習,讀者可以快速熟悉Unity,以及遊戲開發的專有名詞:材質和紋理,最後開發出第一個遊戲。
第2篇 卡片遊戲——記憶大作戰(第4~12章)
本篇主要內容包括:自定義編輯器、生成紋理圖集、UV、動畫、攝像機和場景的使用、獲取玩家的輸入,以及卡片類遊戲的製作。通過本篇的學習,讀者可以掌握遊戲開發的專有名詞:紋理圖集、UV、動畫、攝像機和場景,最後開發出第一個較複雜的遊戲。
第3篇 實時策略類遊戲——狂怒坦克(第13~18章)
本篇主要內容包括:創建遊戲框架、為玩家精靈添加狀態、添加敵人精靈、添加遊戲背景元素、添加究極敵人。通過本篇的學習,讀者可以掌握使用Unity原生2D工具開發2D遊戲的方法,並了解腳本對於遊戲邏輯的重要性。
學習建議
* 堅持編程:編程需要大量練習,如同學習英語一樣,只有不停的練習,才能掌握遊戲的開發。
* 隨時實踐:學習時讀者的腦子裡有時會冒出很多遊戲的想法,大膽使用Unity和腳本想方設法去實現這個想法,從中獲取的成就感會成為持續學習的動力。
* 相互交流:一個人學到和想到的東西總是有限的,只有相互交流才能對一個知識點有更加全面的把握,進而將其靈活運用到遊戲的開發實踐中。
本書讀者對象
* Unity初學者;
* 遊戲開發的初學者;
* 熟悉Unity 3D遊戲開發,但是需要快速轉向Unity 2D遊戲開發的編程人員;
* 2D遊戲開發愛好者;
* 大中專院校學生;
* 社會培訓班學員。
本書作者
本書由瀋陽理工大學藝術設計學院的王震、河北農業大學藝術學院的喻珊及河北農業大學藝術學院的張揚共同主筆編寫。王震負責編寫了本書第1~6章,喻珊負責編寫了本書第7~12章,張揚負責編寫了本書第13~18章。其他參與編寫的人員有韓先鋒、何艷芬、李榮亮、劉德環、孫姍姍、王曉燕、楊平、楊艷艷、袁玉健、張銳、張翔、陳明、鄧睿、鞏民順、吉燕、水淼、宗志勇、安靜、曹方、曾苗苗、陳超。
目 錄
第1篇 戰機遊戲——飛船大戰外星人
第1章 Unity及其組成的介紹
1.1 Unity概述 2
1.2 項目、資源和場景 4
1.2.1 項目 5
1.2.2 資源 6
1.2.3 場景 8
1.3 場景視圖的操作 8
1.3.1 使用快捷鍵操作場景視圖 9
1.3.2 使用Gizmo操作場景視圖 10
1.4 遊戲對象和組件 11
1.5 腳本與腳本編輯器 13
1.5.1 創建腳本 13
1.5.2 腳本編輯器 13
1.6 腳本的調試 16
1.6.1 調試方法一 16
1.6.2 調試方法二 18
第2章 材質和紋理
2.1 材質和紋理的使用 19
2.1.1 使用材質 19
2.1.2 不同的材料類型——著色器 22
2.1.3 使用紋理 23
2.2 套用於2D遊戲的材質 25
2.2.1 緣由 25
2.2.2 技巧一:使用白色的環境光 25
2.2.3 技巧二:使用光不敏感著色器 26
2.3 紋理使用規則 28
2.3.1 規則1:解析度是2的次方 28
2.3.2 規則2:保證“質量” 29
2.3.3 規則3:增加阿爾法通道(Alpha Channel) 30
2.4 導入紋理 31
2.4.1 導入紋理時默認設定介紹 31
2.4.2 含有透明信息的紋理 32
第3章 著手開發一個簡單的2D遊戲
3.1 開始開發2D遊戲 34
3.1.1 導入紋理資源 34
3.1.2 新建材質資源 35
3.1.3 修改場景的環境光及遊戲時的螢幕尺寸 36
3.2 為場景添加遊戲對象 38
3.2.1 調整遊戲對象的角度 38
3.2.2 改變遊戲對象的位置 39
3.2.3 遊戲對象的“碰撞”組件 39
3.3 讓飛船動起來 41
3.4 讓飛船發射子彈 42
3.4.1 在場景中添加子彈 42
3.4.2 遊戲時,讓子彈在場景中移動 44
3.4.3 生成子彈的預設 46
3.4.4 設定子彈的發射位置 47
3.4.5 在恰當的時機發射子彈 48
3.5 讓外星飛船動起來 51
3.5.1 編寫腳本 51
3.5.2 設定外星飛船的觸發器 52
3.5.3 為子彈預設添加剛體組件 53
3.6 為遊戲添加背景 54
第2篇 卡片遊戲——記憶大作戰
第4章 使用編輯器類自定義編輯器
4.1 編輯器類 58
4.2 開始使用編輯器類編寫工具 58
4.2.1 為項目添加腳本 58
4.2.2 創建指定名稱的資料夾 59
4.3 把工具添加到選單 60
4.3.1 CreateWizard()函式 60
4.3.2 測試腳本的實現效果 60
4.4 讀取場景中選擇的對象 62
4.4.1 在腳本中使用Selection類 62
4.4.2 測試腳本的實現效果 63
4.5 為工具視窗添加用戶輸入框 63
4.6 完成工具的所有功能 64
第5章 圖片與幾何圖形對象
5.1 2D遊戲常用的圖片 67
5.1.1 精靈 67
5.1.2 圖塊集 67
5.1.3 圖形繪製中的問題 68
5.1.4 構想 69
5.2 開始編寫編輯器工具 69
5.3 設定四邊形的軸點 71
5.4 指定四邊形資源的存放路徑 75
5.5 生成四邊形 76
5.5.1 階段一:創建構成四邊形的頂點、UV和三角形 76
5.5.2 階段二:在資源面板中生成四邊形 78
5.5.3 階段三:在場景中實例化一個四邊形 79
5.6 使用四邊形生成工具 80
第6章 生成紋理圖集
6.1 為什麼要使用紋理圖集 83
6.1.1 降低繪製調用的次數 83
6.1.2 便於靈活使用紋理 84
6.1.3 便於管理紋理 84
6.2 開始編寫生成紋理圖集的工具 85
6.3 添加組成紋理圖集的紋理 86
6.4 UV對紋理圖集的重要性 88
6.5 生成紋理圖集 90
6.5.1 步驟一:最佳化輸入的紋理 90
6.5.2 步驟二:構建紋理圖集 92
6.5.3 步驟三:保存圖集的預置 92
6.6 腳本檔案TexturePacker代碼匯總 93
6.7 測試工具的使用效果 95
第7章 UV和動畫
7.1 生成一個可停靠的編輯器 98
7.2 編輯工具視窗的界面 100
7.2.1 添加預置資源選擇區域 100
7.2.2 添加紋理選擇區域 102
7.2.3 添加紋理選擇的兩種方式 103
7.2.4 編寫用於修改格線對象UV坐標的函式 105
7.2.5 添加套用所有設定的按鈕 106
7.3 工具腳本代碼的匯總與使用 107
7.4 一個播放動畫的平面對象 112
第8章 益於2D遊戲的攝像機與場景設定
8.1 攝像機類型:透視與正交 118
8.2 世界單元與像素 120
8.3 世界單元與像素的轉換 122
8.3.1 添加紋理和四邊形對象 122
8.3.2 調整四邊形與攝像機的位置 123
8.3.3 世界單元:像素=1:1 124
8.3.4 對齊螢幕和場景坐標的原點 125
8.4 紋理圖片的完美顯示 127
8.5 其他有用的設定技巧 128
8.5.1 調節深度 128
8.5.2 合成視圖 130
第9章 獲取玩家對2D遊戲的輸入
9.1 自動檢測滑鼠單擊事件 134
9.2 手動檢測滑鼠單擊事件 137
9.2.1 滑鼠按下的鍵及其位置 137
9.2.2 滑鼠單擊的第一個對象 138
9.2.3 滑鼠單擊的所有對象 139
9.3 修改遊戲中的滑鼠圖示 141
9.3.1 準備所需的資源,並做適當設定 141
9.3.2 編寫腳本 143
9.3.3 兩個坐標系導致的問題 144
9.3.4 查看遊戲視圖中的效果 145
9.4 使用鍵盤控制滑鼠移動 147
9.5 對遊戲輸入的抽象——輸入軸 149
9.5.1 了解輸入軸 149
9.5.2 輸入軸在輸入過程中的套用 150
9.6 來自移動設備的輸入 152
9.6.1 檢測移動設備上的觸摸操作 152
9.6.2 把觸摸操作當作滑鼠操作 153
9.6.3 有選擇的編譯代碼 154
第10章 2D卡片遊戲——記憶大作戰
10.1 遊戲設計的文檔 156
10.2 開始著手創建遊戲 157
10.2.1 在資源面板中創建資料夾 157
10.2.2 創建一個紋理圖集 158
10.2.3 創建四邊形對象 160
10.2.4 修改四邊形的材質和UV 161
10.2.5 設定攝像機和遊戲視圖的解析度 163
10.3 設定場景中的卡片 165
10.3.1 設定卡片的屬性 165
10.3.2 定位卡片的位置 167
10.3.3 編寫控制卡片行為的腳本 168
10.3.4 補全場景中其餘的卡片 171
10.4 遊戲管理類 171
10.4.1 重置卡片 172
10.4.2 處理玩家輸入 173
10.4.3 回響玩家輸入 174
10.4.4 遊戲管理類代碼匯總 175
10.5 完善並運行遊戲 179
10.5.1 替換系統滑鼠圖示 180
10.5.2 遊戲運行效果展示 180
第11章 可在線上玩的遊戲——記憶大作戰
11.1 網路連線 183
11.2 建立伺服器端 184
11.3 建立客戶端 185
11.4 測試網路連線的功能 187
11.5 網路視圖組件 189
11.6 構建授權伺服器 191
11.7 建立遊戲輸入操作的秩序 192
11.7.1 遊戲啟動時,禁止輸入操作 193
11.7.2 連線建立後,允許伺服器端的輸入操作 193
11.7.3 伺服器端遠程調用客戶端上的函式 193
11.7.4 客戶端遠程調用伺服器端上的函式 194
11.8 修改遊戲管理類腳本 195
11.9 遊戲運行效果展示 200
11.10 為遊戲添加分數記錄 201
第12章 最佳化遊戲的方法
12.1 最最佳化,如你所想嗎 204
12.2 減少頂點的數目 205
12.3 減少材質 206
12.4 減少UV接縫 207
12.5 不同平台下,紋理的不同設定 208
12.6 對象快取組件 209
12.7 避免頻繁使用Update()函式 209
12.8 合理使用Collider組件 209
12.9 避免使用OnGUI()和GUI類 210
12.10 使用靜態批處理 210
12.11 使用天空盒子 210
第3篇 實時策略類遊戲——狂怒坦克
第13章 創建一個簡單的2D遊戲
13.1 地面 214
13.2 遊戲精靈 217
13.3 精靈動畫 220
13.3.1 Animation 220
13.3.2 Animator 223
13.4 使用腳本實現遊戲邏輯 225
13.4.1 精靈動畫狀態的控制 226
13.4.2 監聽精靈當前的動畫狀態 227
13.5 2D遊戲的運行效果 230
第14章 為遊戲精靈添加更多狀態
14.1 攝像頭追蹤功能 232
14.2 精靈的死亡和重生 235
14.3 添加多個地面 240
14.4 精靈的跳躍狀態 241
14.5 精靈的開火狀態 248
第15章 讓遊戲精靈不再孤單
15.1 為遊戲添加反派角色 253
15.2 精靈與反派角色碰撞後死亡 257
15.3 精靈主動攻擊反派角色 259
15.4 添加反派角色銷毀時的效果 261
15.5 添加多個反派角色到遊戲中 263
第16章 為遊戲添加更多背景元素
16.1 為遊戲場景補充更多元素 265
16.1.1 限制精靈的移動範圍 265
16.1.2 添加背景元素 267
16.1.3 讓背景元素動起來 268
16.1.4 讓粒子效果顯示在前面 270
16.2 記錄分數 272
16.3 動態生成更多的敵人 274
第17章 終極戰鬥
17.1 引入究極敵人 278
17.2 究極敵人的行為邏輯 279
17.3 讓究極敵人的出場更威風些 283
17.4 究極敵人的攻擊方式 286
17.5 玩家精靈的反擊 289
第18章 讓遊戲更完善
18.1 遊戲關卡 296
18.2 遊戲標題及開始按鈕 299
18.2.1 導入標題和按鈕資源 299
18.2.2 表示遊戲狀態的類 300
18.2.3 單擊開始按鈕,進入遊戲 302
18.2.4 遊戲最終運行效果展示 305