Unity

講師:Brandon

  • 遊戲物件
    Game Object
    Sprite & Sprite Renderer
    Transform
  • 腳本
    C# 語言
    物件導向
    基礎結構
  • 角色移動
    Transform & Vector

    讀取鍵輸入

目錄

# 遊戲物件

遊戲物件
 

  • Game Object
     
  • Sprite & Sprite Renderer
     
  • Transform
# 遊戲物件

Component
 

舉例

就是Game Object可以加的各種屬性

這個格子可以控制Component的啟用與否

將游標移到值為數字的屬性上會出現雙箭頭,可以左右拖動直接調整數值

# 遊戲物件

Component
 

舉例

按右鍵或按這個

回復初始設置

移除Conponent

快速移動屬性順序至最前/後

複製Conponent

以新增的方式貼上

以參數覆蓋的方式貼上

在Scene尋找

# 遊戲物件

一個Game Object盡量不要加種類相同的兩個Component,腦子會炸掉

 

BUT

那如果我希望兩個物件一起移動,但又有不同的功能備分開操控如:角色和他的武器,要怎麼處理?

Component
 

# 遊戲物件
  1. 在 Hierarchy 選定一個母物件(這個群組的頭領)然後把子物件選取向物件拖曳
     
  2. 類似 Canva 的群組,子物件會和物件一起移動
     
  3. 如果子物件被停用,不會停用物件。但物件被停用,子物件會被停用

子物件
 

# 遊戲物件

 

原理:將子物件的位置改成與母物件的相對位置

 

 

例如,當子物件的Local Position(相對於母物件,會顯示於Inspector上)為(-5,9,0),母物件的Position為(6,15,0)

則子物件的實際位置為(1,24,0)

 

Local Position

我相信你們現在直角座標系很沒問題啊

# 遊戲物件
  1. Sprite 是一個將多圖層/圖像整合在一個2D平面上的技術
     
  2. 因為這樣的圖像並不是背景的一部份,而是「懸浮」在背景之上,就像幽靈或精靈一樣,所以才會叫做「Sprite(精靈)」

Sprite

# 遊戲物件

而 Sprite Renderer 就是一種渲染器,渲染 Sprite 到畫面上

 

請注意:Sprite ≠ SpriteRenderer

 

​​​

Sprite Renderer

  • Spirt(物件外觀圖):資料夾中的Assets
     
  • SpriteRenderer:綁定在Game Object上Component,需要提供一個Sprite給它。
# 遊戲物件

Sprite Renderer

渲染對象Sprite 可以直接搜尋檔名、選擇檔案

渲染後疊加於Sprite上的顏色

X / Y 軸鏡向翻轉

繪圖模式,等等說

可直接在同排序階層(Layer)做上下排序

圖片重疊排序階層,適用於較多物件的排序(類似不同圖層)

  • 如果是2D的話可以直接用z軸來調整
# 遊戲物件

圖像Assets設置

  1. 隨便拖一張圖進你的專案
    
    
  2. 點擊你剛剛拖進去的圖片,你就可以看到右方的Inspector視窗出現很多選項
# 遊戲物件

圖像Assets設置

圖像的類型

類似比例尺,初始值為100,改小會放大圖像(如50即邊長變為兩倍),改大則相反。如果圖像不合大小可先改這裡,盡量不要先動GameObject的大小

可以改圖片的旋轉中心

記得按Apply

# 遊戲物件

Draw Mode

  1. Simple:只能依照原比例放大、縮小

  2. Sliced:可依照自己喜好調整Sprite之長寬,單位為場景中的座標單位長

  3. Tiled:把圖片以如同磁磚般重複的形式渲染出來(長寬調整如Sliced模式)

# 遊戲物件

自己先玩玩看

試試看剛剛提到的功能
有問題可以發問!
# 遊戲物件

Transform

一個儲存GameObject在場景座標中的位置、旋轉、尺寸比例的Component

GameObject 的座標,使用的是三維座標系統,2D遊戲中Z軸可以拿來當圖層

GameObject在三個座標軸上的旋轉角度,2D遊戲應該只會碰到Z軸上的旋轉

GameObject在三個座標軸上的尺寸比例,大於1會放大,在0~1之間會縮小,小於0時效果與以該軸為基準鏡像相同

# 遊戲物件

Transform

無論是Position、Rotation、Scale的數值都是用Vector3(三維向量)的資料型態來在腳本中儲存和使用的,等一下會講

# 腳本

腳本
 

  • C# 語言
     
  • 物件導向
     
  • 基礎結構
# 腳本

C# 語言特性

 

你沒聽說過的部分:

  1. 注意變數的作用域(全域、區域變數)
  2. 使用小數的時候,因為Unity預設讀取double格式,建議都定義成double型態,如果要用float記得在數字後加f,如:
    
    
    
  3. C# 是一種物件導向的語言
float a = 0.1f
# 腳本

C# 語言特性

 

你可能聽說過的部分:
  1. 要加分號

  2. 資料型態有:int、float、double、bool、string、char

  3. 運算子有:+ - * / = += -= *= /= && || ==

  4. 語法如:for、while、if else

  5. 函式

# 腳本
物件導向

用「我坐在電腦前上Unity小社課」這個情境用物件導向的方式的話

表格內的東西,就是一種物件。然後人類、電腦是一種類別,之後類別底下指出具體的名稱,知道這個物件的屬性和操作方法後,就可以和該物件互動

    類別(class)      物件名稱      物件屬性    操作方法
         人類            我     兩隻眼睛     看簡報
         電腦  (電腦的型號) Intel 處理器、記憶體... 在螢幕上顯示簡報
