Unity开发FlappyBird克隆:如何统一加速所有管道对象?
解决FlappyBird克隆中已实例化管道的加速问题
核心问题是你没有对场景中已存在的管道做统一管理,导致分数达标后只能修改新生成管道的速度,旧管道还保持原速。以下是具体解决步骤:
1. 维护活跃管道的列表
在你的管道生成脚本中,定义一个列表来存储所有当前场景中存在的管道的PipeMove组件,这样能精准追踪每一个管道:
using System.Collections.Generic; using UnityEngine; public class PipeSpawner : MonoBehaviour { // 其他变量... private List<PipeMove> activePipes = new List<PipeMove>(); // 其他代码... }
2. 生成管道时加入列表
修改你的PipeClonin方法,每次实例化管道后,把它的PipeMove组件加入列表,同时设置当前的基准速度:
void PipeClonin() { // 实例化管道(替换成你自己的实例化代码) GameObject newPipe = Instantiate(pipePrefab, spawnPosition, Quaternion.identity); PipeMove pipeMove = newPipe.GetComponent<PipeMove>(); // 给新管道设置当前的速度 pipeMove.PipeSpeed = pipeMoveScript.PipeSpeed; // 将管道加入活跃列表 activePipes.Add(pipeMove); }
3. 管道销毁时从列表移除
在PipeMove脚本中,当管道超出屏幕需要销毁时,将自己从活跃列表中移除,避免后续遍历出现空引用:
public class PipeMove : MonoBehaviour { public float PipeSpeed; void Update() { transform.Translate(Vector3.left * PipeSpeed * Time.deltaTime); // 假设管道超出左边界时销毁(根据你的场景调整数值) if (transform.position.x < -10f) { PipeSpawner spawner = FindObjectOfType<PipeSpawner>(); spawner.activePipes.Remove(this); Destroy(gameObject); } } }
4. 分数达标时批量更新所有管道速度
回到你的分数判断逻辑,当分数超过10时,除了修改新管道的基准速度,还要遍历活跃列表,把所有已存在的管道速度一起更新:
if (score > 10 && KlonlamaBirKereCalissin10) { CancelInvoke(nameof(PipeClonin)); InvokeRepeating(nameof(PipeClonin), 1f, 5f); KlonlamaBirKereCalissin10 = false; // 更新新管道的基准速度 pipeMoveScript.PipeSpeed = 1.5f; // 遍历所有活跃管道,统一更新速度 foreach (var pipe in activePipes) { if (pipe != null) { pipe.PipeSpeed = 1.5f; } } }
额外注意点
- 不要在
Update中使用GameObject.FindGameObjectsWithTag,这种方法效率低且每次执行都会获取场景中所有对应标签的对象,容易出现逻辑错误 - 维护列表时一定要处理空引用,避免管道销毁后还留在列表中导致报错
内容的提问来源于stack exchange,提问作者MervevreM
相关产品推荐
相关产品推荐

