SlideShare a Scribd company logo
2D運動與碰撞處理I
Revised on October 4, 2019
 使用碰撞器元件
 使用剛體元件
 物件移動控制
 實作2D UFO遊戲
 顯示遊戲訊息
 真實世界兩個物體撞在⼀起會發⽣碰撞,遊戲世界裡要透過碰撞器來
模擬現實世界的碰撞情形
 碰撞器像是包覆在物件上的透明防護罩,代表物件實體邊界
 我們可依物件外觀,由選單命令Component> Physics 2D中選用合適
的碰撞器
 Box Collider 2D
 Circle Collider 2D
 Edge Collider 2D
 Polygon Collider 2D
 Capsule Collider 2D
 Composite Collider 2D
碰撞器 1/5
2
 Box Collider 2D(方框碰撞器)
 適用於矩形物體
 Circle Collider 2D(圓形碰撞器)
 適用於圓形物體
 Edge Collider 2D(邊緣碰撞器)
 適用於邊界、地板或天花板
 可編輯/調整線段節點
 即使將它編輯成封閉迴路,也只有在線段上才會碰撞,內部不會產⽣碰撞
碰撞器 2/5
3
Circle Collider Box Collider
 Polygon Collider 2D(多邊形碰撞器)
 能較精準貼近不規則物體,但會耗用較多運算資源
 Capsule Collider 2D(膠囊碰撞器)
 適用於膠囊形狀物體
 Composite Collider 2D(複合碰撞器)
 用來將子物件的碰撞器(Box Collider 2D及Polygon Collider 2D)合
併成⼀個碰撞器
 子物件勾選Used By Composite
 會自動附加Rigidbody 2D元件
碰撞器 3/5
4
Polygon ColliderCapsule Collider
碰撞器 4/5
5
Composite Collider 2D
Polygon Collider
Box Collider
 兩個具有碰撞器之物件相互碰觸時,物件程式腳本可以實作
OnCollisionXXX2D函式來處理碰撞作業
void OnCollisionEnter2D (Collision2D other) {
//進入碰撞時
}
void OnCollisionStay2D(Collision2D other) {
//在碰撞物上時
}
void OnCollisionExit2D(Collision2D other) {
//結束碰撞時
}
碰撞器 5/5
6
 當碰撞器被設定Is Trigger屬性,即成為觸發器
 其它碰撞器物件可以穿透觸發器物件
 通常道具元件會設定為Is Trigger
 在物件之程式腳本可使用下列函式來處理碰撞事件
void OnTriggerEnter2D(Collider2D other) {
//進入碰撞範圍時
}
void OnTriggerStay2D(Collider2D other) {
//在碰撞物上時
}
void OnTriggerExit2D(Collider2D other) {
//脫離碰撞範圍時
}
觸發器
7
 剛體是具物理性質的元件,可使物件在物理引擎控制下擬真運動
 物理性質:質量(Mass)、移動阻力(Linear Drag)、旋轉阻力(Angular
Drag)、重力(Gravity Scale)
 套用剛體元件可方便快速建立埸景中的運動物件
 Body Type決定剛體的運動及碰撞互動特性
 Dynamic
動態剛體完全模擬真實世界物理性質,物件會受物理作用力移動。動態剛
體會與其他剛體碰撞,是最耗效能的剛體類型
 Kinematic
運動剛體不受到重力和力的影響,對系統資源的要求較低,常用來製作移
動式平台
 Static
靜態剛體是⼀個固定不動物體,最不耗用系統資源
剛體 (Rigid body)
8
 動態剛體屬性
 Material
物件材質
 Simulated
啟用物理引擎模擬剛體功能
 Use Auto Mass
依據元件的碰撞器自動計算物體質量
 Mass
物體質量
 Linear Drag
物體移動的阻力係數
 Angular Drag
物體旋轉的阻力係數
2D剛體 (Rigidbody 2D) 1/4
9
 Gravity Scale
物體受重力影響的程度
 Collision Detection
碰撞檢測機制
 Discrete
新位置產⽣時才檢測;如果物體移動速度太快,在物理更新期間,剛體
可能與碰撞器重疊或穿過
 Continuous
