Unity中如何在网格中随机生成12种卡牌预制体各两份?
解决方案
要实现每种预制体恰好生成两次并随机排列,你需要先构建一个包含所有配对卡牌的完整列表,再打乱顺序后生成,具体步骤如下:
- 构建完整的卡牌池:遍历你的
cardPrefabs列表,将每个预制体添加两次到新列表中,确保每种卡牌有且仅有两份。 - 打乱卡牌顺序:使用Fisher-Yates洗牌算法打乱这个完整列表,实现公平的随机排列。
- 按网格位置生成卡牌:遍历打乱后的列表,沿用你原有的网格坐标逻辑生成每张卡牌。
修改后的代码如下:
public class GridManager : MonoBehaviour { public int columnLenght; // 注:拼写建议修正为columnLength public int rowLenght; // 注:拼写建议修正为rowLength public float x_Space; public float y_Space; public float x_Start; public float y_Start; public float z_Start; public List<GameObject> cardPrefabs; void Start() { // 1. 构建包含所有配对卡牌的列表 List<GameObject> cardPool = new List<GameObject>(); foreach (var prefab in cardPrefabs) { cardPool.Add(prefab); cardPool.Add(prefab); } // 2. Fisher-Yates洗牌算法打乱列表 for (int i = cardPool.Count - 1; i > 0; i--) { int randomIndex = Random.Range(0, i + 1); // 交换当前元素与随机位置元素 var temp = cardPool[i]; cardPool[i] = cardPool[randomIndex]; cardPool[randomIndex] = temp; } // 3. 按网格位置生成卡牌 for (int i = 0; i < columnLenght * rowLenght; i++) { Instantiate(cardPool[i], new Vector3(x_Start + (x_Space * (i % columnLenght)), y_Start + (-y_Space * (i / columnLenght)), z_Start), Quaternion.Euler(270, 0, 0)); } } }
关键说明
- 卡牌池构建:通过重复添加每个预制体,严格保证每种卡牌的生成数量为2,总卡牌数刚好匹配24张的需求。
- Fisher-Yates洗牌:这是一种高效且无偏的随机洗牌方式,能避免随机索引重复选取导致的分布不均问题,确保排列完全随机。
- 网格生成逻辑:保留了你原有的坐标计算逻辑,确保卡牌按设定的行列数和间距整齐排列。
内容的提问来源于stack exchange,提问作者nachoa88
相关产品推荐
相关产品推荐

