Unity中如何避免Random.Range生成重复的Z轴坐标值?
解决Unity生成物体时Z轴坐标重复的问题
要解决Z轴坐标重复的问题,核心思路是先预先生成所有符合要求的Z值候选列表,再从中随机选取不重复的数值。你的Z值范围是20到100、步长10,可选的数值有20、30、40、50、60、70、80、90、100,共9个,完全足够选出6个不重复的。
修改后的代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpawnerScript : MonoBehaviour { public GameObject GateSingle; public GameObject GateDouble; public static SpawnerScript instance; float minZValue = 20; float maxZValue = 100; float StepZSize = 10; void Awake() { instance = this; } public void Spawn() { // 生成所有符合要求的Z值列表 List<float> availableZValues = new List<float>(); for (float z = minZValue; z <= maxZValue; z += StepZSize) { availableZValues.Add(z); } // 循环生成6个物体 for (int i = 0; i < 6; i++) { // 从可用列表中随机选一个索引 int randomIndex = Random.Range(0, availableZValues.Count); float selectedZ = availableZValues[randomIndex]; // 选中后从列表移除,避免重复 availableZValues.RemoveAt(randomIndex); // 简化X轴取值逻辑 float randomXValue = Random.Range(0, 2) == 0 ? -2.2f : 2.2f; Instantiate(GateSingle, new Vector3(randomXValue, 0, selectedZ), Quaternion.identity); } } }
关键修改点说明:
- 预生成Z值列表:通过循环把20到100步长10的所有Z值存入列表,确保所有可选值都在范围内且符合步长要求。
- 随机抽取并移除:每次从列表中随机选一个元素,然后立刻从列表中删除该元素,这样后续就不会再选中重复的Z值。
- 简化X轴逻辑:用三元运算符替代冗余的if-else判断,代码更简洁。
这样修改后,生成的6个物体的Z轴坐标就不会出现重复的情况了。
内容的提问来源于stack exchange,提问作者Leon Ristic
相关产品推荐
相关产品推荐

