iT邦幫忙

2026 iThome 鐵人賽

DAY 7
0

改變玩法的想法

假如靠Gemini幫忙做出已有的小遊戲,就感覺沒什麼特別的。所以我打算更換障礙物,把障礙物用成隨機生成,玩法就會從控制力道鑽過縫隙,改成繞過障礙物看誰堅持最久。

更換障礙物

這次使用上下不同的岩石來當作障礙物,和之前使用一張圖片的上下水管不同,這次將上下障礙物拆成兩個不同的 Prefab,讓它們可以分開生成。
這樣之後如果想繼續增加其他不同的障礙物,也比較容易進行修改。

今天主要希望做到:

  • 上方與下方的岩石分開製作。
  • 每次生成時隨機選擇上方或下方的岩石,不會同時生成。
  • 岩石生成的位置有一些隨機變化。
  • 延續之前的速度設定,讓岩石可以跟著遊戲難度一起加速。
using UnityEngine;

public class RockSpawner : MonoBehaviour
{
    [Header("岩石 Prefab 設定")]
    [Tooltip("上方岩石 Prefab(鐘乳石/上方障礙物)")]
    public GameObject topRockPrefab;

    [Tooltip("下方岩石 Prefab(石筍/下方障礙物)")]
    public GameObject bottomRockPrefab;

    [Header("生成位置設定")]
    [Tooltip("上方岩石生成的固定 Y 座標(例如 3.5)")]
    public float topYPosition = 3.5f;

    [Tooltip("下方岩石生成的固定 Y 座標(例如 -3.5)")]
    public float bottomYPosition = -3.5f;

    [Tooltip("Y 軸位置的隨機微調幅度(讓岩石高低有些微變化)")]
    public float yOffset = 0.5f;

    [Header("生成頻率與速度")]
    [Tooltip("生成時間間隔(秒)")]
    public float spawnRate = 2f;

    [Tooltip("當前障礙物移動速度")]
    public float currentSpeed = 4f;

    [Tooltip("每次加速增加的數值")]
    public float speedIncreaseAmount = 0.8f;

    [Tooltip("加速的時間間隔(預設 30 秒)")]
    public float speedUpInterval = 30f;

    private float spawnTimer = 0f;
    private float speedTimer = 0f;

    void Start()
    {
        SpawnRock();
    }

    void Update()
    {
        // 1. 生成障礙物計時器
        spawnTimer += Time.deltaTime;
        if (spawnTimer >= spawnRate)
        {
            SpawnRock();
            spawnTimer = 0f;
        }

        // 2. 每 30 秒動態加速計時器
        speedTimer += Time.deltaTime;
        if (speedTimer >= speedUpInterval)
        {
            currentSpeed += speedIncreaseAmount;
            
            if (spawnRate > 0.8f)
            {
                spawnRate -= 0.1f;
            }

            // 更新背景與地板速度
            BackgroundRepeat[] scrollables = FindObjectsOfType<BackgroundRepeat>();
            foreach (var bg in scrollables)
            {
                bg.UpdateSpeed(currentSpeed);
            }

            speedTimer = 0f;
            Debug.Log($"【難度提升】30秒已到!目前速度加快至:{currentSpeed},生成間隔:{spawnRate} 秒");
        }
    }

    void SpawnRock()
    {
        // 【核心機制】:二選一判定(50% 機率生成上岩石,50% 機率生成下岩石)
        bool isTopRock = Random.value > 0.5f;

        GameObject prefabToSpawn = isTopRock ? topRockPrefab : bottomRockPrefab;
        
        // 根據是上還是下,決定基礎 Y 軸位置,並加上微幅隨機偏移
        float targetY = isTopRock ? topYPosition : bottomYPosition;
        targetY += Random.Range(-yOffset, yOffset);

        Vector3 spawnPosition = new Vector3(transform.position.x, targetY, 0);

        // 實例化岩石
        GameObject newRock = Instantiate(prefabToSpawn, spawnPosition, Quaternion.identity);

        // 傳遞最新速度給岩石(岩石依然掛載原本的 PipeMove.cs 即可)
        PipeMove rockMove = newRock.GetComponent<PipeMove>();
        if (rockMove != null)
        {
            rockMove.moveSpeed = currentSpeed;
        }
    }
}

這次是以數天前製作的PipeMove來做改良,因此不用為了岩石重新製作移動程式,只需要處理岩石的生成方式即可。

接下來的製作方向

目前已經完成鳥、背景與地板的移動,以及障礙物的生成,接下來會開始嘗試新增道具,可能會從AI生圖開始,畢竟這個人不太會畫畫,到時候也會分享生成出來的圖片。
之前有想到玉米、彩色羽毛以及隱形道具等,目前還是先當作構想,會等基本玩法再穩定一些後,再慢慢嘗試加入。
如果實際製作後發現太複雜,也會再依照當時的進度調整。

第七天的成果

今天主要是把原本的水管障礙物換掉,並嘗試讓上下障礙物分開生成。
想著不能一昧地照著原遊戲進行製作,所以得要增加一點自己的想法,也因此需要多花幾天慢慢進行修改。
這次也是第一次製作兩個分開生成,而且不能同時生成的物件,所以我先把自己的想法告訴Gemini,詢問它如何做到,能不能辦到,再慢慢學習要怎麼在遊戲中實現這個想法。
目前遊戲還在製作當中,接下來會繼續嘗試加入新的遊戲元素。


上一篇
Day 6|讓遊戲場景動起來
下一篇
Day 8|開始加入遊戲道具
系列文
從基礎到實作:使用 Google AI 學習程式設計9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言