Unity_新手必懂知识点
翻车了!!!一个小例子带你了解闭包。
事故现场:
场景: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上查找。
Unity_新手必懂知识点的更多相关文章
- 干货:Java并发编程必懂知识点解析
本文大纲 并发编程三要素 原子性 原子,即一个不可再被分割的颗粒.在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败. 有序性 程序执行的顺序按照代码的先后顺序执行.(处理器可能会 ...
- 十一:WEB渗透必懂知识点
简述WEB层面上的漏洞以及类型,具体漏洞的危害等级, 如何形成以及如何发现 右边权重大于左边 CTF,SRC,红蓝对抗,实战 简要说明以上漏洞危害 简要说课以上漏洞等级划分 简要说明以上漏洞重点内容 ...
- [新手必备]Python 基础入门必学知识点笔记
Python 作为近几年越来越流行的语言,吸引了大量的学员开始学习,为了方便新手小白在学习过程中,更加快捷方便的查漏补缺.根据网上各种乱七八糟的资料以及实验楼的 Python 基础内容整理了一份极度适 ...
- python新手必躺的5大坑
python新手必躺的5大坑 对于Python新手来说,写代码很少考虑代码的效率和简洁性,因此容易造成代码冗长.执行慢,这些都是需要改进的地方.本文是想通过几个案列给新手一点启发,怎样写python代 ...
- 深度剖析HashMap的数据存储实现原理(看完必懂篇)
深度剖析HashMap的数据存储实现原理(看完必懂篇) 具体的原理分析可以参考一下两篇文章,有透彻的分析! 参考资料: 1. https://www.jianshu.com/p/17177c12f84 ...
- 新手必看】Highcharts的100个基础问答
新手必看]Highcharts的100个基础问答 2014-12-2 10:59| 发布者: Mr.Zhang| 查看: 2749| 评论: 3|来自: Highcharts中文论坛 摘要: 1. ...
- 必懂的webpack高级配置
webpack高级配置 1.HTML中img标签的图片资源处理 使用时.只需要在html中正常引用图片即可.webpack就会找到对应的资源进行打包.并修改html中的引用路径 主要是将html中的i ...
- 必懂的wenpack优化
webpack优化 1.production 模式打包自带优化 tree shaking tree shaking是一个术语.通常用于打包时移除js中未引用的代码(dead-code),它依赖于ES6 ...
- Node.js新手必须知道的4个JavaScript概念
如果只需要知道一种编程语言就可以构建一个全栈的应用程序,是不是特别了不起?Ryan Dahl为了把这个想法成为现实,创造了node.js.Node.js是建立在Chrome强劲的V8 JavaScri ...
随机推荐
- CRM客户关系管理系统(九)
第九章.filter_horizontal优化和kingadmin删除功能 9.1.filter_horizontal优化 (1)添加Choose ALL 和Remove ALL table_obj_ ...
- 想做微信小程序第三方代理,各位觉得一键生成平台能赚到钱吗?
这几年生意不景气,这是很多人的共识.从2009年开始,各种专家就判断"明年经济是最差的一年."然后,这个明年,一直"明"到了2018年,到最后,我们发现,经济就 ...
- CSS学习笔记二:css 画立体图形
继上一次学了如何去运用css画平面图形,这一次学如何去画正方体,从2D向着3D学习,虽然有点满,但总是一个过程,一点一点积累,然后记录起来. Transfrom3D 在这一次中运用到了一下几种属性: ...
- python_日历
>>> import datetime>>> Today=datetime.date.today()>>> Todaydatetime.date( ...
- vue项目中解决type=”file“ change事件只执行一次的问题
问题描述 在最近的项目开发中遇到了这样的一个问题,当我上传了一个文件时,我将获取到的文件名清空后,却无法再次上传相同的文件 <template> <div class="h ...
- ionic常见问题及解决方案
1.Android SDK install设置代理服务器mirrors.neusoft.edu.cn80force http 2.ionic build android 2.1 gradle下载不了解 ...
- 写给小前端er的nodejs,mongodb后端小攻略~ (windows系统~)
一.写在前面 迫于学校的压力,研二上准备回学校做实验发论文了,感觉真的没意思,这几天学着搞搞后端,踩了很多坑,整理一下这几天的坑以免以后再犯! 二.本文主要内容(由于是面向前端同学的,所以前端的内容就 ...
- Android FoldingLayout 折叠布局 原理及实现(二)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/44283093,本文出自:[张鸿洋的博客] 1.概述 在上一篇Android Fo ...
- kafka 三个配置文件
kafka的配置分为 broker.producter.consumer三个不同的配置 一 BROKER 的全局配置 最为核心的三个配置 broker.id.log.dir.zookeeper.c ...
- React从入门到放弃之前奏(4):Redux中间件
redux 提供了类似后端 Express 的中间件概念. 最适合扩展的是redux中的 store.dispatch 方法,中间件实际就是通过 override redux的store.dispat ...