Unity先計算新位置座標是否碰撞再移動剛體。會耗用較多運算資源
 Sleeping Mode
物體休眠模式,讓靜止的物體進入休眠以減低運算資源;例如箱子掉落到
地板後進入休眠
 Never Sleep
禁用休眠 (會耗用較多運算資源,儘可能不用)
2D剛體 (Rigidbody 2D) 2/4
10
 Start Awake
初始為活躍狀態
 Start Asleep
初始為休眠,但可以被碰撞喚醒
 Interpolate
在物理更新之間進行插值方式 (當運動趨於劇烈時有用)
 None
 Interpolate
基於前⼀幀中的位置座標計算插值使運動平滑
 Extrapolate
基於下⼀幀中的位置座標計算插值使運動平滑
 Constraints
設定剛體移動或旋轉之限制
2D剛體 (Rigidbody 2D) 3/4
11
 運動剛體屬性
 Use Full Kinematic Contacts
勾選時,運動剛體能與所有剛體產⽣碰撞;否則運動剛體只會與動態剛體
產⽣碰撞
 其餘屬性參照動態剛體屬性說明
 靜態剛體屬性
2D剛體 (Rigidbody 2D) 4/4
12
 更新座標方式(要計算位移,物體移動比較⽣硬不自然)
transform.Translate(Vector3.up * 0.1f);
transform.Translate(Vector3.down * 0.1f);
transform.Translate(Vector3.right * 0.1f);
transform.Translate(Vector3.left * 0.1f);
 對剛體物件施加外力(較吻合真實世界情境)
rigidbody2D = this.GetComponent<Rigidbody2D>();
Vector2 force2D = Vector2.zero;
force2D.y += forceValue;
//force2D.x += forceValue;
rigidbody2D.AddForce(force2D);
物件移動控制
13
 建立2D遊戲專案,新增場景,以ufo名稱存檔
 將Background.png、Pickup.png及UFO.png素材滙入到專案
AssetsSprites資料夾
2D UFO遊戲素材
14
Background.png
Pickup.png
UFO.png
 將Background.png拖曳到場景,重置Transform
 Main Camera元件
 Camera Background = Black
 Camera Size = 16.5
設定場景背景
15
 將UFO.png拖曳到場景
 Position(X,Y,Z) = (0, 0, 0)
 Scale(X,Y,Z) = (0.75, 0.75, 0.75)
 Order in Layer = 1
加入UFO物件
16
 為UFO元件新增UFOController程式腳本
讓UFO動起來 1/3
17
 編輯UFOController程式如下:
[SerializeField]
private float speed;
void Update() {
if (Input.GetKey (KeyCode.W)) {
this.transform.position += new Vector3 (0, speed * Time.deltaTime, 0);
}
if (Input.GetKey (KeyCode.S)) {
this.transform.position += new Vector3 (0, -speed * Time.deltaTime, 0);
}
if (Input.GetKey (KeyCode.A)) {
this.transform.position += new Vector3 (-speed * Time.deltaTime, 0, 0);
}
if (Input.GetKey (KeyCode.D)) {
this.transform.position += new Vector3 (speed * Time.deltaTime, 0, 0);
}
}
讓UFO動起來 2/3
18
 將UFO之Speed欄設定為10,執行測試
 可以用W、A、S、D鍵移動飛碟,但是飛碟移動非常⽣硬,沒有外太空
移動的感覺,且飛碟會穿透邊界
讓UFO動起來 3/3
19
 在UFO元件加上剛體性質
 選取UFO元件
 選單命令Component> Physics 2D> Rigidbody 2D
 執行測試發現UFO會受重力而往下墬落
 把Gravity Scale改成0,模擬太空無重力狀態
改用物理加速度方式移動 1/3
20
 修改UFOController程式如下:
[SerializeField]
private float speed;
private Rigidbody2D rigidbody2D = null;
void Start () {
rigidbody2D = this.GetComponent<Rigidbody2D> ();
}
void FixedUpdate() {
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector2 movement = new Vector2 (moveHorizontal, moveVertical);
rigidbody2D.AddForce (movement * speed);
}
改用物理加速度方式移動 2/3
21
 Force Value設定為3,執行測試;UFO能以加速度方式移動了,但是UFO還
