iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0

第二種道具的由來

只有一種道具我認為有一點單調,所以構想的時候已經有想第二種道具,就是能隱身的道具,由於跟技能一樣都是有無視死亡碰撞的效果,因此我希望它不要比技能還強,所以設定成碰到道具後直接觸發,持續 5 秒,不像技能需要先收集三根羽毛才能使用。

新增玉米道具

首先在遊戲中加入玉米道具,並將它設定成 Corn Tag。
當小鳥碰到玉米時,就會呼叫 EatCorn(),同時將場上的玉米刪除。

private void OnTriggerEnter2D(Collider2D collision)
{
    if (isDead) return;

    // 1. 吃到羽毛或一般道具
    if (collision.CompareTag("Feather") || collision.CompareTag("Item"))
    {
        CollectFeather();
        Destroy(collision.gameObject);
    }
    // 2. 吃到玉米道具
    else if (collision.CompareTag("Corn"))
    {
        EatCorn();
        Destroy(collision.gameObject);
    }
}

這樣就能讓羽毛和玉米分別執行不同的效果。

製作隱身效果

這運用到跟左上羽毛蒐集以及技能顯示一樣的功能,吃到玉米後會更換掉鳥的Sprite,達到看起來隱身的效果。
玉米的效果預計持續 5 秒,所以這次增加了cornStealthDuration來控制時間。

[Header("玉米道具設定(隱身 5 秒)")]
[Tooltip("玉米隱身持續時間")]
public float cornStealthDuration = 5f;

[Tooltip("吃到玉米時切換的隱身/特別型態 Sprite")]
public Sprite stealthBirdSprite;

為了讓效果結束後可以恢復原本的圖片,也在遊戲開始時先記錄小鳥原本的Sprite。

private Sprite originalBirdSprite;

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

    if (spriteRenderer != null)
    {
        originalBirdSprite = spriteRenderer.sprite;
    }
}

實現隱身效果

這裡用到跟技能一樣的功能,在某一段時間無視遊戲的死亡碰撞。
吃到玉米後會啟動CornStealthRoutine()。
效果開始時,先將isInvincible設定為true,讓小鳥可以無視岩石和地面的死亡碰撞,接著替換成隱身狀態的圖片。
5秒後再恢復原本的圖片與碰撞判定。

public void EatCorn()
{
    Debug.Log("吃到玉米!啟動 5 秒隱身與無敵!");

    // 若已有舊的隱身效果正在執行,先停止它
    if (stealthCoroutine != null)
    {
        StopCoroutine(stealthCoroutine);
    }

    stealthCoroutine = StartCoroutine(CornStealthRoutine());
}

IEnumerator CornStealthRoutine()
{
    isInvincible = true;

    // 更換為隱身圖片
    if (spriteRenderer != null && stealthBirdSprite != null)
    {
        spriteRenderer.sprite = stealthBirdSprite;
    }

    // 持續 5 秒
    yield return new WaitForSeconds(cornStealthDuration);

    // 恢復正常狀態
    isInvincible = false;

    if (spriteRenderer != null && originalBirdSprite != null)
    {
        spriteRenderer.sprite = originalBirdSprite;
    }

    stealthCoroutine = null;
    Debug.Log("玉米隱身效果結束,恢復原樣。");
}

運用isInvincible是true,跳過死亡判定:

private void OnCollisionEnter2D(Collision2D collision)
{
    if (isInvincible) return;

    if (collision.gameObject.CompareTag("Rock") || 
        collision.gameObject.CompareTag("Ground"))
    {
        Die();
    }
}

因此目前兩種效果都可以使用同一套無敵判定:

  • 羽毛技能:3秒無敵+最高速度衝刺
  • 玉米道具:5秒隱身+無視障礙物
    兩者的主要差別就在於觸發方式和持續時間。

第十五天的成果

今天主要完成了第二種道具「玉米」的功能。
玩家吃到玉米後,小鳥會替換成隱身狀態的圖片,並在 5 秒內無視岩石與地面的死亡碰撞;效果結束後則會恢復原本的小鳥圖片與正常碰撞。
接下來會開始做分數的計算與顯示。


上一篇
Day 14|技能新增加速效果
下一篇
Day 16|製作分數計算與顯示
系列文
從基礎到實作:使用 Google AI 學習程式設計 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言