1 00:00:00,000 --> 00:00:04,295 Unity 4.3 我們發佈了第一階段的2D工具 2 00:00:04,295 --> 00:00:08,295 為此,我們用這個工具做了一個2D範例 3 00:00:08,295 --> 00:00:11,527 這個2D範例叫做"鐵橋塔防" 4 00:00:11,527 --> 00:00:15,556 描述倫敦鐵橋被外星人入侵的故事 5 00:00:15,556 --> 00:00:23,472 範例完全用2D圖片和物理來呈現 讓你了解這些元素如何在Unity裡組合 6 00:00:23,472 --> 00:00:31,639 影片會說明範例裡的背景、前景、角色、特效 鏡頭追跡、動作和腳本程式是如何製作的 7 00:00:31,639 --> 00:00:36,139 開始之前,先來聊聊基本的Unity 2D工作 8 00:00:36,860 --> 00:00:43,040 首先,當要製作2D專案,你應該先設定工作環境為2D 9 00:00:43,040 --> 00:00:47,040 可以在建立新專案時在下拉選單設定 10 00:00:47,040 --> 00:00:53,172 或是在開發中到Edit - Project Settings - Editor調整 11 00:00:53,172 --> 00:00:59,630 這代表預設情況下,輸入的材質會 被視為2D圖片,場景視圖也會預設為2D 12 00:00:59,630 --> 00:01:04,420 這個新的2D模式會採用完全的 正視圖視角來呈現你的2D遊戲 13 00:01:04,420 --> 00:01:10,197 同時也會把右上角的3D小圖示都隱藏 讓工作空間更大 14 00:01:10,197 --> 00:01:17,040 除此之外,Unity 2D的工作流程 是和現有的3D流程整合在一起的 15 00:01:17,040 --> 00:01:22,929 如果你已經會操作原本的Unity 那Unity 2D會很好上手 16 00:01:22,929 --> 00:01:27,219 值得一提的是,你也可以混搭2D和3D共用 17 00:01:27,219 --> 00:01:32,870 所以如果你想要有3D元素在你的2D遊戲裡 或2D元素在3D遊戲裡都沒有問題 18 00:01:33,366 --> 00:01:38,312 現在來看看範例如何建立一個關卡 19 00:01:38,812 --> 00:01:44,812 我們一開始勾勒關卡設計雛形 然後到Photoshop裡面去把每個圖層做出來 20 00:01:45,312 --> 00:01:51,312 然後輸出這些圖層 成為新的Sprite類型導入Unity 21 00:01:58,373 --> 00:02:06,515 為了呈現出背景的視差,我們做了一些 背景元素在Sorting Layer裡 22 00:02:06,515 --> 00:02:09,658 這是一個2D工具的新功能 23 00:02:10,158 --> 00:02:17,379 當所有背景指定到這一層後 我們可以在圖片著色器的圖層排序它們 24 00:02:17,379 --> 00:02:21,379 調好位置之後也可以把圖層鎖定不能編輯 25 00:02:21,379 --> 00:02:27,751 這樣的話我們編輯前景元素的時候 就不用擔心會不小心動到背景元素 26 00:02:27,751 --> 00:02:31,751 可以從介面右上方的圖層選單來設定 27 00:02:32,817 --> 00:02:39,531 由於背景只是裝飾用的,所以 並不需要在圖片上放任何元件 28 00:02:39,531 --> 00:02:41,531 將它們放到一個空的物件裡 29 00:02:41,531 --> 00:02:46,201 並放入一個叫做叫做 BackgroundParallax的腳本來處裡視差 30 00:02:46,201 --> 00:02:50,643 更多的細節可以詳查這個已經註解的腳本 31 00:02:54,914 --> 00:02:59,400 接下來製作角色活動的前景空間 32 00:02:59,790 --> 00:03:03,466 我們設計了倫敦鐵橋和降落在中間的飛碟 33 00:03:03,466 --> 00:03:09,216 主角處於一個敵人從天而降並到處亂竄的環境 34 00:03:09,216 --> 00:03:13,632 因此,每一個前景元素都需要 碰撞體(Collider)來讓主角在上面行走 35 00:03:13,632 --> 00:03:21,239 大多數環境用方體碰撞就可以 除了外型比較複雜的飛碟 36 00:03:22,505 --> 00:03:28,724 Unity提供多邊形碰撞體(Polygon Collider) 可以根據圖片外型自動產生多邊形碰撞體 37 00:03:28,724 --> 00:03:32,053 甚至可以調整碰撞體的外型 38 00:03:32,053 --> 00:03:38,164 你可以新增、移動或刪除節點 調整到更適合行走的外型 39 00:03:38,664 --> 00:03:45,599 為了排序前景元素我們建立了前景層 設定顯示在背景之前 40 00:03:48,875 --> 00:03:50,875 接下來看看主角 41 00:03:53,709 --> 00:04:03,598 我們的主角也是在Photoshop裡面設計的 一個四肢獨立類似卡通主角雷曼的角色 42 00:04:03,598 --> 00:04:05,598 另外一個2D工具的新功能 43 00:04:05,598 --> 00:04:09,643 是一個以圖表化的動畫工具 可以在Photoshop裡繪製每一節點的圖 44 00:04:09,643 --> 00:04:14,365 後面我們會介紹如何用這方法 製造我們的天鵝 45 00:04:15,072 --> 00:04:20,196 因為身體部位分開比較好控制動畫 因此我們希望獨立每個身體部位 46 00:04:20,196 --> 00:04:27,959 所以我們將身體部位獨立切開 好讓Unity在輸入時容易拆離它們 47 00:04:28,763 --> 00:04:33,096 這代表我們可以為圖片單獨製作動作 48 00:04:33,096 --> 00:04:40,921 把這些部位放入建好的角色層 然後改變Z軸深度來改變前後順序 49 00:04:48,811 --> 00:04:56,591 把這些圖片都放入一個有控制腳本 碰撞體、物理設定等等的物件 50 00:04:56,591 --> 00:05:07,095 一旦做到這裡,就可以到動畫視窗給予圖片動作 建立待機、跑、跳、射擊和死亡的動畫 51 00:05:07,095 --> 00:05:11,795 使用動畫視窗裡新的分鏡表功能 就可以簡單製作動作 52 00:05:13,414 --> 00:05:19,403 我們在父物件建立一個動畫元件 然後針對每一個子物件建立影格 53 00:05:19,403 --> 00:05:25,403 移動指標到想要的影格後調整角色部位 就會自動把變量錄到影格上 54 00:05:27,313 --> 00:05:35,064 可隨時切換分鏡表和動畫曲線 使得它更容易調整設計 55 00:05:36,730 --> 00:05:41,370 這些動作建立好之後我們可以 幫我們的角色設計控制狀態 56 00:05:41,370 --> 00:05:45,277 讓我們用程式呼叫角色執行各種動作 57 00:05:45,277 --> 00:05:52,123 因為不是驅動3D骨架,所以取消打勾Root Motion 58 00:05:52,123 --> 00:05:57,287 也可以打勾Animate Physics如果 動畫要和物理行為相互作用 59 00:05:57,287 --> 00:06:04,564 為了在場景走動,主角腳上有圓形碰撞體 和一個包覆整個身體的方形碰撞體 60 00:06:04,564 --> 00:06:09,454 這樣他可以平順地行走和跳下場景 跳起來的時候頭部也可以判定撞到 61 00:06:09,802 --> 00:06:16,038 為了控制角色動作,我們寫了 一個腳本透過2D物理引擎來移動 62 00:06:16,038 --> 00:06:21,427 這代表在遊戲裡面可以指定主角和敵人 讓遊戲動態更豐富的物理行為 63 00:06:21,427 --> 00:06:25,814 我們用PlayerControl腳本來判斷角色的輸入 64 00:06:25,814 --> 00:06:32,000 我們在此指定物理移動速度 同時也把輸入的值送到動畫控制器 65 00:06:32,000 --> 00:06:40,475 判定播放哪些動畫以及 順暢的播放分鏡表上圖片的轉變 66 00:06:40,475 --> 00:06:44,475 使用動畫控制建立圖片動態最大的好處是 67 00:06:44,475 --> 00:06:51,278 可以調整動畫速度用來搭配物理速度 不需要額外再作任何判定 68 00:07:23,129 --> 00:07:26,358 FixedUpdate函式會檢查每一步物理運算 69 00:07:26,358 --> 00:07:32,994 在這裡我們第一件要做的事情是 把輸入的水平值傳給動畫的速度參數 70 00:07:33,950 --> 00:07:41,718 在我們的狀態設定裡 待機狀態到跑動需要速度參數大於0.1 71 00:07:41,718 --> 00:07:46,025 當值成立時,動畫就會從待機切到跑步 72 00:07:51,857 --> 00:07:58,822 要讓角色移動,讓它有Rigidbody2D元件 就可以為它加力道移動 73 00:07:59,626 --> 00:08:07,710 同時我們也根據輸入的水平值是 大於0或小於0來處理角色面朝的方向 74 00:08:07,710 --> 00:08:14,573 這是因為在Unity裡,按住左鍵會傳回-1 而按住右鍵會傳回+1 75 00:08:15,073 --> 00:08:24,566 根據輸入值呼叫一個簡單的翻轉函數 來翻轉角色的X軸縮放,讓角色面向反方向 76 00:08:26,848 --> 00:08:31,000 為了判定角色是否著地 我們新增了一個Ground圖層 77 00:08:31,000 --> 00:08:34,982 並指定給全部可行走的前景物件 78 00:08:43,397 --> 00:08:50,234 然後使用2D裡面的Linecast函數 檢查Ground圖層是否和角色的腳接觸 79 00:08:50,234 --> 00:08:56,777 為了讓製作更容易,我們建立了 一個空白的物件當作檢查地面的標準點 80 00:08:56,777 --> 00:09:03,083 在該物件上增加一個小圖示 我們就可以控制角色到地面的距離 81 00:09:03,083 --> 00:09:07,958 就遊戲角度來看 角色在地面時只能做跳的動作 82 00:09:08,456 --> 00:09:12,648 更多關於角色控制的資訊 可以查看範例腳本裡面的說明 83 00:09:12,648 --> 00:09:15,879 影片稍後也會討論角色的武器 84 00:09:15,879 --> 00:09:19,879 接下來看看相機如何追蹤角色 85 00:09:21,291 --> 00:09:27,824 跟3D遊戲一樣,在2D遊戲裡 鏡頭運鏡也左右著遊戲體驗 86 00:09:27,824 --> 00:09:33,625 要呈現經典的2D遊戲運鏡 我們參考了2D遊戲經典大作 87 00:09:33,625 --> 00:09:38,651 任天堂或超任的超級瑪莉歐的鏡頭運作 88 00:09:38,651 --> 00:09:45,119 在超級瑪莉歐世界裡鏡頭會水平移動 除了封閉的空間或關卡邊緣 89 00:09:45,119 --> 00:09:49,342 在這兩類區域裡角色小幅移動 鏡頭不會追蹤 90 00:09:49,342 --> 00:09:54,047 一旦角色移出區域 鏡頭又會開始追蹤角色 91 00:09:54,047 --> 00:09:58,205 超級瑪莉歐的相機 用特定高度來進行垂直判定 92 00:09:58,205 --> 00:10:06,848 但我們的遊戲沒有往上的長度 比較像動作平台,所以不需要這類設定 93 00:10:07,210 --> 00:10:12,787 因此我們的相機在垂直判定 採用了和水平一樣的方法 94 00:10:18,779 --> 00:10:25,138 請看看主相機裡的CameraFollow腳本 了解鏡頭追蹤更完整的寫法和註解 95 00:10:26,135 --> 00:10:32,732 遊戲中有許多特效 但最重要的是主角殺死外星人的能力 96 00:10:32,732 --> 00:10:36,338 主角會發射一個具有 反作用力動畫的火箭筒 97 00:10:36,338 --> 00:10:38,898 這個動畫由幾個部分組成 98 00:10:38,898 --> 00:10:47,969 首先檢查輸入,當按下Fire鍵時 產生一個火箭,播放音效並觸發火箭動畫播放 99 00:10:47,969 --> 00:10:49,969 讓我們進一步分解這些步驟 100 00:10:49,969 --> 00:10:57,677 為了可以播放其他動畫(跑步)時同時播放火箭發射 我們在動畫控制器建立了Shooting的動畫層 101 00:10:57,677 --> 00:11:06,980 將Weight屬性設為1,可以 完全覆蓋基本層(Base Layer)所有的動作 102 00:11:20,499 --> 00:11:27,351 我們可以從任何狀態中用程式 觸發Shoot參數發射動畫 103 00:11:27,351 --> 00:11:30,543 來看看負責這工作的Gun腳本 104 00:11:32,700 --> 00:11:37,402 你可以看到我們寫了驅動事件 觸發Shoot為True 105 00:11:37,402 --> 00:11:45,511 觸發後會打開,在下一格重置為關 就可以重複使用,對於射擊動作最好用 106 00:11:46,011 --> 00:11:50,673 除了設定動畫,我們也從腳本中發射火箭 107 00:11:50,673 --> 00:12:00,555 播放音效後根據角色的方向 產生火箭並給它一個X軸的正或負速度 108 00:12:01,276 --> 00:12:05,294 這個Gun腳本被放在主角身上的空物件 109 00:12:05,294 --> 00:12:11,663 像這樣將腳本放到一個空物件上 可以輕易的定位火箭發射位置 110 00:12:11,663 --> 00:12:20,010 我們將物件放到火箭筒發射口 然後以他自己的座標當作發射點 111 00:12:40,248 --> 00:12:46,804 火箭本身有2D剛體 我們給它一個速度讓它移動 112 00:12:46,804 --> 00:12:51,096 它也有火焰噴射動畫和粒子系統做的煙霧 113 00:12:52,826 --> 00:12:56,482 粒子系統也接受新的Sprite圖片 114 00:12:56,482 --> 00:13:04,149 所以可以將煙霧的圖片切好後加到材質 並指定到粒子系統的Texture Sheet Animation 115 00:13:04,149 --> 00:13:08,232 就有煙霧特效讓粒子系統發射 116 00:13:16,122 --> 00:13:22,935 當火箭命中敵人或環境時 火箭本身會引起爆炸並被摧毀 117 00:13:22,935 --> 00:13:27,731 爆炸是我們製作的爆炸動畫物件 118 00:13:27,731 --> 00:13:33,699 排序位置在前景的最後面 119 00:13:36,174 --> 00:13:44,576 要建立這類動畫,可以從專案點選圖片 然後在屬性Sprite Mode選擇Multiple 120 00:13:44,576 --> 00:13:49,757 這功能允許我們編輯圖片 手動或是自動裁切圖片大小 121 00:13:49,757 --> 00:13:52,406 一旦完成裁切後 122 00:13:52,406 --> 00:13:58,765 只需要點擊Apply Unity會自動產生圖片並作為子物件 123 00:13:59,707 --> 00:14:01,693 這就是火箭製作過程 124 00:14:01,693 --> 00:14:06,533 稍後我們將在影片中討論 殺死敵人的動畫技法 125 00:14:07,102 --> 00:14:12,194 現在先讓我們回到主角 看看如何處理血條補血和扣血 126 00:14:12,194 --> 00:14:18,548 血條被定義為一個浮點數(Float) 每次碰到敵人就會呼叫TakeDamage函式 127 00:14:18,548 --> 00:14:25,347 為了避免觸發太快造成死亡 我們用repeatDamagePeriod來間隔觸發時間 128 00:14:26,524 --> 00:14:31,136 為了讓角色顯示受傷 並容易從敵人手中逃脫 129 00:14:31,136 --> 00:14:34,847 我們建立了受傷的動作 並在物理上彈飛主角 130 00:14:34,847 --> 00:14:39,540 要做到這點,TakeDamage函式 會阻止角色跳躍 131 00:14:39,540 --> 00:14:42,125 並從主角與敵人之間找到一個向量位置 132 00:14:42,125 --> 00:14:46,125 指定一個物理力量往指定方向擊退 133 00:14:46,125 --> 00:14:55,323 hurtForce是一個全域變數,可以隨時從介面調整 而不用從腳本裡調整 134 00:14:55,323 --> 00:15:02,209 除了擊退主角之外,我們同時 也扣掉角色的血量並更新血條 135 00:15:02,209 --> 00:15:09,825 為了呈現扣血,我們把血條的寬度縮減 用一個公式計算讓綠色轉變到紅色 136 00:15:09,825 --> 00:15:14,640 透過當下的血量和總量算出一個百分比 137 00:15:14,640 --> 00:15:21,744 血條是由兩個圖片組成 一個顯示血量,另一個顯示外框 138 00:15:21,744 --> 00:15:25,954 這也是在Photoshop裡做的 然後輸出兩個單獨的圖片 139 00:15:25,954 --> 00:15:34,053 導入圖形的時候,設定圖形軸心在左邊 所以當它按比例減少時,就會往左縮 140 00:15:48,573 --> 00:15:54,573 這兩個圖片放在一個空物件底下 給予一個簡單腳本,讓它顯示在角色頭上 141 00:15:54,573 --> 00:15:58,621 將血條位置設定與角色相同 142 00:15:58,621 --> 00:16:02,621 並加上偏移用的全域變數 好在檢視介面進行調整 143 00:16:16,215 --> 00:16:22,629 當主角血量為0時,設定碰撞體的isTrigger = true 主角就會往下跌到水上 144 00:16:22,629 --> 00:16:28,194 同時將主角排序推到UI層上 主角會移到畫面最上層 145 00:16:28,194 --> 00:16:31,594 UI層是我們製作的層 是用來表示像UI的前面的物件 146 00:16:31,594 --> 00:16:34,223 當腳色死亡時,我們有兩個動畫 147 00:16:34,223 --> 00:16:38,631 一個叫Death,會失去帽子和槍 另外一個叫Falling 148 00:16:38,631 --> 00:16:47,239 用Exit Time當作動畫的切換條件 一旦Death播完就會切到Falling動畫 149 00:16:50,778 --> 00:16:55,000 最後,在播放死亡動畫時 為了阻止玩家移動角色或射擊 150 00:16:55,000 --> 00:16:58,340 我們會禁用PlayerControl和Gun腳本 151 00:16:58,340 --> 00:17:05,040 由於Die函式是全域可以從任何地方呼叫 例如玩家掉入水中 152 00:17:05,040 --> 00:17:12,463 要在主角接觸水面時重置遊戲,我們 用一個由觸發器和腳本組成的KillTrigger物件 153 00:17:12,463 --> 00:17:17,512 在大多的情況下 Remover腳本移除掉入河中的敵人 154 00:17:17,512 --> 00:17:21,442 並播放一個水花動畫和音效 155 00:17:21,442 --> 00:17:24,001 但如果是主角被觸發器偵測到時 156 00:17:24,001 --> 00:17:27,092 就會呼叫PlayerHealth腳本裡的Die函式 157 00:17:27,092 --> 00:17:34,527 並禁用CameraTracking同時將角色移出螢幕 並呼叫co-routiene函數(停止2秒) 158 00:17:34,527 --> 00:17:36,527 然後重生在出生點 159 00:17:37,079 --> 00:17:39,079 接下來焦點轉移到角色生存 160 00:17:39,079 --> 00:17:42,481 來看看它是如何生存 和我們給予它甚麼生存工具 161 00:17:42,481 --> 00:17:49,911 遊戲中有兩種幫助玩家的補給箱 一種箱子是炸彈,另一種可以補血 162 00:17:50,411 --> 00:17:55,695 補給箱由箱子和降落傘兩個部分組成 163 00:17:58,046 --> 00:18:03,768 這兩個元素放入一個空白物件 我們就可以一起觸發動畫 164 00:18:03,768 --> 00:18:08,476 我們定位這兩個圖片 降落傘的軸心位於父物件的中心 165 00:18:09,045 --> 00:18:15,307 這樣動畫可以左右搖擺 讓降落傘是浮在空中的感覺 166 00:18:15,307 --> 00:18:19,307 然後增加一個剛體讓它有重力往下掉 167 00:18:19,307 --> 00:18:24,962 箱子增加碰撞體用來探測它的著陸時機 和玩家撿起的時機 168 00:18:24,962 --> 00:18:30,513 著陸之後 播放第二段動畫讓降落傘消失 169 00:18:30,513 --> 00:18:34,916 跟遊戲其他地方一樣 動畫器控制物件的狀態 170 00:18:34,916 --> 00:18:38,916 我們可以看到預設的情況下 它會播放FloatDown動畫 171 00:18:38,916 --> 00:18:43,472 然後當Land = True時會切換到著陸狀態 172 00:18:43,972 --> 00:18:49,732 在腳本裡,我們使用onTriggerEnter函數 透過標記來檢測是否碰到地面 173 00:18:49,732 --> 00:18:55,098 我們也將補給箱從父物件中分離 並給它一個剛體 174 00:18:55,098 --> 00:19:00,624 它就可以和環境互動 比如降落在一個斜坡上就會斜停在坡上 175 00:19:00,624 --> 00:19:03,672 接下來看看炸彈 176 00:19:03,672 --> 00:19:08,475 撿起炸彈箱的動作是箱子上的 BombPickup腳本處理的 177 00:19:08,475 --> 00:19:16,739 透過角色身上的LayBombs腳本 增減主角擁有的炸彈數量 178 00:19:17,557 --> 00:19:25,557 LayBombs腳本負責檢查是否攜帶著炸彈 並負責產生並放置炸彈 179 00:19:27,424 --> 00:19:36,147 炸彈設有定時裝置,在爆炸之前 透過BombDetonation裡的yield倒數計時 180 00:19:36,799 --> 00:19:39,545 爆炸函式執行幾個動作 181 00:19:39,545 --> 00:19:43,797 它會重置bombLaid參數 允許產生另外一個炸彈箱 182 00:19:43,797 --> 00:19:49,797 它會通知產生器補充新的炸彈箱 並炸死範圍內的敵人 183 00:19:50,518 --> 00:19:53,058 來看看最後一部分怎麼運作的 184 00:19:53,058 --> 00:19:57,180 因為炸彈對敵人來說是致命的 不管他們的生命值剩下多少 185 00:19:57,180 --> 00:20:03,470 我們用Physics.OverlapCircleAll方法收集 在爆炸範圍內所有標記為敵人的對象 186 00:20:03,470 --> 00:20:06,612 然後為每一個敵人執行迴圈 187 00:20:06,612 --> 00:20:15,542 設定他們的血量為0 從爆炸地點到敵人算出一個向量並施加外力 188 00:20:16,304 --> 00:20:21,381 一旦迴圈跑完,就可以播放視覺效果 189 00:20:21,381 --> 00:20:25,907 播放一段音效同時摧毀炸彈 190 00:20:26,875 --> 00:20:29,252 爆炸視覺效果有兩部分 191 00:20:29,252 --> 00:20:33,583 主要部份是一個簡單的圓形 短暫的出現後摧毀 192 00:20:33,583 --> 00:20:39,583 第二部分是星星狀的粒子系統 重複用相同圖片呈現火箭爆炸 193 00:20:42,265 --> 00:20:51,735 效率上我們保持粒子系統持續在場景中 需要時我們用程式移動到指定位置播放 194 00:20:52,511 --> 00:20:56,511 這樣可以讓粒子系統存在記憶體裡 使遊戲比較有效率 195 00:20:57,011 --> 00:21:04,668 這麼做主要是因為這個範例 同時只會有一個爆炸在場景中 196 00:21:04,668 --> 00:21:07,794 因為玩家只能一次丟一個炸彈 197 00:21:07,794 --> 00:21:14,936 這就是為什麼將粒子系統保持在場景中 並重複播放的原因,比起建立後移除有效率 198 00:21:15,714 --> 00:21:21,618 但如果是火箭爆炸,因為可以重複發射 因此需要建立後移除 199 00:21:22,118 --> 00:21:26,118 讓我們看看主角殺死敵人 怎麼計算分數 200 00:21:26,618 --> 00:21:35,528 這分為兩個部分,動畫顯示獲得100分 以及增加UI的分數計算 201 00:21:35,528 --> 00:21:40,193 分數動畫由1和0兩個數字組成 202 00:21:40,193 --> 00:21:42,872 將它們放到場景中的空白物件 203 00:21:42,872 --> 00:21:49,186 給予一個簡單的得分動畫 並用程式讓它們在動畫完成後消失 204 00:21:49,186 --> 00:21:55,186 我們放置摧毀腳本在動畫事件尾端 205 00:22:06,142 --> 00:22:13,703 ScoreUI單純是個GUI文字元件 帶有管理玩家分數的腳本 206 00:22:13,703 --> 00:22:20,980 Score是全域變數,代表隨時可以 檢查當敵人被殺死時增加100分 207 00:22:20,980 --> 00:22:24,980 說到敵人,讓我們仔細看看他們 208 00:22:25,480 --> 00:22:28,260 在我們的遊戲裡,有兩種類型外星敵人 209 00:22:28,260 --> 00:22:30,854 一種是綠皮膚的鼻涕蟲 210 00:22:30,854 --> 00:22:34,563 另一種是會搭著飛船保護自己 的智慧型外星怪物 211 00:22:34,563 --> 00:22:36,563 這些角色會共用一種腳本 212 00:22:36,563 --> 00:22:38,563 因為他們行為相似 213 00:22:38,563 --> 00:22:45,765 我們可以檢視它們的全域變數 並設定不同的移動速度和生命 214 00:22:46,638 --> 00:22:49,093 每個敵人都有自己的移動動畫 215 00:22:49,093 --> 00:22:54,444 鼻涕蟲有一個可以活動的尾巴 飛船內的敵人會前後搖擺移動 216 00:22:55,994 --> 00:23:01,994 對鼻涕蟲來說,我們匯入圖形 並把尾巴切為獨立圖形 217 00:23:01,994 --> 00:23:07,475 這樣我們就可以單獨縮放它 不會影響到整個圖片 218 00:23:07,475 --> 00:23:14,124 軸心設定到右邊 我們可以漂亮的伸展收縮尾巴 219 00:23:16,475 --> 00:23:19,918 上下移動眼瞼 220 00:23:19,918 --> 00:23:24,859 然後使用Z軸來排序 眼睛就會在眼瞼底下了 221 00:23:24,859 --> 00:23:26,859 就可以製作眨眼動畫 222 00:23:28,865 --> 00:23:34,046 第二個外星人的動畫要簡單的多 我們只需要前後轉動它 223 00:23:35,798 --> 00:23:41,229 關於這些敵人的移動技術 我們透過改變剛體的速率來移動它們 224 00:23:41,229 --> 00:23:47,826 當它們遇到一個牆壁這樣的障礙物時 會呼叫Physics.OverlapPoint函式來檢測 225 00:23:47,826 --> 00:23:55,850 檢查是否有重疊到像是 牆壁和兩邊的塔被標記的障礙物 226 00:23:55,850 --> 00:23:59,161 當函式偵測到時,就會呼叫Flip函式 227 00:23:59,161 --> 00:24:04,070 函式會翻轉敵人的X軸縮放 讓它轉到不同方向 228 00:24:04,070 --> 00:24:11,036 要殺死敵人,當敵人和火箭相撞時 在撞擊時會呼叫Hurt函式 229 00:24:14,962 --> 00:24:19,213 這個函式我們從敵人身上扣1點血 230 00:24:19,213 --> 00:24:23,213 並持續呼叫函式保持敵人持續扣血 231 00:24:23,213 --> 00:24:27,124 如果血條降到0,就會呼叫死亡函式 232 00:24:31,229 --> 00:24:33,916 當他們死後,就會執行一些函式 233 00:24:33,916 --> 00:24:39,916 會先停用所有的圖形渲染 因為2D角色大多都有動畫 234 00:24:40,941 --> 00:24:46,941 這是為了把動畫物件換成單張死亡圖片 235 00:24:47,745 --> 00:24:54,165 我們在圖形渲染器將圖片改為deadEnemy 236 00:24:54,165 --> 00:24:58,165 然後我們幫Score全域變數增加100 237 00:24:58,165 --> 00:25:03,534 然後增加扭轉讓他們死亡時扭曲 238 00:25:04,448 --> 00:25:08,881 因此我們要讓這些敵人死後 掉入環境的河中 239 00:25:08,881 --> 00:25:13,589 我們找到物件上所有碰撞體 並設定IsTrigger = True 240 00:25:13,589 --> 00:25:17,417 這樣他們就會穿過所有環境往下掉 241 00:25:17,417 --> 00:25:25,470 然後播放死亡音效之後展示一個分數動畫 242 00:25:27,876 --> 00:25:29,876 要將已死亡的敵人從場景中移除 243 00:25:29,876 --> 00:25:31,876 我們使用killTregger物件 244 00:25:31,876 --> 00:25:34,762 和前面所說的一樣 245 00:25:34,762 --> 00:25:36,762 當任何角色接觸它時 246 00:25:36,762 --> 00:25:39,950 將會引起一個水花動畫,並移除該物件 247 00:25:39,950 --> 00:25:45,950 它們撞擊水面並播放 一段附在水花動畫的音效 248 00:25:45,950 --> 00:25:50,634 所以當我們產生水花動畫時 同時也聽到音效 249 00:25:55,153 --> 00:25:59,153 要完成遊戲關卡 我們也用一些移動背景來裝飾 250 00:25:59,153 --> 00:26:02,302 為了讓遊戲環境更顯動態 251 00:26:02,302 --> 00:26:07,125 我們添加了一些飛翔的天鵝 以及沿著河岸開的公車和計程車 252 00:26:07,125 --> 00:26:16,051 首先是天鵝,它是在Photoshop裡面畫好後 用Multiple Sprite導入圖片 253 00:26:16,051 --> 00:26:20,800 Unity會自動裁切天鵝的每個圖片 254 00:26:20,800 --> 00:26:24,579 分為不同的圖導入 並把原圖當作父物件放在底下 255 00:26:24,579 --> 00:26:32,346 因為這是個動畫組合,可以將所有的圖片 一起拖到場景中,讓Unity幫我們生成動畫 256 00:26:32,346 --> 00:26:37,759 瞧,天鵝的動畫已經準備好了 257 00:26:37,759 --> 00:26:43,369 然後給天鵝一個剛體 讓我們可以控制速度飛過螢幕 258 00:26:43,369 --> 00:26:47,334 和公車和計程車一樣,天鵝已被存為預製物件 259 00:26:49,257 --> 00:26:55,257 公車和計程車作法只需要 在匯入圖形時分開車身和車輪 260 00:26:55,257 --> 00:26:58,392 並製作一個簡單的擺動動畫 261 00:26:58,392 --> 00:27:04,376 相同指定2D剛體到車子上 就能夠驅動他們在螢幕上跑 262 00:27:07,279 --> 00:27:14,271 公車、計程車和天鵝這三個物件 我們用一個重複執行的腳本來製造它們 263 00:27:14,271 --> 00:27:21,838 BackgroundPropsSpawner腳本 同時也處理出生位置,出生頻率並給予速度 264 00:27:21,838 --> 00:27:30,521 代表我們可以用這個腳本應用在三種對象 預設出生點和屬性 265 00:27:30,521 --> 00:27:33,854 要了解更多的細節,可以查看腳本中的說明 266 00:27:33,854 --> 00:27:40,409 最後,要了解更多的背景動態 我們使用了移動的雲朵、流動的河水和煙霧 267 00:27:41,323 --> 00:27:50,004 我們在空白物件下放兩個背景圖片 並使這些圖片緩慢飛過螢幕 268 00:27:50,004 --> 00:27:54,652 因為這是個無限循環 所以動畫永遠不會停 269 00:27:59,185 --> 00:28:01,031 這就是我們遊戲的製作過程 270 00:28:01,031 --> 00:28:05,516 我們希望這個教學讓你 對如何用Unity開發2D遊戲有一定了解 271 00:28:05,516 --> 00:28:08,971 未來我們也會製作更簡單的教學 272 00:28:08,971 --> 00:28:14,959 也期待你們對於Unity4.3的反應 迫不及待想看看你們的2D產品 273 00:28:14,959 --> 00:28:16,487 謝謝觀看