Unity如何设置时间循环 解决计时重置逻辑失效问题
问题根因
你的重置逻辑不生效的核心原因是代码作用域写错了:
- 你把
realTime > 30f时重置为0的逻辑,写在了陨石生成的if判断块内部 - 而外层进入生成逻辑的前提条件就包含
realTime < 30f,也就是说只要能进到这个代码块,realTime必然小于30,内部判断realTime>30f的条件永远不可能成立,重置代码永远不会执行,realTime自然会一直累加超过30。
另外还有个逻辑偏差:你初始给realTime赋值为4f,会导致第一个周期的休息时间只有1秒,和你设计的前5秒无陨石的规则不符。
修正后代码
调整逻辑很简单:把周期重置的逻辑移到Update的最外层,和陨石生成逻辑解耦,每帧都检查周期是否走完,同时修正初始时间值即可:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Spawner : MonoBehaviour { public GameObject enemy; float defaultSpawnTime = 1f; float spawnTime = 1f; // 初始时间改为0,保证第一个周期前5秒正常休息 float realTime = 0f; void Update() { spawnTime -= Time.deltaTime; realTime += Time.deltaTime; // 周期重置逻辑移到最外层,每帧判断 if (realTime > 30f) { realTime = 0f; } // 陨石生成判断:冷却走完 + 处于周期内25秒生成阶段 if (spawnTime < 0 && realTime > 5f && realTime < 30f) { Instantiate(enemy, new Vector3(Random.Range(-2.3f, 2.3f), 8f, 0), Quaternion.identity); Instantiate(enemy, new Vector3(Random.Range(-2.3f, 2.3f), 8f, 0), Quaternion.identity); spawnTime = defaultSpawnTime; } } }
额外优化:直接用
Quaternion.identity代替手写的Quaternion.Euler(0,0,0),是Unity里创建无旋转物体的标准写法,性能更好也更简洁。
内容的提问来源于stack exchange,提问作者Florianus
相关产品推荐
相关产品推荐

