# Unity 遊戲開發 ###### tags: `程式社社課` 地點:EC 9013 :::spoiler 目錄 [TOC] ::: :::spoiler 課表規劃 **課表規劃** 我也不確定怎麼教起,請作好被魔改課程的準備w --- Lesson 1 熟悉 UI & C# Unity UI 基本介紹 (30min) C# 入門 (示範2d移動) (30min) 基礎 component 介紹與應用示範 (30min) 生成物件 (10min) --- Lesson 2 遊戲機制(簡單) + GUI 2d移動之 " 跳躍 " (30min) 瞬移 (10min) 狙擊鏡 (10min) 平滑掌鏡 (Lerp)(10min) → 相機跟隨 (10min) 爆擊 (5min) 螢幕震動 (5min) 點擊回饋 (screen to world)(10min) 聲音/音樂總管 (30min) (x)→ Object Pool(?)(20~30min) 碰撞判定 (順帶講解collision)(15~30min) (x)切換場景 (15min) (X)3d fps視角 (30min) 顯示血條 (10min) --- Lesson 3 動畫機 & 特效 animator 流程 + 錄製 animation (30min) (帶過)→ 4 方位貼圖動畫 (10min) code 土炮動畫法 (10min) particle system 火 雷 冰 屬性特效示範 (45min) --- Lesson 4 關卡/敵人設計 我要講enum嗎(?) 工廠模式 : 概念(20min) 實作1 (彈幕遊戲:多種子彈類別) (30min) 實作2 (彈幕遊戲:敵人動作指令) (30min) --- Lesson 5 遊戲機制(複雜) 開胃菜 : 時間暫停/減速 (20min) → Coroutine (20min) → 跳傷害數字 (30min) 資料庫 : scriptable object (30min) 吃雞 : 縮圈 and 連鎖閃電/連環爆炸 (30min) (changing trigger) 追蹤/導彈 (20min) (vector cross) 簡易"移動"AI (30min) (navmesh) ::: # Lesson 1 [Unity 官網](https://unity.com/) ## 下載 Unity Hub [Unity Hub 載點](https://store.unity.com/download?ref=personal) ## Unity ID (帳號) 來到右上角頭像 icon,點登入, 沒帳號創一個,有帳號可以登入,也可與 FB google 連動登入 ![](https://i.imgur.com/9ahbGJu.png =400x) ![](https://i.imgur.com/bu97gu0.png =400x) ## licence 授權方案 授權方案選 Personal (非商業用途) 即可。 使用 Unity 獲取的年收在一定水平以下時可免費使用。 ![](https://i.imgur.com/Y7ZIbFu.png =400x) ### 統一版本的部分 請各位統一安裝 LTS 版本 ==2020.3.21f1== (詳見下圖) ![](https://i.imgur.com/E4uVlI2.png =400x) :::danger 注意: 1. 不要裝 Visual Studio,太肥了 2. 不要下載其他有的沒的 module,這些可以之後再裝 ::: ![](https://i.imgur.com/y5F4O6g.png =400x) 在一開始把版本一致除了方便合作、管理,還可以減少一些問題,像是: - 某功能升級後就爛了 - 因為你不知道新版修改了某 function 的運作方式 - 因為沒人用,所以官方不支援了 - 隊友問一個 function 的功能,但你在 Unity Documentation 找半天都找不到 - 因為他問了個 2020 版新增的函式 - 明明專案內容完全相同,但隊友出 bug 而你沒有 - 因為那個 bug 只有 2018 版才會遇到 諸如此類奇怪的 bug ## 下載 visual studio code (簡稱 VS扣) & C# compiler Unity ~~很肥~~要載一陣子,那這裡先下載等一下打 code 的編輯器 [VSC 首頁 / 載點](https://code.visualstudio.com) 沒意外的話全部同意(同意啦 哪次不同意 ### extensions ![](https://i.imgur.com/N0xc33s.png =600x) ![extensions](https://i.imgur.com/fVxa7be.png =600x) 安裝完打開 vs code,到左邊 Menu -> "Extensions" 把這些必備的插件都安裝起來 也可以利用查詢列方便安裝 ### C# compiler 同時,要去裝 C# 的編譯器與開發套件 > 不要自己裝最新的,會出問題 [.NET Framework 4.7.1 Devpack](https://go.microsoft.com/fwlink/?linkid=2099382) [.NET Core SDK 3.1.407](https://download.visualstudio.microsoft.com/download/pr/a45c8c1c-6466-4afc-a266-bd540069a4a6/97293f1080615bba5572ad1ef3be254c/dotnet-sdk-3.1.407-win-x64.exe) :::info 裝這兩個的時候,若發現不對勁 or 一直安裝失敗 有可能是防毒軟體在搞事,重開機也許能解決 還是不行的話,就在 DC 發問吧~ ::: ## 整體測試 全部安裝完就可以開始以下步驟ㄌ! ### 新建專案 ![unity hub](https://i.imgur.com/nF1ukmi.png) 載完來到這個頁面,右上角點 NEW 按鈕 選 2D 專案 (想做 3D 也行,不過最好有 2D 的基礎) ![](https://i.imgur.com/MID6aj0.png) 等 unity 跑完一些內建預設資源, 就能開始做~~糞Game~~ 心目中的遊戲啦 # Lesson 2 ## Unity editor 操作介面 ![unity editor](https://i.imgur.com/KPWK8eF.png) ### scene view & game view ![Maze view](https://catlikecoding.com/unity/tutorials/maze/maze.png) scene view => 攝影棚裡的導演 / 上帝視角 game view => 相機所拍到的畫面 / 演員的第一人稱 > 只把你想呈現給玩家的放在螢幕裡,其他的都藏到幕後 OuO ### Hierarchy 關聯性 > 禁止套娃,禁止禁止套娃,禁止禁止禁止套娃(? 存放有參與這個場景的所有物件 用樹狀結構表達它們之間的相對關係 也能設定物件之間的關係 新增的物件將會在這裡出現 #### pivot, 相對座標 / 絕對座標 樹狀結構除了方便整理歸類,也會影響它們的位置關係。 對每個物件而言,他們的座標都是以==上一層物件==的==相對位置==為基準。 例如 : 血條可能跟隨在人物的頭上 10 個單位遠的地方, 那麼他的座標可能被記為 (0, 10); 而人物若移動到座標為 (70, 100) 的地方時, 血條的座標會因為在==以人物為中心==的世界中座標維持 (0, 10), 實際在全世界中的座標會跟著被移動到 (70, 110), 這座標是相對於人物座標 (70, 100) 而言,以他為中心的 (0, 10) 座標位置。 ### inspector 詳細資訊 檢視物件的詳細資訊 公開的參數也可以自由調整 #### gameobject 裡的 Component 事實上,GameObject 是個空白的載體。 它會變成什麼,全看你為它放進怎樣的零件。 若希望它能夠顯示圖片,就放 Sprite Renderer; 若希望它能參與物理系統,就放 Rigidbody2D; 若希望它能處理碰撞或觸發,就放 Collider2D; 或者甚至為該物件製作全新的行為,例如讓它變得一閃一閃。 在 Inspector 點擊 Add Component 就可以追加新的零件, 同樣可以為每個零件填寫參數,或者移除它們。 ### project 專案倉庫 倉庫裡有 AK47,但你現在拍的是校園愛情劇,用不上 倉庫裡有鮮花玫瑰,但你今天拍的是末日殭屍片 這次用上了 AK47,但用不上那鮮花玫瑰 這個倉庫就是方便開發人員根據情況 把要用的資源拉一個備份到場景裡 不用時也可以毫無擔憂的直接從場景移除 另外,也能夠存放物品ID表、卡片屬性表等資料庫 ### console 控制台 > debug 用,應該不用多做解釋(? ```csharp Debug.Log("Hello!"); ``` ## C# (唸法 : see-sharp) ### 簡介與比較 線上編輯器 https://dotnetfiddle.net/# C++ 的 衍生語言,同為物件導向 可以比較一下 C++ 與 C# 的相異與相同之處... ```csharp= using System; public class Program { public static void Main(string[] args) { Console.WriteLine("Hello world in csharp"); } } ``` ```cpp= #include <iostream> int main(int argc, char *argv[]) { std::cout << "Hello world in cpp"; return 0; } ``` ### Unity 預設腳本 ```csharp= using UnityEngine; using System.Collections; public class MyCustomScript : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } } ``` ### 物件導向的重點特性 > ~~寫就對了,時間一久自然就融會貫通了~~[name=JasonNotJson] #### 繼承 (Inheritance) > 界門綱目科屬種 / 細節分化 人可以當醫師、工程師,也可以當黑暗大法師 車可以是跑車、貨櫃車,也可以是天竺鼠車車(? ![天竺鼠車車](https://i.imgur.com/DSwaSw3.png) ```csharp class car { public float speed; public float turn; public void forward(){ //code here... } } class molcar { public float speed; public float turn; public void forward(){ //code here... } void puipui(){ //pui pui ??? } } ``` 有沒有覺得 code 重複了 ? 就是複製貼上嘛 那如果改成下面這樣呢? ```csharp class car { public float speed; public float turn; public void driveForward(){ //code here... } } class molcar : car { //car的三個項目都有繼承到喔 void puipui(){ //pui pui ??? } } class truck : car { //car的三個項目都有繼承到喔 int cargoCap = 100; void cargoIn(){} void cargoOut(){} } ``` #### 封裝 (Encapsulation) > 控制資料的可見性、安全性 - public(公開) - 大家都可以存取 - private(私人) - 只有自己能用 / 生命週期短的變數 - protected(保護(或限定)) - 自己以及子類別可以存取 聽不懂 ? 很抽象 ? 用人類來比喻好了... ```csharp class human { //名字是都公開的嘛 public string NAME = 'Jason'; //哭哭 被當了 不敢跟別人講 private int score = 59; //祖傳密技 : ??? protected void skill(){ //your skill here } } ``` #### 多型 (Polymorphism) > 「啊,好像棋盤似的。」 > 「我看倒有點像稿紙。」 > 「真像一塊塊綠豆糕。」 同一件事,不同的人有不同的做法,程式也有需要用到這種特性的時候 不同的衍生類型對原類型的同一個 function 做出個別的操作 ```csharp class car { public virtual void driveForward(){ move(60); } } class racing : car { public override void driveForward(){ move(300); } } class garbage_truck : car { public override void driveForward(){ playSound("Für Elise"); move(10); } } ``` #### Extra : 多載(Overload) > 三角形可以怎麼算? > 底乘高除二、正弦公式、海龍公式... ```csharp //底乘高除二 float triangle(int b, int h) { return b * h / 2f; } //正弦公式 float triangle(int a, int b, float c) { return (a * b * sin(C)) / 2f; } //只有一個參數的話,你要視他是正三角也行 float triangle(int a) { return √3 / 4f * a * a; } ``` 課外參考 Youtube : [HOW TO PROGRAM in C#](https://www.youtube.com/watch?v=N775KsWQVkw&list=PLPV2KyIb3jR4CtEelGPsmPzlvP7ISPYzR) # Lesson 3 "常用 Component 介紹" ## rigidbody ## [shape] collider ![](https://www.gamebar.me/%E6%B8%B8%E6%88%8F%E5%88%B6%E4%BD%9C%E6%8A%80%E5%B7%A7/_image/2018-11-09-19-28-15.png) ## sprite renderer ## trail ## particle sys.