狠狠撸

狠狠撸Share a Scribd company logo
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

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