【发布时间】:2022-09-26 09:12:42
【问题描述】:
希望这篇文章能更清楚地说明我想要实现的目标。
客观的:我想在运行时从列表中生成 20 个苹果(带有附加按钮)。当苹果被点击时,它们将产生一个弹出窗口,其中包含与被点击的苹果有关的信息。
我目前在做什么:我正在使用 for 循环遍历列表以生成苹果。我目前有以下代码:
public class AppleInventory : MonoBehaviour
{
[SerializeField] private ApplesScript applPrefab;
[SerializeField] private Transform applParent;
public ApplesScript CreateApples()
{
var appl = Instantiate(applPrefab, applParent);
for (int i = 0; i < apples.Count; i++)
{
appl = Instantiate(applPrefab, applParent);
appl.InitAppleVisualization(apples[i].GetAppleSprite());
appl.AssignAppleButtonCallback(() => CreateApplePopUpInfo(i));
appl.transform.position = new Vector2(apples[i].x, apples[i].y);
}
return appl;
}
}
问题:问题是当我使用for循环并单击按钮时,它返回以下错误:ArgumentOutOfRangeException:索引超出范围。必须是非负数且小于集合的大小。弹出信息也不会更新。
没有for循环的代码:当我删除 for 循环并将 int i = 设置为特定数字时,该代码可以生成一个苹果,如下所示。它将为 \"i\" 设置的任何数字提供正确的弹出信息。这让我知道问题不是其余的代码。这使我相信这是问题所在的“返回”行以及 for 循环。似乎我可能需要为每次迭代“返回”,但我不确定如何去做。
public ApplesScript CreateApples()
{
int i = 7;
var appl = Instantiate(applPrefab, applParent);
appl.InitAppleVisualization(apples[i].GetAppleSprite());
appl.AssignAppleButtonCallback(() => CreateApplePopUpInfo(i));
appl.transform.position = new Vector2(apples[i].x, apples[i].y);
return appl;
}
谢谢,
-
更新修复非常简单。我刚刚为 for 循环创建了一个新方法,它按我想要的方式工作。我的代码现在看起来像这样:
public void StarterOfApplesCreation()
{
for (int i = 0; i < apples.Count; i++)
{
CreateApples(i);
}
}
public void CreateApples(int i)
{
var appl = Instantiate(applPrefab, applParent);
appl.InitAppleVisualization(apples[i].GetAppleSprite());
appl.AssignAppleButtonCallback(() => CreateApplePopUpInfo(i));
appl.transform.position = new Vector2(apples[i].x, apples[i].y);
}
-
你为什么在循环之前打电话给
Instantiate?当在循环内调用Instantiate时,在那里创建的任何对象都会立即被替换,所以它是没有意义的。 -
我只是把它放在那里,否则返回行中的“appl”会显示一个未定义的错误。
-
但事实并非如此。如果你想在循环外使用它,你需要在循环外声明变量,但这并不意味着你也必须在那里调用
Instantiate。不要创建你不需要的对象。声明变量和创建对象是两件不同的事情。