SlideShare a Scribd company logo
1 of 21
Download to read offline
Rolling Ball遊戲
Revised on March 12, 2020
⼀款透過傾斜⽊板來滾動圓球收集
寶物的3D小品遊戲
 使用3D遊戲物件
 ⽊板傾斜控制
 碰撞處理
 計分與顯示
 動態物件與靜態物件之碰撞處理
 新增3D專案
 選單命令File> New Project…
 專案名稱Rolling Ball
 滙入遊戲資源
 選單命令Assets> Import Package> Custom Package…,滙入roll a
ball.unitypackage
 儲存預設場景
 MiniGame.unity
專案設定
2
 選取Directional Light
 Rotation(X, Y, Z) = (50, 60, 0)
 Intensity = 1.5
 選單命令GameObject> 3D Object> Cube,命名為Board
 重置Transform
 Position(X, Y, Z) = (0, -0.1, 0)
 Scale(X, Y, Z) = (20, 0.2, 20)
 在Board物件套用BG.mat材質
建立場景
3
 選取Main Camera
 Position(X, Y, Z) = (0, 8, -22)
 Rotation(X, Y, Z) = (6, 0, 0)
調整攝影機
4
 選單命令GameObject> 3D Object> Sphere,命名為Ball
 重置Transform屬性
 Position(X, Y, Z) = (0, 0.75, 0)
 Scale(X, Y, Z) = (1.5, 1.5, 1.5)
 在Ball物件套用Orange.mat材質
建立玩家物件 1/2
5
 在Ball加入Rigidbody元件
 在Ball加入BallController程式腳本,為Ball加上初始速度
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BallController : MonoBehaviour {
void Start() {
GetComponent<Rigidbody>().AddForce(transform.forward * 10f);
}
}
建立玩家物件 2/2
6
 在Board加入BoardController程式腳本,使用方向鍵控制⽊板傾斜
角度來滾動圓球
using System.Collections;
using UnityEngine;
public class BoardController : MonoBehaviour {
public float rollmax = 10.0f, rollmin = -10.0f;
public float pitchmax = 10.0f, pitchmin = -10.0f;
public float speed = 0.3f;
float roll = 0.0f;
float pitch = 0.0f;
void Update() {
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
roll = Mathf.Clamp(roll + moveHorizontal * speed, rollmin, rollmax);
pitch = Mathf.Clamp(pitch + moveVertical * speed, pitchmin, pitchmax);
transform.rotation = Quaternion.Euler (pitch, 0f, roll);
}
}
 測試遊戲,可使用方向鍵操作Board傾斜方向
木板傾斜控制
7
 選單命令GameObject> 3D Object> Cube,命名為West Wall
 重置Transform
 Position(X, Y, Z) = (-10, 0.5, 0)
 Scale(X, Y, Z) = (0.2, 1, 20)
 套用White.mat材質
 Ctrl-D複製West Wall,命名為East Wall
 Position(X, Y, Z) = (10, 0.5, 0)
 Scale(X, Y, Z) = (0.2, 1, 20)
建立遊戲邊界 1/3
8
 Ctrl-D複製West Wall,命名為North Wall
 Position(X, Y, Z) = (0, 0.5, 10)
 Scale(X, Y, Z) = (20, 1, 0.2)
 Ctrl-D複製North Wall,命名為South Wall
 Position(X, Y, Z) = (0, 0.5, -10)
 Scale(X, Y, Z) = (20, 1, 0.2)
 拖曳West Wall、East Wall、North Wall、South Wall成為
Board的子物件
建立遊戲邊界 2/3
9
 測試遊戲,Ball不會滾出邊界
建立遊戲邊界 3/3
10
 拖曳Diamond到場景
 Position(X, Y, Z) = (-7, 1, 0)
 Rotation(X, Y, Z) = (-90, 0, 0)
 Scale(X, Y, Z) = (0.5, 0.5, 0.5)
 Tag = "Pick Up"
 套用Blue.mat材質
加入道具物件 1/4
11
 在Diamond加入Capsule Collider
 Center(X, Y, Z) = (0, 0, -0.7)
 Radius = 1.2
 Height = 2.5
 Direction = Z-Axis
 勾選Is Trigger
加入道具物件 2/4
12
 在Diamond加入Rotate程式腳本,讓Diamond物件自轉
using UnityEngine;
using System.Collections;
public class Rotate : MonoBehaviour {
void Update () {
transform.Rotate (new Vector3 (0, 0, 45) * Time.deltaTime);
}
}
加入道具物件 3/4
13
 切換到X-Z視角
 複製11個Diamond圍成圓圏
 拖曳全部Diamond成為Board的子物件
加入道具物件 4/4
14
 修改BallController程式腳本,加入碰撞處理
using UnityEngine;
using System.Collections;
public class BallController : MonoBehaviour {
...
void OnTriggerEnter(Collider other) {
if (other.gameObject.CompareTag ("Pick Up")) {
other.gameObject.SetActive (false);
}
}
}
 測試遊戲,Diamond物件被Ball碰到時就會消失
收集道具
15
 選單命令GameObject> UI> Text,命名為Count Text
 Anchor Presets = top, left
 Pos(X, Y) = (0, 0)
 Width = 300, Height = 100
 Pivot(X, Y) = (0, 1)
 Text = Count Text
 Character/Font Size = 28
 Paragraph/Alignment = Center
 Color = white
顯示分數 1/5
16
 選單命令GameObject> UI> Text,命名為Win Text
 Anchor Presets = middle, center
 Pos(X, Y) = (0, 0)
 Width = 300, Height = 100
 Pivot(X, Y) = (0.5, 0.5)
 Text = Win Text
 Character/Font Size = 28
 Paragraph/Alignment = Center
 Color = Red
