iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
自我挑戰組

Unity入門遊戲開發與實作系列 第 26

【Day 26】經典 Flappy Birds 遊戲實作(四)計分和 GameOver 機制

  • 分享至 

  • xImage
  •  

昨天我們製作完了水管和地板的移動,以及隨機生成位置不同的水管。今天,我們要來製作計分機制還有 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 變數,分別是玩家分數和是否結束遊戲的布林值,還建立了兩個函式供外部使用。

腳色的碰撞偵測

我們要偵測小鳥與水管之間的碰撞,用於停止遊戲。還要偵測小鳥與兩個水管之間的被設為 TriggerBox Collider 碰撞,用於玩家加分。

  • 我們需要先把所有的水管都加上 Tag ,好讓程式偵測 Tag 就知道我們撞到了什麼
    https://ithelp.ithome.com.tw/upload/images/20241010/201693015WrqTXM7W4.png

    在 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 則是偵測如果與上下兩根水管發生碰撞就呼叫遊戲結束的函式。
https://ithelp.ithome.com.tw/upload/images/20241010/20169301St18GUJ5Lg.png

中間的是 Trigger(觸發器),只能使用 OnTriggerEnter() 進行偵測
上下兩個是 Collider (碰撞器),只能使用 OnCollisionEnter() 進行偵測

接下來一樣在 Bird.cs 中加入這一小段,用於檢測是否需要繼續遊戲

// Bird.cs
using UnityEngine;

public class Bird : MonoBehaviour
{
// ... //
    private void FixedUpdate()
    {
        if(FindObjectOfType<GameManager>().isGameOver) return;
        // ... //

如果 isGameOver 被設為 truereturn ,下面的程式碼都不再會被執行到
同樣的程式我們也需要加到 Tube.cs, Floor.cs, TubeSpawner.cs 裡面。當遊戲停止時,這幾個腳本也要停止運作。
這樣我們在遊戲中碰到水管時,玩家將無法繼續操控小鳥向上飛,地板、和水管也會停止移動和生成。

今天製作了 GameOver 還有計算分數的機制。明天,我們要來加入一些 UI 介面和音效來讓遊戲玩起來更生動!


上一篇
【Day 25】經典 Flappy Birds 遊戲實作(三)水管隨機生成和場景移動
下一篇
【Day 27】經典 Flappy Birds 遊戲實作(五)getReady 跟分數的 UI 動畫和遊戲音效
系列文
Unity入門遊戲開發與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言