# 腳本
物件導向

另外一個概念叫做繼承,拿剛剛的例子來說,比如某電腦有特殊的屬性,如:上面有貼貼紙,但這台電腦同時也會有其他電腦都有的屬性。這樣就可以讓該電腦繼承「電腦」這個類別,然後新增一些特殊的屬性。

# 腳本

實作-創建腳本

  1. 從左下角的Project 視窗中點進assets資料夾

  2. (創建一個資料夾命名為Script)

  3. 在Scripts資料夾裡面 Create →  Scripting →monobehavior
    取名隨意

# 腳本

請注意!

  1. 不要直接用 VS Code 新增 .cs 的檔案!不然腳本格式要自己新增會很麻煩

  2. 以後如果寫完腳本要記得放進目標角色的 Inspector ,這樣腳本才會真的套用在那個角色上

# 腳本

基本結構

腳本都是這樣組成的!

# 腳本

用 VS Code 打開檔案以後會看到裡面長這樣

第 1 行:類似 import 或是 include 的指令

               之後有需要會加,現在不用理他

第 3 行:代表你正在寫一個叫做 Sample ,  

        繼承 MonoBehaviour 的 class

第 6 ~ 9 行:腳本開始運作時會執行一次裡

                                        面的東西

第 13 ~ 15 行:腳本開始運作時會每一幀都
    會執行一次裡面的東西

# 腳本
修改圖片的座標

這個實作局可以先聽完再跟著一起做

  1. 首先,創建一個 Transform 物件(移動的時候也會用到這個Conponent)

  2. 創建一個函數(取名隨意,但是你最後要認得這個函數在幹嘛)

  3. 宣告的東西放在 class 裡面

 Transform BirdPos; //創建變數
 void dash()        //設立函數
 {

 }
# 腳本
修改圖片的座標

安裝成果抽查!
如果你的 VS Code(VS) 沒有裝爛,你輸入以下指令:

 

BirdPos.   

(你的變數名稱.)

紫色方塊是函數

扳手是變數

之後會看到一個物件底下所有成員的清單
# 腳本
修改圖片的座標

這行指令會把位置設成(1,1,0)

 

 void dash()
 {
     BirdPos.position = new Vector3(1, 1, 0);
 }

再來就是把這個函式放到剛剛提到的 Start 函式中,這樣函式才會在遊戲剛開始的時候被呼叫、執行

 void Start()
 {
     dash();
 }
# 腳本
修改圖片的座標
最後腳本的內容大概是這樣

 

using UnityEngine;

public class Dash : MonoBehaviour
{
    Transform BirdPos;
    void dash()
    {
        BirdPos.position = new Vector3(1, 1, 0);
    }
    void Start()
    {
        dash();
    }


    void Update()
    {
        
    }
}
# 腳本
修改圖片的座標

欸?怎麼好像沒有動靜?

 

# 腳本
修改圖片的座標

那你可能......

 

# 腳本
修改圖片的座標

那你可能......


# 腳本
修改圖片的座標

非常的正常!

 

# 腳本
修改圖片的座標

因為現在的BirdPos只是一個空的物件,根本還沒對應到任何一個實際的Transform Component,有兩種方法可以解決這個問題

 

使用GetComponent<Component Name>()函式
可以理解成一個與Component連結的東西,讓你能夠存取/修改其內容記得寫在Start()之內、Test()之前才有初始化的效果

1.

void Start()
{
	BirdPos=GetComponent<Transform>();
    dash();
}
# 腳本
修改圖片的座標

因為現在的BirdPos只是一個空的物件,根本還沒對應到任何一個實際的Transform Component,有兩種方法可以解決這個問題

 

於BirdPos的宣告前加入[SerializeField]
Inspector中會多一個可互動的框,並手動拖曳Transform Component進框框

2.

[SerializeField]Transform BirdPos;
# 腳本
修改圖片的座標
剛剛講到的功能,還有一種更簡單方式可以達成相同的功能

 

void dash()
{
    transform.position = new Vector3(1, 1, 0);
}

「transform」的成員來表示Script所屬的Game Object的Transform Component,所以可以這樣寫就好

所以根本就不用設變數

但是除了 Transform 之外的 Conponent 都可以用剛剛的方法存取或修改

# 腳本

角色移動
 

  • Transform & Vector
     
  • 讀取鍵輸入
# 角色移動

Vector2、Vector3

 

會存取一個二維、三維座標系的一個點


 

例如 Transform.position 就是一個 Vector3 變數

 

rb.velocity = new Vector2(vx, rb.velocity.y);
transform.position = new Vector3(1, 1, 0);
# 角色移動

Transform

正如剛剛在講 Component 的時候提到的,儲存一個Game Object的位置、旋轉及尺寸比例資訊

# 角色移動

讀取鍵鼠輸入

如果想讓玩家控制角色動起來,那明顯要先讀到玩家給了什麼樣的指令
# 角色移動

讀取鍵鼠輸入

首先找到左上角 Edit  Project Settings ,然後在裡面找到 Input Manager

# 角色移動

讀取鍵鼠輸入

點一下 Axes 旁邊的小三角形,你會看到:

用來存Axis 的名字(Horizontal水平、Vertival 垂直)

用來該軸座標值正負的按鍵

另一組用來該軸座標值正負的按鍵

輸入設備的類型

後覆蓋

控制的軸(因為這邊是Horizontal所以控制X軸)

Unity小社課第二堂

By Brandon

Unity小社課第二堂

  • 7