---
# System prepended metadata

title: Unity 遊戲開發
tags: [程式社社課]

---

# 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.