今天写造梦西游 使用for循环给物体添加事件的时候遇到了这个问题
for (int i = 0; i < List_Levels.Count; i++) { EventTriggerListener.Get(List_Levels[i]).onEnter = () => { OnLevelMouseEnter(List_Levels[i]); }; EventTriggerListener.Get(List_Levels[i]).onExit = () => { OnLevelMouseExit(List_Levels[i]); }; EventTriggerListener.Get(List_Levels[i]).onClick = () => { OnLevelMouseClick(List_Levels[i]); }; }
这样传入lambda里面的i值全都是一样的值,而不是预想的0,1,2..maxCount
后来经过一番查询发现是闭包陷阱问题,可以这样解决
for (int i = 0; i < List_Levels.Count; i++) { int j = i; EventTriggerListener.Get(List_Levels[j]).onEnter = () => { OnLevelMouseEnter(List_Levels[j]); }; EventTriggerListener.Get(List_Levels[j]).onExit = () => { OnLevelMouseExit(List_Levels[j]); }; EventTriggerListener.Get(List_Levels[j]).onClick = () => { OnLevelMouseClick(List_Levels[j]); }; }
在里面新建一个变量,将i的值赋给j 下面的参数使用j 就可以解决
具体内部的原因由于能力有限解释不清楚,请大家自行百度...