顯示分數 2/5
17
 修改BoardController程式腳本,加入記分處理
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class BoardController : MonoBehaviour {
public Text countText;
public Text winText;
private int count;
void Start () {
GetComponent<Rigidbody>().AddForce(transform.forward * 10f);
count = 0;
SetCountText ();
winText.text = "";
}
顯示分數 3/5
18
void OnTriggerEnter(Collider other) {
if (other.gameObject.CompareTag ("Pick Up")) {
other.gameObject.SetActive (false);
count = count + 1;
SetCountText ();
}
}
void SetCountText () {
countText.text = "Count: " + count.ToString ();
if (count >= 12) {
winText.text = "You Win!";
}
}
}
顯示分數 4/5
19
 拖曳Count Text到PlayerController之Count Text欄
 拖曳Win Text到PlayerController之Win Text欄
 測試遊戲,每收集⼀個Diamond物件,分數加1;收集全部Diamond物
件後,顯示"You Win!"
顯示分數 5/5
20
 Unity將任何帶有碰撞器和剛體的物件歸類為動態物件。而具有碰撞
器但沒有物理剛體的物件歸類為靜態物件
 為了性能最佳化,Unity會計算場景中所有靜態碰撞器的材積,並將
此資訊保存在快取中,這樣可以節省每幀重新計算靜態碰撞資訊的時
間。至於動態碰撞器,我們可以根據需要隨時移動、旋轉或縮放,
Unity不會記錄任何碰撞器材積
 但⼀旦靜態物件移動、旋轉或縮放時,Unity就會重新計算並更新靜
態碰撞器快取,重新計算作業較耗費資源
 目前Diamond物件具有Capsule Collider,但沒有剛體。Rotation
程式腳本會使Diamond物件旋轉,所以Unity每幀會重新計算我們的
靜態碰撞器快取。解決方案是為Diamond物件添加剛體,使Diamond
成為動態物件
靜態物件的碰撞處理
21

More Related Content

What's hot

What's hot (12)

Unity遊戲程式設計 - 2D 物理關節應用
Unity遊戲程式設計 - 2D 物理關節應用Unity遊戲程式設計 - 2D 物理關節應用
Unity遊戲程式設計 - 2D 物理關節應用
 
Unity遊戲程式設計(01) Unity簡介
Unity遊戲程式設計(01) Unity簡介Unity遊戲程式設計(01) Unity簡介
Unity遊戲程式設計(01) Unity簡介
 
Unity遊戲程式設計 - 2D粒子特效應用
Unity遊戲程式設計 - 2D粒子特效應用Unity遊戲程式設計 - 2D粒子特效應用
Unity遊戲程式設計 - 2D粒子特效應用
 
Unity遊戲設計- 2D動畫製作及應用
Unity遊戲設計-  2D動畫製作及應用Unity遊戲設計-  2D動畫製作及應用
Unity遊戲設計- 2D動畫製作及應用
 
Unity遊戲程式設計 - 材質與貼圖
Unity遊戲程式設計 - 材質與貼圖Unity遊戲程式設計 - 材質與貼圖
Unity遊戲程式設計 - 材質與貼圖
 
Unity遊戲程式設計(11) 創建遊戲地形
Unity遊戲程式設計(11) 創建遊戲地形Unity遊戲程式設計(11) 創建遊戲地形
Unity遊戲程式設計(11) 創建遊戲地形
 
Vuforia AR 同時追踨多張辨識圖
Vuforia AR同時追踨多張辨識圖Vuforia AR同時追踨多張辨識圖
Vuforia AR 同時追踨多張辨識圖
 
Vuforia AR影片程式設計
Vuforia AR影片程式設計 Vuforia AR影片程式設計
Vuforia AR影片程式設計
 
Unity遊戲程式設計 - 應用Sprite物件
Unity遊戲程式設計 - 應用Sprite物件Unity遊戲程式設計 - 應用Sprite物件
Unity遊戲程式設計 - 應用Sprite物件
 
Unity遊戲程式設計(02) 應用2D圖片物件
Unity遊戲程式設計(02) 應用2D圖片物件Unity遊戲程式設計(02) 應用2D圖片物件
Unity遊戲程式設計(02) 應用2D圖片物件
 
2 151210110400
2 1512101104002 151210110400
2 151210110400
 
Unity遊戲程式設計 - 2D運動與碰撞處理I
Unity遊戲程式設計 - 2D運動與碰撞處理IUnity遊戲程式設計 - 2D運動與碰撞處理I
Unity遊戲程式設計 - 2D運動與碰撞處理I
 

More from 吳錫修 (ShyiShiou Wu)

mbot2.0教學-陀螺儀與三軸加速計應用.pdf
mbot2.0教學-陀螺儀與三軸加速計應用.pdfmbot2.0教學-陀螺儀與三軸加速計應用.pdf
mbot2.0教學-陀螺儀與三軸加速計應用.pdf吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-四路顏色感測器應用.pdf
mbot2.0教學-四路顏色感測器應用.pdfmbot2.0教學-四路顏色感測器應用.pdf
mbot2.0教學-四路顏色感測器應用.pdf吳錫修 (ShyiShiou Wu)
 
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdf
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdfmbot2.0教學-mblock5開發mBot 2.0應用程式.pdf
mbot2.0教學-mblock5開發mBot 2.0應用程式.pdf吳錫修 (ShyiShiou Wu)
 

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

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

Unity遊戲程式設計 - Roll a ball遊戲