製作好依照分數提升難度的功能,今天就能回來做技能效果了。
前幾天已經完成技能的解鎖圖片,當玩家擊殺數達到50時,技能圖片就會亮起。不過,只有圖片變化還不夠,因此今天決定先製作第一個技能,讓玩家可以消耗擊殺數,一次清除畫面上所有的目標。
首先修改原本的ScoreManager,除了紀錄總分與擊殺數之外,也加入技能的使用條件。
這次的技能需要消耗50點擊殺數。當玩家使用技能時,會先扣除對應的擊殺數,並將技能圖片恢復成暗版,表示技能尚未再次解鎖。
using UnityEngine;
using UnityEngine.UI;
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
[Header("技能設定 (清全場) - 50 殺")]
public Image skillImage; // 左下角的技能 Image 元件
public Sprite darkSkillSprite; // 未解鎖或冷卻中的【暗版圖片】
public Sprite readySkillSprite; // 滿 50 殺解鎖後的【亮版圖片】
public int skillThreshold = 50; // 解鎖門檻(50 殺)
private bool isSkillUnlocked = false; // 是否已解鎖標記
private void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
}
private void Start()
{
// 開局預設顯示暗版圖片
if (skillImage != null && darkSkillSprite != null)
{
skillImage.sprite = darkSkillSprite;
}
UpdateUI();
}
public void AddScore(int amount)
{
totalScore += amount;
killedZombieCount += 1;
CheckSkillUnlock();
UpdateUI();
}
private void CheckSkillUnlock()
{
if (!isSkillUnlocked && killedZombieCount >= skillThreshold)
{
isSkillUnlocked = true;
// 切換為亮版圖片
if (skillImage != null && readySkillSprite != null)
{
skillImage.sprite = readySkillSprite;
}
Debug.Log("技能已解鎖!點亮清場技能!");
}
}
// 施放技能:扣除 50 殺並重置圖標為暗版
public bool UseSkill()
{
if (killedZombieCount >= skillThreshold)
{
killedZombieCount -= skillThreshold; // 扣除消耗的擊殺數
isSkillUnlocked = false;
// 恢復為暗版圖片
if (skillImage != null && darkSkillSprite != null)
{
skillImage.sprite = darkSkillSprite;
}
UpdateUI();
return true;
}
return false;
}
private void UpdateUI()
{
if (scoreText != null) scoreText.text = $"Score: {totalScore}";
if (countText != null) countText.text = $"Zombies: {killedZombieCount}";
}
}
接著新增SkillManager,專門負責處理技能的使用。
當玩家點擊技能按鈕時,會先呼叫ScoreManager檢查擊殺數是否足夠。如果成功扣除50點擊殺數,就會尋找場上所有的Target,再逐一呼叫清除目標的方法。
using System.Collections;
using UnityEngine;
public class SkillManager : MonoBehaviour
{
public static SkillManager Instance;
private void Awake()
{
if (Instance == null) Instance = this;
else Destroy(gameObject);
}
// 點擊按鈕時呼叫此方法
public void TriggerClearScreenSkill()
{
// 嘗試向 ScoreManager 扣除 50 殺,成功才發動技能
if (ScoreManager.Instance != null && ScoreManager.Instance.UseSkill())
{
// 抓出場上所有的 Target(殭屍)
Target[] allTargets = FindObjectsOfType<Target>();
foreach (Target target in allTargets)
{
if (target != null)
{
// 強制觸發每一隻殭屍的技能清場死亡(算分、算擊殺數並銷毀)
target.ForceKillBySkill();
}
}
Debug.Log("【大招發動】全螢幕轟炸清場!");
}
else
{
Debug.Log("擊殺數不足 50,無法施放技能!");
}
}
}
這樣一來,技能按鈕就能透過SkillManager執行清場效果。如果擊殺數不足50,就不會發動技能;達到條件後,便能一次清除場上的目標。
如果技能只是把殭屍全部消除,卻沒有增加分數與擊殺數,那麼玩家使用技能時反而會失去擊殺殭屍的收益。
因此,我在原本的Target程式中新增ForceKillBySkill(),讓技能消滅全部目標時,也會按照該目標的設定獲得分數,並增加擊殺數。
以下是新增的程式碼:
// 被大招清場時調用(算分、累計擊殺數並銷毀)
public void ForceKillBySkill()
{
if (isDefeated) return;
isDefeated = true;
if (targetRoutine != null)
{
StopCoroutine(targetRoutine);
}
// 結算該殭屍對應的分數與擊殺數
if (ScoreManager.Instance != null)
{
ScoreManager.Instance.AddScore(scoreValue);
}
Destroy(gameObject);
}
今天完成了以下功能: