Unity中如何生成间距至少2米的10个随机障碍物?
如何确保随机生成的障碍物间距至少2米?
你当前的代码仅随机生成位置并实例化障碍物,未做间距校验。要满足所有障碍物间距≥2米的要求,核心思路是记录已生成的障碍物位置,每次生成新位置时校验其与所有已有位置的距离,具体修改如下:
public GameObject obstacle; // 存储已生成的障碍物位置,用于间距校验 private List<Vector3> spawnedPositions = new List<Vector3>(); // 需要生成的障碍物总数 public int totalObstacles = 10; // 最小间距要求(可根据需求调整) public float minDistance = 2f; void Start() { while (spawnedPositions.Count < totalObstacles) { // 生成随机位置(改用float类型,避免整数位置限制过死) float xPos = Random.Range(-6f, 7f); float zPos = Random.Range(85f, 245f); Vector3 newPos = new Vector3(xPos, 1f, zPos); // 校验新位置与所有已生成位置的间距 bool isPositionValid = true; foreach (Vector3 pos in spawnedPositions) { if (Vector3.Distance(newPos, pos) < minDistance) { isPositionValid = false; break; } } // 位置合法则实例化障碍物并记录位置 if (isPositionValid) { Instantiate(obstacle, newPos, Quaternion.identity); spawnedPositions.Add(newPos); } } }
关键改动说明:
- 新增
spawnedPositions列表,保存所有合规的障碍物位置,作为后续校验的依据 - 新增
minDistance变量,统一管理最小间距,后续调整无需修改逻辑代码 - 生成新位置后,通过
Vector3.Distance计算与所有已有位置的距离,只要有一个不满足要求就丢弃当前位置,重新生成 - 仅当位置通过校验时,才实例化障碍物并将位置加入列表,直到生成足够数量的合规障碍物
额外优化提示:
- 可将x/z轴的生成范围设为可配置变量,避免硬编码,方便调整区域大小
- 若担心极端场景(如区域过小导致无法生成足够数量的障碍物),可添加最大尝试次数限制,超过次数后停止生成并打印提示
内容的提问来源于stack exchange,提问作者Ju_hb
相关产品推荐
相关产品推荐

