You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何在网格中随机生成12种卡牌预制体各两份?

解决方案

要实现每种预制体恰好生成两次并随机排列,你需要先构建一个包含所有配对卡牌的完整列表,再打乱顺序后生成,具体步骤如下:

  1. 构建完整的卡牌池:遍历你的cardPrefabs列表,将每个预制体添加两次到新列表中,确保每种卡牌有且仅有两份。
  2. 打乱卡牌顺序:使用Fisher-Yates洗牌算法打乱这个完整列表,实现公平的随机排列。
  3. 按网格位置生成卡牌:遍历打乱后的列表,沿用你原有的网格坐标逻辑生成每张卡牌。

修改后的代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:42:47