是會飛出邊界
改用物理加速度方式移動 3/3
22
 在UFO元件加入圓形碰撞器
 選取UFO元件
 選單命令Component> Physics 2D> Circle Collider 2D
 調整Radius = 2.12,使讓圓形碰撞器大小符合UFO元件
設定UFO飛行邊界 1/2
23
 在Background元件加上邊緣碰撞器
 選取Background元件
 選單命令Component> Physics 2D> Edge Collider 2D
 點擊Edit Collider按鈕,使邊緣碰撞器環繞背景內緣四週
 執行測試,飛碟不會穿牆出去了
設定UFO飛行邊界 2/2
24
 將Main Camera拖曳到UFO元件底下
 執行測試
 遊戲鏡頭會以飛碟為中心
 飛碟撞到邊界,飛碟會旋轉;由於Camera鏡頭是依附在飛碟上,飛碟時旋
轉遊戲鏡頭也會跟著旋轉
使畫面鏡頭跟隨飛碟移動 1/2
25
 Main Camera元件加入CameraController程式腳本,強制鎖住鏡頭
旋轉角度
public class CameraController : MonoBehaviour {
void Start () {
}
void Update () {
this.transform.eulerAngles = Vector3.zero;
}
}
 執行測試
 飛碟可以在邊界內飛行,背景圖也不會旋轉了
使畫面鏡頭跟隨飛碟移動 2/2
26
 將Pickup.png拖曳到場景,命名為Pickup
 Order in Layer = 1
 Tag = PickUp
 加上剛體性質
 選單命令Component> Physics 2D> Rigidbody 2D
 Body Type設定為Kinematic
佈置金塊道具 1/5
27
 加入圓形碰撞器
 選單命令Component> Physics 2D> Circle Collider 2D
 勾選Is Trigger
 Raduis = 1
佈置金塊道具 2/5
28
 Pickups元件加入PickupController程式腳本,讓金塊自主旋轉
public class PickupController : MonoBehaviour {
[SerializeField]
private float RotateSpeed;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
this.transform.Rotate (new Vector3(0, 0, RotateSpeed * Time.deltaTime));
}
}
佈置金塊道具 3/5
29
 Rotate Speed設定為45
 執行測試,金塊會自主旋轉
佈置金塊道具 4/5
30
 將Pickup元件拖曳到AssetsPrefabs資料夾,建立Pickup預製元件
 從AssetsPrefabs資料夾拖曳Pickup預製元件到場景,擺設如下
 執行測試
 飛碟會穿過金塊
佈置金塊道具 5/5
31
 當飛碟碰到金塊,讓金塊消失;開啟UFOController.cs,加入以下
程式碼
void OnTriggerEnter2D(Collider2D other) {
if (other.gameObject.CompareTag ("PickUp")) {
other.gameObject.SetActive(false);
}
}
void OnTriggerExit2D(Collider2D other) {
}
 執行測試
 飛碟碰到金塊時,金塊會自動消失了
讓UFO收集金塊
32
 選單命令GameObject> UI> Text新增Text元件
,命名為CountText
 Anchor設為左上角 (Pos屬性的參考原點)
 Pos(X,Y,Z) = (10, -10, 0) (依實際情形調整)
 Width設為100,Height設為100
 Pivot(X,Y) = (0, 1)
 Text = CountText
 Font Size設為14
 Color設為黃色
顯示遊戲訊息 1/6
33
 選單命令GameObject> UI> Text新增Text元件
,命名為WinText
 Anchor設為中心
 Pos(X,Y,Z) = (0, 75, 0) (依實際情形調整)
 Width設為160,Height設為30
 Text設為WinText
 Alignment設為置中
 Font Size設為24
 Color設為黃色
顯示遊戲訊息 2/6
34
 新增UI元件時,會自動建立Canvas元件,而如果場景中已經有畫布,
