大家好,我是小熊猫。
转载请注明出处: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不行“(不能使复选框重新出现),哈哈。
说到这里,你懂了嘛??^_^