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