iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0
Build on Google AI

從基礎到實作:使用 Google AI 學習程式設計系列 第 12 篇

Day 12|讓收集羽毛與技能按鈕連動

  • 分享至 

  • xImage
  •  

昨天主要花時間製作了遊戲素材,今天就回到程式部分。
前幾天已經完成羽毛的生成,也製作好了技能按鈕,但當時兩者還沒有真正連在一起。

所以今天想先完成一個簡單的收集系統:

  • 收集羽毛後,左上角的羽毛圖示會亮起。
  • 每收集一根,就亮起一個羽毛圖示。
  • 收集滿三根後,技能按鈕會亮起。
  • 使用技能後,羽毛數量歸零,技能按鈕也恢復未解鎖狀態。

讓收集到的羽毛顯示出來

原本只有技能按鈕的灰色與亮色Sprite,這次再增加三個羽毛UI Image,分別代表三個羽毛的收集進度。
一開始三個羽毛都是暗色圖片,當玩家收集到羽毛後,就按照收集數量依序替換成亮色圖片。

例如:

  • 0 根:○ ○ ○
  • 1 根:● ○ ○
  • 2 根:● ● ○
  • 3 根:● ● ●
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 和技能按鈕真正連接起來。
現在玩家收集羽毛後,左上角的暗色羽毛會依序替換成亮色圖片,收集滿三根後,技能按鈕也會替換成亮色圖片。
使用技能後,羽毛數量和技能狀態則會重新歸零。
這次也是繼續把之前已經完成的功能慢慢串在一起,而不是重新製作一套系統。


上一篇
Day 11|開始製作遊戲道具素材
下一篇
Day 13|製作技能效果(碰到障礙物跳過死亡判定)
系列文
從基礎到實作:使用 Google AI 學習程式設計 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言