Unity调用Instantiate生成敌人异常:生成2个而非预期1个
问题根因
- 延迟调用逻辑与Update帧执行冲突:你给生成方法设置了0.0005秒的
Invoke延迟,在延迟等待的几帧内,time已经满足<=0的条件,且howmuchenemies还未被修改,会连续触发多次Invoke调用,相当于排队了多个生成请求,最终生成多个敌人。 - 边界判断逻辑错误:你的生成触发条件写的是
howmuchenemies >= 0,初始值为1,第一次生成后howmuchenemies减到0,下一次Update判断时条件仍然成立,会再次触发生成,直到第二次生成后数值变为-1才会停止,直接导致多生成1个敌人。
修复方案
直接删除不必要的Invoke延迟调用,同时修正边界判断条件即可,你设置的0.0005秒延迟没有实际业务意义,反而会导致帧判断逻辑混乱。修改后的完整代码如下:
public class enemyspawner : MonoBehaviour { public GameObject enemyeasy; public GameObject enemyhard; public GameObject enemyinsane; public int timer; public float time; public int howmuchenemies = 1; public PlayerMovement pm; private int difficulty; public void Start() { difficulty = pm.difficult; time = timer; } public void Update() { time -= Time.deltaTime; // 修正边界判断为howmuchenemies > 0 if (time <= 0 && howmuchenemies > 0) { if (difficulty == 1) { // 直接调用生成方法,去掉Invoke spawneasy(); } else if (difficulty == 2) { spawnhard(); } else if (difficulty == 3) { spawninsane(); } // 如果只需要生成一波,这里可以加一行time = float.MaxValue; 彻底避免后续重复判断 } } public void spawneasy() { Instantiate(enemyeasy, transform.position, Quaternion.identity); howmuchenemies -= 1; } public void spawnhard() { howmuchenemies -= 1; Instantiate(enemyhard, transform.position, Quaternion.identity); } public void spawninsane() { Instantiate(enemyinsane, transform.position, Quaternion.identity); howmuchenemies -= 1; } }
额外优化说明:将独立的三个if判断改成else if,避免同一帧内多个难度判断同时命中的极端情况。如果你的需求是仅生成一波敌人,还可以在生成完成后将time设置为一个极大值,彻底避免后续帧重复做无效判断。
内容的提问来源于stack exchange,提问作者kevshoot
相关产品推荐
相关产品推荐