新增的 UI 元素將會自動成為此畫布的子物件
 遊戲執行時,系統會依據Render Mode自動調整Canvas大小及位置
 Render Mode預設為Screen Space - Overlay
顯示遊戲訊息 3/6
35
Canvas
Game resolution
 修改UFOController程式腳本,當飛碟收集到金塊時更新CountText
訊息,收集滿12個金塊時顯示You win!
using UnityEngine;
using UnityEngine.UI;
public class UFOController : MonoBehaviour {
[SerializeField]
private float speed;
private Rigidbody2D rigidbody2D = null;
[SerializeField]
private Text countText;
[SerializeField]
private Text winText;
private int count;
void Start () {
rigidbody2D = this.GetComponent<Rigidbody2D> ();
count = 0;
winText.text = "";
SetCountText ();
}
顯示遊戲訊息 4/6
36
注意Text是定義在Unity.Engine.UI底下
void OnTriggerEnter2D(Collider2D other) {
if (other.gameObject.CompareTag ("PickUp")) {
other.gameObject.SetActive(false);
count = count + 1;
SetCountText ();
}
}
void SetCountText() {
countText.text = "Count: " + _count.ToString ();
if (count >= 12)
winText.text = "You win!";
}
}
顯示遊戲訊息 5/6
37
 選取UFO物件,然後把CounterText及WinText分別拖曳到UFO
Controller的對應欄位
顯示遊戲訊息 6/6
38
 Update()
 每個frame執行⼀次,更新週期是變動性的
 用來進行
 非剛體物件之移動
 簡單計時器
 讀取週邊輸入
 FixedUpdate()
 更新週期是固定的
 用來進行剛體物件調整
 選單命令Edit> Project Settings> Time
Update()與FixedUpdate() 1/3
39
 在Main Camera新增以下程式腳本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UpdateAndFixedUpdate : MonoBehaviour {
void Update () {
Debug.Log ("Update time: " + Time.deltaTime);
}
void FixedUpdate(){
Debug.Log ("FixedUpdate time: " + Time.deltaTime);
}
}
Update()與FixedUpdate() 2/3
40
Update()與FixedUpdate() 3/3
41
會變動
時間間距固定
時間間距會變動

More Related Content

PDF
Unity遊戲程式設計 - 應用Sprite物件
PDF
Unity遊戲設計- 應用Sprite物件
PDF
Unity遊戲程式設計 - 2D移動與碰撞處理II
PDF
Roll a ball遊戲專案
PDF
Unity遊戲程式設計(05) 2D移動與碰撞處理II
PDF
Unity遊戲設計- Unity基礎指引
PDF
Unity遊戲程式設計(04) 2D運動與碰撞處理I
PDF
Unity遊戲程式設計(02) 應用2D圖片物件
Unity遊戲程式設計 - 應用Sprite物件
Unity遊戲設計- 應用Sprite物件
Unity遊戲程式設計 - 2D移動與碰撞處理II
Roll a ball遊戲專案
Unity遊戲程式設計(05) 2D移動與碰撞處理II
Unity遊戲設計- Unity基礎指引
Unity遊戲程式設計(04) 2D運動與碰撞處理I
Unity遊戲程式設計(02) 應用2D圖片物件

What's hot (19)

