iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0

思考技能要怎麼使用

前幾天已經完成道具的生成,今天開始思考要怎麼讓收集到的羽毛真正派上用場。
目前的想法是收集到 3 根羽毛後,可以解鎖使用技能,因此需要先製作一個技能按鈕,讓玩家知道目前技能是否可以使用。
今天主要先處理按鈕本身的操作方式,暫時還不會加入羽毛數量的判定。

我希望技能按鈕可以有兩種狀態:

  • 尚未解鎖時,顯示灰色圖案。
  • 收集足夠羽毛後,切換成亮色圖案。
  • 尚未解鎖時,點擊技能按鈕也不會影響玩家正常跳躍。

讓技能按鈕可以正常操作

這次先請 Gemini 協助我製作按鈕的控制程式。
一開始原本想直接利用顏色來區分技能是否解鎖,不過後來想到技能圖案之後會自己繪製,因此改成讓程式直接切換不同的 Sprite。
這樣之後只需要把自己畫好的「未解鎖圖案」和「已解鎖圖案」放進 Unity,就可以根據技能狀態進行切換。

using UnityEngine;
using UnityEngine.UI; // 記得引入 UI 命名空間

public class PlayerControl : MonoBehaviour
{
    [Header("飛行設定")]
    public float flyForce = 5f;
    private Rigidbody2D rb;

    [Header("技能按鈕 UI 設定")]
    [Tooltip("將 Canvas 上的 SkillButton 拖入此欄位")]
    public Button skillButton;

    [Tooltip("技能按鈕的 Image 組件(若不拉,程式會自動抓取)")]
    public Image skillButtonImage;

    [Header("技能圖案(Sprite)設定")]
    [Tooltip("拖入你自己畫的:灰色/未解鎖圖案")]
    public Sprite skillDisabledSprite;

    [Tooltip("拖入你自己畫的:亮色/已解鎖圖案")]
    public Sprite skillReadySprite;

    [Header("技能狀態")]
    [Tooltip("技能是否解鎖(明天會跟道具數量連動,今天先保持 false)")]
    public bool isSkillReady = false;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();

        // 如果 Inspector 沒拉 Image,自動抓取按鈕上的 Image
        if (skillButton != null && skillButtonImage == null)
        {
            skillButtonImage = skillButton.GetComponent<Image>();
        }

        // 初始化技能按鈕圖案(今天預設先設為未解鎖/灰色圖案)
        SetSkillReady(isSkillReady);
    }

    void Update()
    {
        // 電腦端鍵盤跳躍
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Fly();
        }
    }

    // 1. 普通跳躍按鈕點擊呼叫
    public void OnJumpButtonClick()
    {
        Fly();
    }

    // 2. 技能按鈕點擊呼叫
    public void OnSkillButtonClick()
    {
        if (isSkillReady)
        {
            // 已解鎖(亮色圖案):發動衝刺大招
            UseSkill();
        }
        else
        {
            // 未解鎖(灰色圖案):點擊依然可以起飛/跳躍!
            Fly();
        }
    }

    // 執行起飛
    public void Fly()
    {
        if (rb != null)
        {
            rb.velocity = Vector2.up * flyForce;
        }
    }

    // 執行技能大招
    public void UseSkill()
    {
        Debug.Log("【發動技能】大招衝刺!");
        
        // 技能使用後重置為未解鎖(換回灰色圖案),等待明天跟道具數量連動
        SetSkillReady(false);
    }

    // 【核心切換方法】:直接替換技能按鈕的 Sprite 圖案
    public void SetSkillReady(bool ready)
    {
        isSkillReady = ready;

        if (skillButtonImage != null)
        {
            // ready 為 true 切換成亮色圖,false 切換成灰色圖
            if (ready && skillReadySprite != null)
            {
                skillButtonImage.sprite = skillReadySprite;
            }
            else if (!ready && skillDisabledSprite != null)
            {
                skillButtonImage.sprite = skillDisabledSprite;
            }
        }
    }
}

這次主要修改的是技能按鈕的狀態切換。
skillDisabledSprite 和 skillReadySprite 分別代表尚未解鎖與已解鎖的技能圖案,之後只要改變 isSkillReady,就可以讓按鈕切換成對應的圖片。
另外,我希望即使技能還沒有解鎖,玩家點擊這個按鈕時仍然可以控制小鳥飛行,不會因為技能按鈕擋在那裡,誤觸後導致小鳥無法飛起來而墜落。

第十天的成果

今天主要是先把技能按鈕的基本架構建立起來。
這次先提出自己想要的操作方式,再請 Gemini 協助修改 C# 程式,讓技能按鈕可以根據狀態切換不同的 Sprite。
目前技能還沒有和羽毛數量連動,這部分預計明天再繼續製作。


上一篇
Day 9|讓道具生成位置避開障礙物
下一篇
Day 11|開始製作遊戲道具素材
系列文
從基礎到實作:使用 Google AI 學習程式設計 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言