昨天主要花時間製作了遊戲素材,今天就回到程式部分。
前幾天已經完成羽毛的生成,也製作好了技能按鈕,但當時兩者還沒有真正連在一起。
所以今天想先完成一個簡單的收集系統:
原本只有技能按鈕的灰色與亮色Sprite,這次再增加三個羽毛UI Image,分別代表三個羽毛的收集進度。
一開始三個羽毛都是暗色圖片,當玩家收集到羽毛後,就按照收集數量依序替換成亮色圖片。
例如:
using UnityEngine;
using UnityEngine.UI;
public class PlayerControl : MonoBehaviour
{
[Header("飛行設定")]
public float flyForce = 5f;
private Rigidbody2D rb;
[Header("羽毛 UI 圖片設定")]
[Tooltip("將左上角的 3 個 UI Image 依序拉進來")]
public Image[] featherUIImages;
[Tooltip("暗色羽毛 Sprite")]
public Sprite featherDarkSprite;
[Tooltip("亮色羽毛 Sprite")]
public Sprite featherLightSprite;
[Header("技能按鈕 UI 設定")]
public Button skillButton;
public Image skillButtonImage;
public Sprite skillDisabledSprite; // 灰色技能按鈕
public Sprite skillReadySprite; // 亮色技能按鈕
[Header("目前收集進度")]
public int currentFeathers = 0;
public int maxFeathers = 3;
public bool isSkillReady = false;
void Start()
{
rb = GetComponent<Rigidbody2D>();
if (skillButton != null && skillButtonImage == null)
{
skillButtonImage = skillButton.GetComponent<Image>();
}
// 初始化:羽毛全暗、技能灰色
ResetFeathersUI();
SetSkillReady(false);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Fly();
}
}
// 觸發碰撞檢測:吃到羽毛道具
private void OnTriggerEnter2D(Collider2D collision)
{
// 檢查碰撞對象的 Tag 是否為 Feather(或 Item)
if (collision.CompareTag("Feather") || collision.CompareTag("Item"))
{
CollectFeather();
Destroy(collision.gameObject); // 讓場上的羽毛道具消失
}
}
// 收集羽毛邏輯
public void CollectFeather()
{
if (currentFeathers < maxFeathers)
{
currentFeathers++;
UpdateFeathersUI();
// 集滿 3 根,技能亮起來!
if (currentFeathers >= maxFeathers)
{
SetSkillReady(true);
}
}
}
// 更新左上角羽毛 UI 圖片
void UpdateFeathersUI()
{
for (int i = 0; i < featherUIImages.Length; i++)
{
if (i < currentFeathers)
{
// 已收集到的格數 -> 換成亮色圖片
featherUIImages[i].sprite = featherLightSprite;
}
else
{
// 未收集到的格數 -> 保持暗色圖片
featherUIImages[i].sprite = featherDarkSprite;
}
}
}
// 重置左上角羽毛 UI 為全暗
void ResetFeathersUI()
{
currentFeathers = 0;
UpdateFeathersUI();
}
// UI 跳躍按鈕
public void OnJumpButtonClick()
{
Fly();
}
// UI 技能按鈕點擊
public void OnSkillButtonClick()
{
if (isSkillReady)
{
UseSkill();
}
else
{
Fly(); // 未解鎖時點按依然起飛
}
}
public void Fly()
{
if (rb != null)
{
rb.velocity = Vector2.up * flyForce;
}
}
// 發動衝刺大招
public void UseSkill()
{
Debug.Log("【發動技能】衝刺!");
// 這裡可加衝刺效果,例如給予瞬間向右/向上的大力量:
// rb.velocity = new Vector2(rb.velocity.x, flyForce * 1.8f);
// 使用完技能後,羽毛重置歸零,技能變回灰色
ResetFeathersUI();
SetSkillReady(false);
}
// 切換技能按鈕狀態與圖片
public void SetSkillReady(bool ready)
{
isSkillReady = ready;
if (skillButtonImage != null)
{
if (ready && skillReadySprite != null)
{
skillButtonImage.sprite = skillReadySprite;
}
else if (!ready && skillDisabledSprite != null)
{
skillButtonImage.sprite = skillDisabledSprite;
}
}
}
}
這次的重點主要是currentFeathers和UpdateFeathersUI()。
每次取得羽毛時,currentFeathers 就會增加,接著依照目前的數量,把對應的羽毛 UI 替換成亮色Sprite。
當數量達到maxFeathers的3根時,就會呼叫SetSkillReady(true),讓技能按鈕也從未解鎖圖片切換成已解鎖圖片。
當三根羽毛都收集完成後,技能按鈕就可以使用。
目前技能本身還只是先用 Debug.Log 來測試,真正的衝刺效果還沒有加入。
使用技能後,會把羽毛數量重新歸零,三個羽毛圖示恢復暗色,技能按鈕也重新變回灰色,讓玩家可以再次開始收集三根羽毛。
接下來應該會繼續處理遊戲圖片與技能效果,畢竟我的想法是鳥要會隱身,因此會先嘗試製作半透明的效果,之後再處理使用技能時關閉鳥的碰撞,並讓鳥的移動速度增加。
今天主要是把前幾天製作的羽毛、UI 和技能按鈕真正連接起來。
現在玩家收集羽毛後,左上角的暗色羽毛會依序替換成亮色圖片,收集滿三根後,技能按鈕也會替換成亮色圖片。
使用技能後,羽毛數量和技能狀態則會重新歸零。
這次也是繼續把之前已經完成的功能慢慢串在一起,而不是重新製作一套系統。