【发布时间】:2020-05-19 15:18:01
【问题描述】:
我试图在循环中实例化一个预制件,但是第一次调用实例化函数时,代码无缘无故地脱离了函数。我在 Visual Studio 中使用了步进工具,但无法弄清楚它为什么这样做。我认为这可能是因为我的 Unity 版本,但我刚刚更新到 2019.3.0f6 并且问题仍然存在。有人有什么建议吗?
public void GotTickets(FBTicket[] tickets)
{
if (ticketHolders.Count < tickets.Length)
{
int amountNeeded = tickets.Length - ticketHolders.Count;
for (int i = 0; i < amountNeeded; i++)
{
TicketHolder ticketHolder = Instantiate(ticketHolderPrefab, ticketHolderParent).GetComponent<TicketHolder>();
ticketHolders.Add(ticketHolder);
}
}
for (int i = 0; i < ticketHolders.Count; i++)
{
ticketHolders[i].gameObject.SetActive(false);
}
for (int i = 0; i < tickets.Length; i++)
{
ticketHolders[i].SetTicket(tickets[i].jackpot, tickets[i].numbers);
}
}
【问题讨论】:
-
我没有答案,但您的代码的第一部分可以大大简化:
while (ticketHolders.Count < tickets.Length) ticketHolders.Add(Instantiate(etc...)) -
不确定您在说哪个“循环”。在你最后一个
for循环之前,你能用一些 Debug.Log 命令显示ticketHolders.Count和tickets.Length的值是什么吗? -
另请注意,虽然ticketHolders 可能已经有一些元素,但您确定它们都不是
null?这肯定会打破if块之后的第一个循环 -
最后两个循环无关紧要,超过实例化点的代码不会运行。但是门票的长度是不同的,测试它的长度为 13,ticketHolders 的计数为 0。
-
如何引用ticketPrefab?您是否在检查器中设置了公共财产?总是让我明白的是,我制作了该属性,但忘记在检查器中将预制件拖入其中。此外,如果您将实例化从 GetComponent 调用中分离出来,它是否会通过实例化?
标签: c# for-loop unity3d instantiation