PDF
Unity遊戲程式設計(09) 3D物件與光源設定
PDF
Unity遊戲程式設計(03) 2D動畫製作及應用
PDF
Unity遊戲程式設計(01) Unity簡介
PDF
Unity遊戲程式設計 - 2D 物理關節應用
PDF
Vuforia AR影片程式設計
PDF
Unity遊戲程式設計 - 2D粒子特效應用
PDF
Unity遊戲程式設計(11) 創建遊戲地形
PDF
Unity遊戲程式設計 - 3D物件與光源設定
PDF
Vuforia AR 同時追踨多張辨識圖
PPT
4.2第四章 swarm代码剖析 可选补充课程
PDF
Unity遊戲設計- 2D動畫製作及應用
PDF
Unity遊戲程式設計(12)第三人稱角色控制器
PDF
PDF
Unity遊戲程式設計 - 2D移動與碰撞處理II
PPT
Actionscript遊戲元素
PDF
I os 14
PPT
Actionscript 3.0基本介紹
PDF
Unity脚本入门
Unity遊戲程式設計(09) 3D物件與光源設定
Unity遊戲程式設計(03) 2D動畫製作及應用
Unity遊戲程式設計(01) Unity簡介
Unity遊戲程式設計 - 2D 物理關節應用
Vuforia AR影片程式設計
Unity遊戲程式設計 - 2D粒子特效應用
Unity遊戲程式設計(11) 創建遊戲地形
Unity遊戲程式設計 - 3D物件與光源設定
Vuforia AR 同時追踨多張辨識圖
4.2第四章 swarm代码剖析 可选补充课程
Unity遊戲設計- 2D動畫製作及應用
Unity遊戲程式設計(12)第三人稱角色控制器
Unity遊戲程式設計 - 2D移動與碰撞處理II
Actionscript遊戲元素
I os 14
Actionscript 3.0基本介紹
Unity脚本入门
Ad

Similar to Unity遊戲程式設計 - 2D運動與碰撞處理I (14)

PDF
Keep your code clean
PDF
Unity遊戲程式設計 - Roll a ball遊戲
PDF
Yui3 初探
PDF
JCConf 2024 - Java 22 & 23 新功能介紹
PPTX
從 Singleton 談 constructor
PDF
Kissy editor开发与设计
PPTX
基于Eclipse和hadoop平台应用开发入门手册
ODP
Solitaire with Greenfoot #1
ODP
Solitaire with Greenfoot #2
ODP
Solitaire with Greenfoot #2/4
PPTX
180518 ntut js and node
PDF
Android 智慧型手機程式設計
PDF
Kissy简介
PDF
Banquet 52
Keep your code clean
Unity遊戲程式設計 - Roll a ball遊戲
Yui3 初探
JCConf 2024 - Java 22 & 23 新功能介紹
從 Singleton 談 constructor
Kissy editor开发与设计
基于Eclipse和hadoop平台应用开发入门手册
Solitaire with Greenfoot #1
Solitaire with Greenfoot #2
Solitaire with Greenfoot #2/4
180518 ntut js and node
Android 智慧型手機程式設計
Kissy简介
Banquet 52
Ad

More from 吳錫修 (ShyiShiou Wu) (20)

PDF
mbot2.0教學-陀螺儀與三軸加速計應用.pdf
PDF
mbot2.0教學-使用makeblock雲服務.pdf
PDF
mbot2.0教學-局域網路傳輸應用.pdf
PDF
mbot2.0教學-四路顏色感測器應用.pdf
PDF
mbot2.0教學-聲光控制應用.pdf
PDF
mbot2.0教學-光感測器與LED應用.pdf
PDF
mbot2.0教學-超音波感測應用.pdf
PDF
mbot2.0教學-移動控制.pdf
PDF
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdf
PDF
mbot2.0教學-組裝與測試.pdf
PDF
Python元組,字典,集合
PDF
PDF
Python串列資料應用
PDF
Python 迴圈作業
PDF
Python分支作業
PDF
Python基本資料運算
PDF
建置Python開發環境
PDF
micro:bit加速度感測應用
PDF
C語言檔案處理
PDF
C語言列舉與聯合
mbot2.0教學-陀螺儀與三軸加速計應用.pdf
mbot2.0教學-使用makeblock雲服務.pdf
mbot2.0教學-局域網路傳輸應用.pdf
mbot2.0教學-四路顏色感測器應用.pdf
mbot2.0教學-聲光控制應用.pdf
mbot2.0教學-光感測器與LED應用.pdf
mbot2.0教學-超音波感測應用.pdf
mbot2.0教學-移動控制.pdf
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdf
mbot2.0教學-組裝與測試.pdf
Python元組,字典,集合
Python串列資料應用
Python 迴圈作業
Python分支作業
Python基本資料運算
建置Python開發環境
micro:bit加速度感測應用
C語言檔案處理
C語言列舉與聯合

Unity遊戲程式設計 - 2D運動與碰撞處理I