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 ...
随机推荐
- shell脚本头,#!/bin/sh与#!/bin/bash的区别.
因为今天写了个小脚本,死活不成功,总是报文件或者目录不存在,问了一下我们马同学的正常写法,发现只有脚本头的区别,也就是今天本文要讲的#!/bin/sh与#!/bin/bash. 本文参考:https: ...
- .NET开发设计模式-单例模式
解释:单例模式主要特点:确保一个类只有一个实例,并提供一个访问它的全局访问点 意思就是说:在多线程的情况下:A先进行创建了该实例.B再进来访问时就不需要再创建了. using System; usin ...
- mint-ui之picker爬坑记
picker的数据来源为动态获取时,数据无法正常渲染!因为方法不对,所以坑大了!深刻地体会到'业不精,我之过',谨以此文,深刻地记录一下踩坑及爬坑的整个过程,以便日后不再入坑,也给后来者提供一下参考 ...
- 微信小程序-获取经纬度
微信小程序-获取经纬度 最近公司新功能 要求在外的市场人员 发送位置信息回来. 用的还是微信小程序开发.... 微信小程序 提供一个接口 getLocation 这个接口反回来的位置 相对实际位置 相 ...
- JDK安装遇见的问题及解决方案
问题描述: Jdk安装完成后从新启动电脑,打开eclipse报找 不到JRE或JDK,在cmd中输入 java -version 也不显示JDK信息. 后把JDK配置的环境变量path的JAVA_H ...
- SSM-SpringMVC-28:SpringMVC类型转换之自定义日期类型转换器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 例子很简易,要明白的是思路,话不多说,开讲 上篇博客不是说springmvc默认的日期转换格式是yyyy/M ...
- CSS3 :nth-child() 选择器---挖坑
E:nth-child(n) 语法: E:nth-child(n) { sRules } 说明: 匹配父元素的第n个子元素E,假设该子元素不是E,则选择符无效.(也就是说,会检查从body开始的每个元 ...
- 笔记一下NODEJS建站
1:npm的使用 -g的包安装用于命令行 --save用于建立依赖 建立依赖后的包只要使用npm install就可以直接全部安装 2:EJS和JADE模板 3:使用Mongoose对Mongodb进 ...
- 使用jekyll和Github搭建个人博客
一.使用jekyll和Github三步搭建个人博客 在 Github 上建一个库,库的名字是xxx.github.com,其中的xxx是你的github的账号名(图中标注的不要勾选) 注:如果没有Gi ...
- 关于top命令的使用
在服务器运维过程中,我们有时需要知道当前状态下的系统运行性能,该如何获取呢?今天,咱们聊一下关于top这个小命令的一些知识. top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资 ...