Unity3d中关于脚本的启用和禁用的意义及脚本前面的复选框消失的解释

大家好,我是小熊猫。

转载请注明出处:http://blog.csdn.net/a237653639/article/details/45766101

先总结,再证明。

总结:

禁用脚本的目的就是为了让该脚本“不执行”,而启用的目的就是为了让该脚本”执行“。以上是我原来的想法,其实这样的理解有偏差。准确地说,即使脚本为禁用状态,别的脚本也能够成功地调用 被禁用的脚本的成员(后面将给以证明)。

那么,您可能会发问,那我禁用脚本有什么意义呢?

其实意义就是,脚本为启用状态时,unity会自动调用该脚本的类继承自MonoBehaviour的方法,反之,脚本为禁用状态时,unity就不会调用这些方法。但绝不影响其他脚本对该脚本内成员的调用。

证明:

   即使脚本为禁用状态,别的脚本也能够成功地调用 被禁用的脚本的成员

步骤1,先创建一个cube,然后在其上挂一个Test脚本。然后在MainCamera上挂一个Test2脚本。

我们将禁用Test脚本,Test2将调用Test内的成员。

如下图:

cube:

camera:

Test脚本的内容为:

Test2的内容为:

注意,我们已经把Test脚本设为了禁用。

现在,我们看到了运行结果,如下图。cube.GetComponent<Test>().Print()这句话调用成功,但是Test中的继承自MonoBehaviour的Update方法并没有被调用。

现在来解释脚本前面的复选框消失的原因:

首先,复选框消失的原因我先复制粘贴下雨松大神的解释:

凡事脚本没有勾选项的,都是因为你的脚本没有Start方法。。如果你想让勾选框显示出来,

把如下方法加入即可,不信你可以试试。嘿嘿。有人测试了一下,

加上 Update LateUpdate FixedUpdate OnGUI 也都可以让勾选框出来。。。但是Awake不行。。

通过雨松大神的解释,以下是我进一步的想法。

通过上面的总结,我们已经知道了:脚本为启用状态时,

unity会自动调用该脚本的类继承自MonoBehaviour的方法,

反之,脚本为禁用状态时,unity就不会调用这些方法。

我的想法:

如果你的脚本里面没有继承自MonoBehaviour的方法,意思就是就不需要unity来调用了(根本没有,从何调用)。

这样的话,你的脚本不管是禁用或是启用就都跟Unity没有半毛钱的关系了,

所以Unity才会不给你显示复选框,因为没有必要嘛对吧。而一旦有比如Start这类继承(其实是覆写)了

MonoBehaviour的方法,这时就该Unity出马了!所以复选框就会重新显示出来,

由你来控制是否允许Unity来调用Start等方法。那么Awake呢?

我们查阅Unity的官方文档上可以知道(Awake
is called once, just like the constructor.),

如果重新启用一个脚本,那么该脚本内的Awake方法不会被调用,而Start等方法会重新起作用(调用)。

而Awake只在其脚本附加的对象一开始被创建时调用一次(不管该脚本是启用还是禁用

都会被调用一次),以后不再调用。所以”Awake不行“(不能使复选框重新出现),哈哈。

说到这里,你懂了嘛??^_^

时间: 2024-08-29 08:56:11

Unity3d中关于脚本的启用和禁用的意义及脚本前面的复选框消失的解释的相关文章

nodetree中 前面复选框禁用插件

