为什么在布局组上实例化的最后一个元素显示为第一个且错误?

问题描述

我正在编写一个统一的纸牌游戏,需要绘制的卡片显示在由水平布局组绑定的 UI 区域上,卡片是预先编写的脚本对象并在绘制时显示,但由于某种原因最后一张卡片我创建和洗牌的牌组中的一张随机显示为一张不同的牌,并作为该区域的第一个孩子移动。

我尝试检查所有涉及的函数的逻辑,我发现移除 shuffle 可以解决问题,但是在调试 shuffle 函数时我发现一切都按预期工作,因此我得出结论,这一定只是图形问题。我也试过添加布局元素和内容大小调整器,但没有用。我将在下面留下 DrawCards、CreateDeck 和 Shuffle 函数,以供参考。 更新:用静态手牌和牌组重写 DrawCards 函数也不能解决问题。

   public class DrawCards : MonoBehavIoUr
{
    public GameObject playerCard;
    public GameObject playerArea;
    public Carddisplay display; 

public List<Card> Draw(List<Card> deck,int num)
{
    List<Card> handTemp = new List<Card>();
    RectTransform root = playerArea.GetComponent<RectTransform>();
    for (int i = 0; i < num; i++)
    {
        GameObject card = Instantiate(playerCard,playerArea.transform);
        Debug.Log("card instatiated");
        LayoutRebuilder.ForceRebuildLayoutImmediate(root);
        handTemp.Add(deck[0]);
        Debug.Log(deck[0].name);
        display.Set(deck[0]);
        deck.RemoveAt(0);
    }
    return handTemp;
    
  }

}

private List<Card> CreateDeck()
{
    List<Card> deck = new List<Card>();
    for (int i = 0; i < 6; i++)
    {
        deck.Add(startingCards[0]);
    }
    for (int i = 0; i < 6; i++)
    {
        //Debug.Log(i);
        deck.Add(startingCards[i]);
    }
    //Debug.Log("deck created");
    return deck;
}

public void Shuffle(List<Card> zone)
{
    int count = zone.Count;
    //Debug.Log("count" + count);
    int last = count - 1;
    //Debug.Log("last" + last);
    for (int i = 0; i < last; i++)
    {
        int random = Random.Range(i,count);
        //Debug.Log("random " + random);
        Card tmp = zone[i];
        //Debug.Log("tmp " + tmp.name);
        //Debug.Log("og " + zone[i].name);
        //Debug.Log("random card " + zone[random].name);
        zone[i] = zone[random];
        //Debug.Log("switched card " + zone[i].name);
        zone[random] = tmp;
        //Debug.Log("switched card " + tmp.name);
        
    }
}

解决方法

发布以防万一有人遇到类似问题:我解决了这个问题,问题出在 DrawCards 函数上:因为我在实例化后调用了牌组顶部卡片上的 Set 函数 ,第一张卡将始终实例化“未设置”,即随机实例化。在 Instantiate 修复故障之前移动 Set 调用。