Unity中C#如何在for循环内延迟指定秒数生成小行星
Unity实现点击按钮间隔生成小行星的正确方法
为什么你之前的方法行不通
System.Threading.Thread.Sleep(3000)会卡死Unity主线程,整个游戏会强制暂停3秒,完全无法正常运行,绝对不能用这个方式。- 直接在
ShowJourney里写yield return无效,因为只有标记为IEnumerator的方法才能作为协程,而且协程必须通过StartCoroutine启动,不能直接当成普通方法调用。
修改后的代码实现
把你的ButtonSkript改成下面这样,核心是用Unity协程处理间隔生成逻辑:
public class ButtonSkript : MonoBehaviour { private Vector3 spawnPosition = new Vector3(15, 0, 0); public GameObject planet_001Prefab; public GameObject planet_011Prefab; // not in use public GameObject planet_017Prefab; // not in use public GameObject planet_079Prefab; // not in use // 按钮点击事件绑定这个方法 public void OnGenerateAsteroidsClicked() { // 启动协程执行间隔生成逻辑 StartCoroutine(GenerateAsteroidsCoroutine()); } // 协程方法,负责处理间隔生成 private IEnumerator GenerateAsteroidsCoroutine() { int[] asteroids_array = {27, 569, 1293, 37}; int[] material_type_array = {0, 2, 1, 3}; // not in use for (int i = 0; i < asteroids_array.Length; i++) { // 生成小行星 GameObject a = Instantiate(planet_001Prefab); a.transform.position = spawnPosition; // 这里建议不要固定销毁时间,可根据移动速度计算实际移出屏幕的时间 // 比如speed=10,从x=15到屏幕左边界x=-10的距离是25,时间=25/10=2.5秒,可写Destroy(a, 2.5f); Destroy(a, 3); // 最后一个小行星生成后不需要等待 if (i != asteroids_array.Length - 1) { // 等待3秒再生成下一个 yield return new WaitForSeconds(3.0f); } } } }
关键注意点
- 按钮绑定:把按钮的
OnClick事件绑定到OnGenerateAsteroidsClicked方法,不要直接绑协程方法。 - 协程启动:通过
StartCoroutine启动协程,Unity会在后台处理等待逻辑,不会阻塞游戏主线程。 - 销毁时间优化:固定
Destroy(a, 3)可能不符合实际移动逻辑,你可以根据小行星移动速度和屏幕边界计算准确的销毁时间,确保小行星刚移出屏幕就被销毁。 - 时间缩放兼容:如果你的游戏会修改
Time.timeScale(比如暂停功能),WaitForSeconds会跟着暂停,这时可以改用WaitForSecondsRealtime(3.0f),不受时间缩放影响。
你的Translate类逻辑无需修改,小行星会正常向左移动。
内容的提问来源于stack exchange,提问作者Dominik4362
相关产品推荐
相关产品推荐

