Unity中SpawnInterval切换失效求助:SpawnRandomBall执行2次后未切换间隔
问题解决:SpawnRandomBall执行2次后切换生成间隔
问题根源
你的代码逻辑写在Start()里,但Start()仅在脚本初始化时执行一次。一旦通过InvokeRepeating启动了重复调用,后续check变量的增长不会自动修改已启动的重复调用间隔,所以切换逻辑完全没机会触发。
修改后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpawnManagerX : MonoBehaviour { public GameObject[] ballPrefabs; private float spawnLimitXLeft = 14.5f; private float spawnLimitXRight = 24; private float spawnPosY = 10; private float startDelay = 1.0f; private float spawnInterval = 4.0f; private float spawnInterval2 = 2.0f; public int check = 0; // 显式初始化,避免默认值歧义 // Start is called before the first frame update void Start() { // 初始直接启动第一次生成循环,使用初始间隔 InvokeRepeating("SpawnRandomBall", startDelay, spawnInterval); } // Spawn random ball at random x position at top of play area void SpawnRandomBall () { // Generate random ball index and random spawn position Vector3 spawnPos = new Vector3(-21, spawnPosY, Random.Range(spawnLimitXLeft, spawnLimitXRight)); int ballIndex = Random.Range(0, ballPrefabs.Length); // 用数组长度代替硬编码3,更灵活 // instantiate ball at random spawn location Instantiate(ballPrefabs[ballIndex], spawnPos, ballPrefabs[ballIndex].transform.rotation); check += 1; // 执行2次后切换间隔(check等于2时,已经完成2次生成) if (check == 2) { // 取消当前的重复调用 CancelInvoke("SpawnRandomBall"); // 启动新的重复调用,间隔改为spawnInterval2,保证第二次生成后按时长触发第三次 InvokeRepeating("SpawnRandomBall", spawnInterval2, spawnInterval2); } } }
关键改动说明
- 移除
Start()中的冗余判断:初始状态check必然为0,直接启动初始间隔的重复调用即可。 - 在
SpawnRandomBall中加入切换逻辑:每次生成后自增check,当check等于2(即完成2次生成)时,终止当前循环并启动新的间隔循环。 - 优化随机索引逻辑:用
ballPrefabs.Length代替硬编码的3,数组增减元素时无需修改此处代码。
内容的提问来源于stack exchange,提问作者Burak Batuhan Gündüz
相关产品推荐
相关产品推荐

