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