微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在编写一个统一的纸牌游戏,需要绘制的卡片显示在由水平布局组绑定的 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 调用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。