为什么在布局组上实例化的最后一个元素显示为第一个并且是错误的?
Why does the last element instantiated on a layout group appear as first and wrong?
我正在统一编写纸牌游戏,需要绘制的纸牌显示在由水平布局组绑定的 UI 区域中,这些纸牌可脚本化 objects 预先编写并显示绘制时,但由于某种原因,我创建和洗牌的牌组的最后一张牌显示为随机不同的牌,并作为该区域的第一张 child 移动。
我尝试检查所有涉及的函数的逻辑,我发现删除混洗可以解决问题,但是在调试混洗函数时我发现一切都按预期工作,所以我断定它一定只是一个图形问题.我也尝试过添加布局元素和内容大小装配器,但没有用。我将在下面留下 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 函数 after 实例化它,第一张卡总是实例化“未设置”,即随机。在 Instantiate 之前移动 Set 调用修复了故障。
我正在统一编写纸牌游戏,需要绘制的纸牌显示在由水平布局组绑定的 UI 区域中,这些纸牌可脚本化 objects 预先编写并显示绘制时,但由于某种原因,我创建和洗牌的牌组的最后一张牌显示为随机不同的牌,并作为该区域的第一张 child 移动。
我尝试检查所有涉及的函数的逻辑,我发现删除混洗可以解决问题,但是在调试混洗函数时我发现一切都按预期工作,所以我断定它一定只是一个图形问题.我也尝试过添加布局元素和内容大小装配器,但没有用。我将在下面留下 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 函数 after 实例化它,第一张卡总是实例化“未设置”,即随机。在 Instantiate 之前移动 Set 调用修复了故障。