You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity+C#实现气球移动速度递增与生成频率随固定间隔提升的方法求助

Unity+C#实现气球移动速度递增与生成频率随固定间隔提升的方法求助

嗨,兄弟!看了你的代码和需求,完全懂你卡在哪了——想让游戏随着时间越来越难,气球飞得更快、出得更密对吧?别慌,咱们把现有代码改一改,几步就能实现,我给你理清楚:

首先说核心思路:咱们需要设定一个固定的难度提升间隔(比如每10秒),到点就做两件事:1. 减小气球的生成间隔(让气球出得更频繁);2. 提升气球的飞行速度。同时要给生成间隔设个最小值,不然到后期气球堆得太离谱没法玩。

第一步:修改你的BalloonSpawner.cs

我给你补全了缺失的变量和难度提升逻辑,注释都写清楚了,直接替换就行:

public class BalloonSpawner : MonoBehaviour
{
    [Header(" Gameplay Elements ")]
    [SerializeField] GameObject balloonPrefab;

    [Header("Difficulty Settings")]
    [SerializeField] float initialSpawnRate = 2f; // 一开始每2秒生成一个气球
    [SerializeField] float spawnRateDecreaseAmount = 0.1f; // 每次难度提升,生成间隔减少0.1秒
    [SerializeField] float minSpawnRate = 0.5f; // 最小生成间隔,不能比0.5秒还快
    [SerializeField] float difficultyIncreaseInterval = 10f; // 每10秒提升一次难度
    [SerializeField] float speedIncreaseAmount = 0.2f; // 每次难度提升,气球速度加0.2

    private float nextSpawn;
    private float nextDifficultyIncrease;

    void Start()
    {
        // 初始化第一次生成和第一次难度提升的时间点
        nextSpawn = Time.time + initialSpawnRate;
        nextDifficultyIncrease = Time.time + difficultyIncreaseInterval;
    }

    void Update()
    {
        // 处理气球生成逻辑
        if (Time.time > nextSpawn)
        {
            nextSpawn = Time.time + initialSpawnRate;
            SpawnBalloons(); // 这里不用协程啦,Update里已经判断好时间了
        }

        // 处理难度提升逻辑
        if (Time.time > nextDifficultyIncrease)
        {
            // 生成间隔不能低于最小值,防止游戏太变态
            if (initialSpawnRate > minSpawnRate)
            {
                initialSpawnRate -= spawnRateDecreaseAmount;
            }

            // 提升所有气球的飞行速度(包括已经生成的和即将生成的)
            BalloonMover.balloonFlySpeed += speedIncreaseAmount;

            // 更新下一次难度提升的时间
            nextDifficultyIncrease = Time.time + difficultyIncreaseInterval;

            // 打印日志方便你调试看数值变化
            Debug.Log($"难度升级!当前生成间隔:{initialSpawnRate:F2}秒,当前气球速度:{BalloonMover.balloonFlySpeed:F2}");
        }
    }

    void SpawnBalloons()
    {
        float randomXPosition = Random.Range(-1.5f, 1.5f);
        GameObject balloonInstance = Instantiate(balloonPrefab, new Vector3(randomXPosition, -4.5f, 0), Quaternion.identity);
    }
}

第二步:修改你的BalloonMover.cs

主要是把气球速度改成静态变量,这样Spawner能直接全局修改,新生成的气球也会自动用最新速度:

public class BalloonMover : MonoBehaviour
{
    [Header(" Settings ")]
    public static float balloonFlySpeed = 1f; // 改成静态变量,让Spawner能全局控制

    void Update()
    {
        BalloonFlyer();
    }
    
    void BalloonFlyer()
    {
        transform.Translate(Vector3.up * balloonFlySpeed * Time.deltaTime);

        if (transform.position.y > 3.5f)
        {
            PopBalloon();
        }
        HandleTouchInput();
    }

    void HandleTouchInput()
    {
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);

            if (touch.phase == TouchPhase.Began)
            {
                Vector2 touchPosition = Camera.main.ScreenToWorldPoint(touch.position);
                RaycastHit2D hit = Physics2D.Raycast(touchPosition, Vector2.zero);

                if (hit.collider != null && hit.collider.gameObject == gameObject)
                {
                    PopBalloon();
                }
            }
        }
    }
    
    void OnMouseDown() 
    {
        PopBalloon();
    }

    void PopBalloon()
    {
        Destroy(gameObject); 
    }
}

几个小提示给你:

  • 你可以直接在Unity Inspector面板里调整这些难度参数,比如把difficultyIncreaseInterval改成5秒,或者把speedIncreaseAmount改成0.3,找到最适合你游戏的节奏。
  • 记得给你的气球预制体加上2D碰撞器(比如BoxCollider2D或者CircleCollider2D),不然点击/触摸气球的逻辑会失效!
  • 如果不想用静态变量(怕后期代码耦合),也可以用Unity的事件系统,不过对新手来说静态变量是最简单直接的实现方式。

这样改完之后,运行游戏你就能看到每过固定时间,气球飞得越来越快,生成得越来越密啦!试试吧,有问题再问~

备注:内容来源于stack exchange,提问作者djoker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:23:08