Unity中如何设置小球3-5秒随机生成间隔?Random.Range失效排查
解决Unity随机间隔生成小球的问题
问题根源是InvokeRepeating的间隔参数是一次性固定的,一旦启动后就不会再读取spawnInterval的新值,所以直接给spawnInterval赋值Random.Range根本不会生效。要实现3-5秒的随机间隔,有两种常用方案:
方案一:使用协程(推荐)
协程是Unity处理可变间隔任务最灵活的方式,直接在循环里控制等待时间:
修改后的完整代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpawnManagerX : MonoBehaviour { public GameObject[] ballPrefabs; private float spawnLimitXLeft = -40; private float spawnLimitXRight = 5; private float spawnPosY = 30; private float startDelay = 1.0f; // 不再需要固定的spawnInterval // Start is called before the first frame update void Start() { // 启动协程替代InvokeRepeating StartCoroutine(SpawnBallRoutine()); } // 协程方法:控制随机间隔生成小球 IEnumerator SpawnBallRoutine() { // 初始延迟 yield return new WaitForSeconds(startDelay); // 无限循环生成 while (true) { SpawnRandomBall(); // 等待3-5秒的随机时间 yield return new WaitForSeconds(Random.Range(3f, 5f)); } } // Spawn random ball at random x position at top of play area void SpawnRandomBall () { Vector3 spawnPos = new Vector3(Random.Range(spawnLimitXLeft, spawnLimitXRight), spawnPosY, 0); int ballIndex = Random.Range(0, ballPrefabs.Length); Instantiate(ballPrefabs[ballIndex], spawnPos, ballPrefabs[ballIndex].transform.rotation); } }
方案二:单次Invoke循环调用
如果不想用协程,可以每次生成完小球后,再调用一次Invoke设置下一次的随机间隔:
修改后的完整代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpawnManagerX : MonoBehaviour { public GameObject[] ballPrefabs; private float spawnLimitXLeft = -40; private float spawnLimitXRight = 5; private float spawnPosY = 30; private float startDelay = 1.0f; // Start is called before the first frame update void Start() { // 第一次生成的延迟 Invoke("SpawnRandomBall", startDelay); } // Spawn random ball at random x position at top of play area void SpawnRandomBall () { Vector3 spawnPos = new Vector3(Random.Range(spawnLimitXLeft, spawnLimitXRight), spawnPosY, 0); int ballIndex = Random.Range(0, ballPrefabs.Length); Instantiate(ballPrefabs[ballIndex], spawnPos, ballPrefabs[ballIndex].transform.rotation); // 生成完成后,设置下一次的随机间隔(3-5秒) Invoke("SpawnRandomBall", Random.Range(3f, 5f)); } }
两种方案都能实现需求,协程更适合复杂的流程控制,而单次Invoke的方式代码更简洁。
内容的提问来源于stack exchange,提问作者Юлиан
相关产品推荐
相关产品推荐

