问题描述
摘要:
- 目标:在开始时创建动态目录
- 预期结果:如果用户单击与页面x对应的按钮,则将用户定向到页面x
- 实际结果:如果用户单击与页面x对应的按钮,则用户将被定向到最后一页
我尝试过的事情:
- 遵循MRTK文档https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/README_Interactable.html中列出的OnClick事件代码
public static void AddOnClick(Interactable interactable)
{
interactable.OnClick.AddListener(() => Debug.Log("Interactable clicked"));
}
-
已查看GitHub线程https://github.com/microsoft/MixedRealityToolkit-Unity/issues/4456
-
进入GitHub线程https://github.com/microsoft/MixedRealityToolkit-Unity/issues/5013
代码:目录=目录
private void TOCpage()
{
GameObject TOC = new GameObject(); // holds table of contents buttons
for(int i = 1; 1 <= pages.Count - 1; i++)
{
GameObject TOCgameObject = (GameObject)Instantiate(TOCButtonPrefab);
var TOCButton = TOCgameObject.GetComponent<Interactable>();
TOCbutton.OnClick.AddListener(() => TaskOnClick(i));
}
}
public void TaskOnClick(int TOCButtonNumber)
{
Debug.Log("Table of contents button number " + TOCButtonNumber + " clicked");
}
如果用户单击第1页的“目录”按钮,并且有7页,则将用户定向到第7页。
解决方法
TOCbutton.OnClick.AddListener(()=> TaskOnClick(i));
之所以会发生这种情况,是因为i
并不是lambda的局部变量,而是在外部范围中定义的,并且在调用lambda时将对其进行访问,而不是在定义时进行访问。在循环结束时,i
的值为7,因此所有函数均记录为7。
相反,您可以在循环内创建一个局部变量,并为其指定迭代变量的值,或者使用foreach
语句在C#5.0或更高版本中使用它。
作为解决方案,您可以参考以下代码:
foreach (var i in Enumerable.Range(1,pages.Count))
{
GameObject TOCgameObject = (GameObject)Instantiate(TOCButtonPrefab);
var TOCButton = TOCgameObject.GetComponent<Interactable>();
TOCbutton.OnClick.AddListener(() => TaskOnClick(i));
}