qq_33413868的博客

新手unity游戏开发程序员

关于Unity c#里面闭包的问题

今天写造梦西游 使用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  就可以解决

具体内部的原因由于能力有限解释不清楚,请大家自行百度...


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

关于Unity c#里面闭包的问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