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

Posted

技术标签:

【中文标题】为啥布局组上实例化的最后一个元素显示为第一个且错误?【英文标题】:Why does the last element instantiated on a layout group appear as first and wrong?为什么布局组上实例化的最后一个元素显示为第一个且错误? 【发布时间】:2021-05-07 03:51:22 【问题描述】:

我正在统一编写纸牌游戏,需要将绘制的纸牌显示在由水平布局组绑定的 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);
        
    

【问题讨论】:

您使用的是水平布局组吗? 是的,为了让卡片保持原位,为什么?如果需要,我可以发送检查员的屏幕截图。 【参考方案1】:

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

【讨论】:

以上是关于为啥布局组上实例化的最后一个元素显示为第一个且错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除最后一个实例化的ViewController,最后一个TableViewController变为活动状态

为啥这个指针显示最后一个元素?

为啥允许向已经实例化的对象添加属性?

当我尝试从双向链表中删除最后一个元素时,为啥会收到“信号 SIGSEGV,分段错误”?

为啥自动布局约束不起作用?

为啥我的 Axios 实例没有在捕获的错误中返回响应?