iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0

由於臨時想不出地鼠怎麼畫,所以我就改用《植物大戰殭屍》的殭屍素材,所以程式碼的命名也隨之改變,這點就請見諒。
昨天完成了不同類型的目標,讓不同的目標可以擁有不同的血量與戰損效果。既然現在已經有不同類型的目標,今天就開始製作分數系統,讓玩家成功擊殺目標後可以獲得分數,同時也記錄總共擊殺了多少隻。
至於為何還要多計算擊殺幾隻?一方面是好讓我決定之後更改生成時,好讓我去計算怎麼調整比較合理,另一方面是想新增技能系統,花費擊殺數能開不同價格的技能。

建立分數管理

首先新增ScoreManager,負責管理遊戲中的總分與擊殺數。
目前每擊殺一隻殭屍,就會增加一次擊殺數,而獲得多少分則會由殭屍本身的 scoreValue 決定。
另外也加入了TextMeshPro,讓分數與擊殺數可以直接顯示在遊戲畫面上。

using UnityEngine;
using TMPro;

public class ScoreManager : MonoBehaviour
{
    public static ScoreManager Instance;

    [Header("數據紀錄")]
    public int totalScore = 0;      // 總得分
    public int killedZombieCount = 0; // 擊殺總隻數

    [Header("UI 顯示元件")]
    public TextMeshProUGUI scoreText; // 顯示總得分的 Text
    public TextMeshProUGUI countText; // 顯示擊殺數的 Text

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void Start()
    {
        UpdateUI();
    }

    // 增加分數與擊殺數的方法
    public void AddScore(int amount)
    {
        totalScore += amount;
        killedZombieCount += 1;
        UpdateUI();
    }

    // 更新 UI 畫面
    private void UpdateUI()
    {
        if (scoreText != null) scoreText.text = $"Score: {totalScore}";
        if (countText != null) countText.text = $"Zombies: {killedZombieCount}";
    }
}

讓殭屍擊殺後獲得分數

建立分數管理後,接著修改原本的Target程式(原Mole)。
這次在目標的基本屬性中加入scoreValue,讓不同種類的目標可以設定不同的分數。
當currentHp歸零並成功擊殺目標時,就會呼叫ScoreManager的AddScore(),將這次擊殺的分數加入總分。

using System.Collections;
using UnityEngine;

public class Target : MonoBehaviour
{
    [Header("目標基本屬性")]
    public int maxHp = 1;              
    protected int currentHp;           

    [Header("分數設定")]
    public int scoreValue = 50;        // 預設 1 滴血為 50 分

    [Header("移動與時間設定")]
    public float riseDistance = 1.2f;  
    public float speed = 5f;           
    public float showDuration = 1.0f;  

    private Vector3 startPos;
    private Vector3 targetPos;
    private bool isDefeated = false;   
    private Coroutine targetRoutine;   

    private void Start()
    {
        currentHp = maxHp;
        startPos = transform.position;
        targetPos = startPos + new Vector3(0, riseDistance, 0);

        targetRoutine = StartCoroutine(TargetRoutine());
    }

    private IEnumerator TargetRoutine()
    {
        while (Vector3.Distance(transform.position, targetPos) > 0.01f)
        {
            transform.position = Vector3.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);
            yield return null;
        }
        transform.position = targetPos;

        yield return new WaitForSeconds(showDuration);

        while (Vector3.Distance(transform.position, startPos) > 0.01f)
        {
            transform.position = Vector3.MoveTowards(transform.position, startPos, speed * Time.deltaTime);
            yield return null;
        }
        transform.position = startPos;

        if (HealthManager.Instance != null)
        {
            HealthManager.Instance.TakeDamage();
        }

        Destroy(gameObject);
    }

    public virtual void OnHit()
    {
        if (isDefeated) return;

        currentHp--;

        if (currentHp <= 0)
        {
            isDefeated = true;

            if (targetRoutine != null)
            {
                StopCoroutine(targetRoutine);
            }

            // 成功擊殺!觸發加分與紀錄擊殺數
            if (ScoreManager.Instance != null)
            {
                ScoreManager.Instance.AddScore(scoreValue);
            }

            Debug.Log($"擊殺目標!獲得 {scoreValue} 分");
            Destroy(gameObject);
        }
    }
}

不同殭屍給予不同分數

有了scoreValue之後,就可以直接在Unity Inspector裡調整每種殭屍的分數。例如普通殭屍可以設定50分,而血量比較高、比較難擊殺的殭屍則可以設定更高的分數。
這樣就不用為每一種殭屍另外寫一套加分程式,只需要調整各自的scoreValue即可。

第二十二天的成果與之後目標

今天主要完成了以下幾個部分:

  • 分數系統:玩家成功擊殺殭屍後可以獲得分數。
  • 擊殺紀錄:記錄玩家總共擊殺了多少隻殭屍。
  • 分數顯示:將目前分數與擊殺數顯示在遊戲畫面上。
  • 不同分數:每種殭屍可以設定不同的scoreValue。
    目前遊戲已經有血量、不同類型的目標以及基本的分數系統。
    接下來除了繼續完善遊戲內容,也可以開始思考之後的技能系統,讓擊殺數不只是單純的紀錄,而是能夠真正成為遊戲中的資源。

上一篇
Day 21|製作不同類型的目標
下一篇
Day 23|依照分數逐漸加入不同目標
系列文
從基礎到實作:使用 Google AI 學習程式設計 共 24 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言