昨天我們製作完了水管和地板的移動,以及隨機生成位置不同的水管。今天,我們要來製作計分機制還有 GameOver 的機制
GameManager
腳本關於這個遊戲所有計分、遊戲是否繼續等等的問題,我們創建一個 GameManager.cs
的腳本來負責這個事情,在場景中創建一個空物件(Create Empty),把 GameManager.cs
掛在 Component 中。
// GameManager.cs
using UnityEngine;
public class GameManager : MonoBehaviour
{
public int score = 0;
public bool isGameOver = false;
public void AddScore()
{
score++;
}
public void SetGameOver()
{
isGameOver = true;
}
}
腳本很簡單,設置了兩個 public 變數,分別是玩家分數和是否結束遊戲的布林值,還建立了兩個函式供外部使用。
我們要偵測小鳥與水管之間的碰撞,用於停止遊戲。還要偵測小鳥與兩個水管之間的被設為 Trigger 的 Box Collider 碰撞,用於玩家加分。
在 Prefab 中設定 Tubes 的標籤為
Tube
Bird.cs
內加入碰撞偵測的程式碼// Bird.cs
using UnityEngine;
public class Bird : MonoBehaviour
{
[SerializeField] private Rigidbody rb;
[SerializeField] private float jumpForce;
[SerializeField] private Animator birdAnimator;
[SerializeField] private GameManager gamemanager;
private void FixedUpdate()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.velocity = Vector3.up * jumpForce;
}
if (rb.velocity.y > 0)
{
birdAnimator.SetBool("isFly", true);
}
else
{
birdAnimator.SetBool("isFly", false);
}
}
private void OnTriggerEnter(Collider colliderInfo)
{
if(colliderInfo.CompareTag("Tube"))
{
gamemanager.AddScore();
}
}
private void OnCollisionEnter(Collision colliderInfo)
{
gamemanager.SetGameOver();
}
}
最尾巴新增的 OnTriggerEnter
是拿來偵測是否與水管中間的 Trigger (觸發器)發生碰撞,我們偵測如果腳色發生碰撞的物件標籤是 Tube
,就呼叫加分函式。而 OnCollisionEnter
則是偵測如果與上下兩根水管發生碰撞就呼叫遊戲結束的函式。
中間的是 Trigger(觸發器),只能使用
OnTriggerEnter()
進行偵測
上下兩個是 Collider (碰撞器),只能使用OnCollisionEnter()
進行偵測
接下來一樣在 Bird.cs
中加入這一小段,用於檢測是否需要繼續遊戲
// Bird.cs
using UnityEngine;
public class Bird : MonoBehaviour
{
// ... //
private void FixedUpdate()
{
if(FindObjectOfType<GameManager>().isGameOver) return;
// ... //
如果 isGameOver
被設為 true
就 return
,下面的程式碼都不再會被執行到
同樣的程式我們也需要加到 Tube.cs
, Floor.cs
, TubeSpawner.cs
裡面。當遊戲停止時,這幾個腳本也要停止運作。
這樣我們在遊戲中碰到水管時,玩家將無法繼續操控小鳥向上飛,地板、和水管也會停止移動和生成。
今天製作了 GameOver 還有計算分數的機制。明天,我們要來加入一些 UI 介面和音效來讓遊戲玩起來更生動!