Unity中如何按顺序每次仅实例化数组中的一个对象?
问题分析与解决方案
我一眼就看到问题出在哪了——你在CreateEnemies函数里写了个遍历整个enemies数组的for循环,所以每次timer触发时,都会把数组里所有敌人一次性实例化出来!想要按顺序逐个生成敌人,我们只需要添加一个索引变量来追踪当前该生成哪个敌人就行,具体改法如下:
核心修改点
- 添加一个类级别的索引变量,记录当前要生成的敌人在数组中的位置
- 移除
CreateEnemies里的循环逻辑,改成只生成单个敌人的逻辑 - 在
Update中每次触发时,只生成当前索引对应的敌人,然后更新索引(按需循环或停止)
修改后的完整代码
// 添加一个类级别的索引变量,初始化为0,记录当前要生成的敌人位置 private int currentEnemyIndex = 0; void Update() { if (timer > maxTime) { float center = Screen.width / (float)Screen.height; // 调用生成单个敌人的方法,而不是原来的批量生成 SpawnNextEnemy(center); timer = 0; } timer += Time.deltaTime; } void Shuffle(GameObject[] array) { for (int i = 0; i < array.Length; i++) { GameObject temp = array[i]; int random = Random.Range(i, array.Length); array[i] = array[random]; array[random] = temp; } } // 重写生成逻辑,只生成当前索引对应的敌人 void SpawnNextEnemy(float positionY) { // 先判断索引是否超出数组范围,如果超出可以重置(循环生成)或者直接返回(停止生成) if (currentEnemyIndex >= enemies.Length) { // 这里可以选择重置索引循环生成,或者写逻辑停止生成 currentEnemyIndex = 0; // 如果不需要循环,直接return即可: // return; } // 实例化当前索引对应的敌人 GameObject newEnemy = Instantiate(enemies[currentEnemyIndex], transform.position + new Vector3(Random.Range(-screenBounds.x - 1.5f, screenBounds.x + 1.5f), 0, 0), Quaternion.identity) as GameObject; // 更新索引,下次生成下一个敌人 currentEnemyIndex++; // 你原来的positionY累加逻辑,如果需要的话可以调整到这里,比如给新敌人设置Y位置 // newEnemy.transform.position += new Vector3(0, positionY, 0); }
关键解释
currentEnemyIndex变量:这个变量会一直记录下一个要生成的敌人在enemies数组中的位置,每次生成后自增,直到数组末尾可以选择重置循环或停止。- 移除批量循环:原来的
CreateEnemies里的for循环是导致一次性生成所有敌人的罪魁祸首,现在改成只处理单个索引的逻辑,就实现了按顺序逐个生成的需求。 - 边界处理:加入了索引超出数组范围的判断,避免数组越界错误,你可以根据需求选择循环生成或者停止生成。
内容的提问来源于stack exchange,提问作者Bata Kos
相关产品推荐
相关产品推荐

