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
# 遊戲物件
-
在 Hierarchy 選定一個母物件(這個群組的頭領)然後把子物件選取向母物件拖曳
-
類似 Canva 的群組,子物件會和母物件一起移動
- 如果子物件被停用,不會停用母物件。但母物件被停用,子物件會被停用
子物件

# 遊戲物件
原理:將子物件的位置改成與母物件的相對位置
例如,當子物件的Local Position(相對於母物件,會顯示於Inspector上)為(-5,9,0),母物件的Position為(6,15,0)
則子物件的實際位置為(1,24,0)
Local Position

我相信你們現在直角座標系很沒問題啊
# 遊戲物件
-
Sprite 是一個將多圖層/圖像整合在一個2D平面上的技術
- 因為這樣的圖像並不是背景的一部份,而是「懸浮」在背景之上,就像幽靈或精靈一樣,所以才會叫做「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設置
-
隨便拖一張圖進你的專案
- 點擊你剛剛拖進去的圖片,你就可以看到右方的Inspector視窗出現很多選項

# 遊戲物件
圖像Assets設置

圖像的類型
類似比例尺,初始值為100,改小會放大圖像(如50即邊長變為兩倍),改大則相反。如果圖像不合大小可先改這裡,盡量不要先動GameObject的大小
可以改圖片的旋轉中心
記得按Apply
# 遊戲物件
Draw Mode
-
Simple:只能依照原比例放大、縮小
-
Sliced:可依照自己喜好調整Sprite之長寬,單位為場景中的座標單位長
-
Tiled:把圖片以如同磁磚般重複的形式渲染出來(長寬調整如Sliced模式)

# 遊戲物件
自己先玩玩看
試試看剛剛提到的功能
有問題可以發問!
# 遊戲物件
Transform
一個儲存GameObject在場景座標中的位置、旋轉、尺寸比例的Component

GameObject 的座標,使用的是三維座標系統,2D遊戲中Z軸可以拿來當圖層
GameObject在三個座標軸上的旋轉角度,2D遊戲應該只會碰到Z軸上的旋轉
GameObject在三個座標軸上的尺寸比例,大於1會放大,在0~1之間會縮小,小於0時效果與以該軸為基準鏡像相同
# 遊戲物件
Transform
無論是Position、Rotation、Scale的數值都是用Vector3(三維向量)的資料型態來在腳本中儲存和使用的,等一下會講
# 腳本
腳本
-
C# 語言
-
物件導向
- 基礎結構
# 腳本C# 語言特性
你沒聽說過的部分:
-
注意變數的作用域(全域、區域變數) -
使用小數的時候,因為Unity預設讀取double格式,建議都定義成double型態,如果要用float記得在數字後加f,如: -
C# 是一種物件導向的語言
float a = 0.1f# 腳本C# 語言特性
你可能聽說過的部分:
-
要加分號
-
資料型態有:int、float、double、bool、string、char
-
運算子有:+ - * / = += -= *= /= && || ==
-
語法如:for、while、if else
-
函式
# 腳本物件導向用「我坐在電腦前上Unity小社課」這個情境用物件導向的方式的話
表格內的東西,就是一種物件。然後人類、電腦是一種類別,之後類別底下指出具體的名稱,知道這個物件的屬性和操作方法後,就可以和該物件互動
| 類別(class) | 物件名稱 | 物件屬性 | 操作方法 |
|---|---|---|---|
| 人類 | 我 | 兩隻眼睛 | 看簡報 |
| 電腦 | (電腦的型號) | Intel 處理器、記憶體... | 在螢幕上顯示簡報 |
# 腳本物件導向另外一個概念叫做繼承,拿剛剛的例子來說,比如某電腦有特殊的屬性,如:上面有貼貼紙,但這台電腦同時也會有其他電腦都有的屬性。這樣就可以讓該電腦繼承「電腦」這個類別,然後新增一些特殊的屬性。

# 腳本實作-創建腳本
-
從左下角的Project 視窗中點進assets資料夾
-
(創建一個資料夾命名為Script)
-
在Scripts資料夾裡面 Create → Scripting →monobehavior
取名隨意

# 腳本請注意!
-
不要直接用 VS Code 新增 .cs 的檔案!不然腳本格式要自己新增會很麻煩
-
以後如果寫完腳本要記得放進目標角色的 Inspector ,這樣腳本才會真的套用在那個角色上
# 腳本基本結構
腳本都是這樣組成的!
# 腳本用 VS Code 打開檔案以後會看到裡面長這樣

第 1 行:類似 import 或是 include 的指令
之後有需要會加,現在不用理他
第 3 行:代表你正在寫一個叫做 Sample ,
繼承 MonoBehaviour 的 class
第 6 ~ 9 行:腳本開始運作時會執行一次裡
面的東西
第 13 ~ 15 行:腳本開始運作時會每一幀都
會執行一次裡面的東西
# 腳本修改圖片的座標這個實作局可以先聽完再跟著一起做
-
首先,創建一個 Transform 物件(移動的時候也會用到這個Conponent)
-
創建一個函數(取名隨意,但是你最後要認得這個函數在幹嘛)
-
宣告的東西放在 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