0

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

我尝试检查所有涉及的功能的逻辑,我发现删除洗牌解决了问题,但是在调试洗牌功能时,我发现一切都按预期工作,所以我断定这一定只是一个图形问题。我也尝试过添加布局元素和内容大小调整器,但没有用。我将在下面留下 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);
        
    }
}
4

1 回答 1

0

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

于 2021-02-08T19:18:55.233 回答