当前位置: 移动技术网 > IT编程>开发语言>.net > Unity_新手必懂知识点

Unity_新手必懂知识点

2019年04月30日  | 移动技术网IT编程  | 我要评论

儿童画室简介,娴医,中秋放假通知范文

翻车了!!!一个小例子带你了解闭包。
事故现场:
场景:6个button,上方1个text。点击button,text会显示button上的数字。
代码如下:


//在unity里面赋值
public list<button> buttons = new list<button>();
public text text;
void start () {
addfun();
}
//给6个button添加点击事件
void addfun()
{
for (int i = 0; i < buttons.count; i++)
{
buttons[i].onclick.addlistener(() => fun(i + 1));
}
}
//点击事件:输出形参的值
void fun(int i)
{
text.text = i.tostring();
print(i);
}
for循环button添加onclidk函数导致点击所有的button显示同样的莫名数字7。


事故原因:
闭包。标题那么长跟闭包有什么关系?因为上述问题会引起闭包。为什么标题中不直接写出关键字闭包?因为叫的出闭包的人基本上都会避免这个问题,这篇文章主要针对新人,那些没听过闭包的人。


事故分析:
1、什么是闭包?我也不知道哈,非科班,定义百度一下吧。


2、怎么会产生闭包?内部函数使用了外部函数的局部变量。内部函数:是我对匿名函数,lambda表达式等函数嵌套情况的称呼。如上述例子:外部函数addfun,内部函数是lambda表达式,i是外部函数for循环中的局部变量,内部函数lambda表达式使用了i这个局部变量。


3、闭包会导致什么的结果?闭包会延长所用外部函数局部变量的生命周期,或者说是局部变量变成了全局变量。


内存分析:


通俗的讲就是局部变量i从没被释放,一直存在内存中,随着i++,值增到了6,所有button的点击函数都是传进的i+1,也就是7,为实参,所以fun函数打印的数字为7



处理办法:
重新申请内存。代码如下:


public list<button> buttons = new list<button>();
public text text;
void start () {
addfun();
}

void addfun()
{
for (int i = 0; i < buttons.count; i++)
{
//重新申请的内存
int index = i;
buttons[i].onclick.addlistener(() => fun(index + 1));
}
}
void fun(int i)
{
text.text = i.tostring();
print(i);
}
内存分析:


通过初始化重新申请了6块内存,内块内存保存了不同的index值(index值是由i赋值而来)。虽然index变量的生命周期也被延长,但是不同的button的点击函数访问的传进参数的内存不同,因此fun函数打印的数字也就不同。


事件解决:


拓展:
其实闭包在脚本语言中非常常见,也非常有用。以lua为例,代码如下:


function outsidefun()

local i=0
local function insidefun()
i=i+1
print(i)
end

return insidefun
end


local fun=outsidefun()

fun()
fun()
fun()
那么自己可以试试输出值是多少,分析一下为什么是这样。


更多unity2018课程请直接到paws3d上查找。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网