nodetree中 前面复选框的去掉插件 extendTreeCheck.js 1 /** 2 * tree方法扩展 3 * 作者:小雪转中雪 4 */ 5 $.extend($.fn.tree.methods, { 6 /** 7 * 激活复选框 8 * @param {Object} jq 9 * @param {Object} target 10 */ 11 enableCheck : function(jq, target) { 12 return jq.each(function(){

如何取消xendesktop7.x中发布出来的windows 7中的文件复选框

最近很多用户反映通过Citrix XenDekstop7.x的版本发布出来的windows7会默认开启文件复选框,如下图: 很多用户会感觉不习惯,当然关闭起来也很简单,打开Windows Exploer->工具->文件夹选项->取消勾选"使用复选框以选择项"即可! 很多用户又有了疑问:为何我的模板里没有勾选此项但是发布出来的VM默认勾选此项呢? 其实很简单这个主要是针对触屏设备访问而开启的,在安装VDA7.x后会默认改为Tablet PC模式 http://windo

ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中(一)

ASP.NET实现弹出框真分页将复选框选择的数据存到数据库中,这个问题分一下几步走 1.将弹出框真分页后复选框选择的数据保存. 2.将弹出框保存的数据传到父页面上. 3.将数据在父页面上显示. 4.点击保存将信息存入数据库中. 首先来第一步将弹出框真分页后复选框选择的数据保存. 思路很简单就是先真分页,然后在点击下一页的时候扫描这一页所有点击复选框的数据保存到一个变量数组中.下面就是主要代码: ASP代码: <%@ Page Language="C#" AutoEventWire

HTML页面中A博娱乐复选框的操作方法

A博娱乐复选框在网页中很是常见,无论是电商网站,还是平台,只有有需要选择的地方就会见到复选的身影.接下来,是我之前写过的两个小demo,都是关于复选框的,希望会给大家带来帮助. 第一个是关于复选框全选反选的操作,当然我在里面还加了一个小功能,就是当选择底下尚品或者其他的东西的复选框全部为选中状态时则全选按钮也变为选中状态:反之亦然. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3

jquery中input复选框的checked属性

在今日的多选,反选,全选试验中,关于通过jQuery方法来实现复选框的选中与否问题,我有了以下发现: 1.不能通过.css('checked','checked')方法来设置或者获取复选框的checked属性,在控制台打印输出.css('checked'),结果为undefined, 不管在HTML中是否设置了checked='checked'; 2.通过attr添加属性即.attr('checked','abc'),会给HTML中input所在处添加checked='checked'这样的代码

在php中验证复选框

PHP接收多个同名复选框信息不像ASP那样自动转换成为数组,这给使用带来了一定不便.但是还是有解决办法的,就是利用javascript做一下预处理.多个同名复选框在javascript中还是以数组的形式存在的,所以在表单提交之前可以利用javascript把复选框中的信息组合成一个字符数组赋值给表单中的隐藏元素,然后用PHP中的explode函数解析此数组,这样就可以实现复选框信息的传递了.下面举例说明. 假设有这样一个表单: <form name="form1" id=&quo

html与用户交互中单选框与复选框&amp;下拉列表中的情况

使用单选框.复选框,让用户选择 在使用表单设计调查表时,为了减少用户的操作,使用选择框是一个好主意,html中有两种选择框,即单选框和复选框,两者的区别是单选框中的选项用户只能选择一项,而复选框中用户可以任意选择多项,甚至全选.请看下面的例子: 语法: <input type="radio/checkbox" value="值" name="名称" checked="checked"/> 1.type: 当 typ

firefox中 checkbox属性checked=&quot;checked&quot;已有,但复选框却不显示打钩的原因

最近在调试复选框的应用,在ie没有问题,考虑到兼容性,试试了firefox,遇到了问题. 复选框绑定了click事件,点一次选中,再点击取消选中,依次类推.这个功能在ie中没问题,但是在firefox中测试的时候,前两次都没有问题,可以正常显示选中和取消,但当再去选中的时候,复选框的属性checkbox值变为"checked",没问题,但是复选框却不在显示选中状态,明明属性值改了,但是却不显示勾选,太诡异了.代码修改了却得不到正确的显示状态,纠结了很久,找不到原因. 正解:后来经偶像指

extjs 中动态给gridpanel 复选框赋值

最近在搞extjs时需要动态根据数据给gridpanel的复选框赋值 网上看了很多 ,多不行,最后找到一个好使的方法 如下: RBACformPanel.getSelectionModel().select(0, true); 其中RBACformPanel就是你的gridpanel, select中的参数0表示grid第一列的对象,true表示将checkbox设置为true 即为勾选状态.