浅谈Unity的脚本执行顺序
一、添加脚本的顺序
这是一张官方的脚本顺序图

一般,当我们把脚本绑定在游戏对象上时,或者点击绑定好的脚本的reset按钮时,会调用Reset()
当我们初始化一个对象时,会先调用Awake()在调用OnEnable()
GameObject.instantiate(o);
start()在第一次调用update()前调用,有时候start()会在Awake(),OnEnable()执行完后立刻执行,处于同一帧
onDisable()和onDestroy()的执行顺序有点特别:
第一种情况:
对于不同对象上的不同的脚本,执行是没有先后规律的,且必须成对执行(调用完了onDisable()必须再调用onDestroy())
eg:
gameobject1:
sc1.cs
sc2.cs
gameobject2:
sc3.cs
sc4.cs
gameobject3:
sc5.cs
sc6.cs
gameobject1.sc1.onDisable()->gameobject1.sc1.onDestroy()->gameobject3.sc5.onDisable()->
gameobject3.sc5.onDestroy()
[如果按前面的规则的话,应该先执行gameobject3的脚本,但这里不是]
第二种情况:
在同一个对象的不同的脚本上,这两个方法按照脚本
在m_component中的索引按顺序执行的,而且不是成对执行,索引自小到大执行,最早加入的最早调用onDisable()和onDestroy()
gemeobject2.sc3.onDisable()->gameobject2.sc4.onDisable()->
gameobject2.sc3.onDestroy->gameobject2.sc4.onDestroy()
这里这些脚本先依次调用onDisable()才调用onDestroy()。
二、如何自定义多个脚本的执行顺序

划重点:在unity里面可以点击edit->project settings->Script->Execution Order中自定义脚本执行顺序,
当我们没有设置脚本执行顺序时,脚本按照Default Time的标准执行(你可以把unity里面hireachy里面添加对象和在inspector里面添加脚本
视作一个栈,按照先进先出原则,优先执行后添加的对象的先添加的Script。
可以单击+号添加对象到执行列表中
1是脚本的执行顺序,当你的值execution order越小时,越先执行,在default time上方的在执行default time前执行,在default time下方
的在default time后执行
上面的设置,是通过修改每一个脚本对应的meta文件(去自己的代码目录看一下)的excution order来实现的。

三、脚本执行顺序的本质
在我们的场景文件.unity,场景文件是一个YAML文档

每一个脚本对应一个fileid,fileid越小越有先执行
4.运用
如果你的脚本A会用到另一个脚本B中的某一个对象c,为了防止你在B初始化之前去调用c,出现空指针,你必须让脚本B在A之后挂载(这样B就会先初始化),
还有一个很重要的地方,你必须把对象c的初始化写在脚本B的Awake()方法里面,因为start()并不是在初始化就立刻调用的,而是在当前更新一帧时,start()
会在update()第一次调用前调用一次,这样的话如果你把对象c的初始化写在脚本B的start()方法里面,很有可能所有脚本的awake()都跑完了,对象c却没有初始化,
这样就出现了空指针。因此,把对象c的初始化在脚本B的awake()方法,而把调用对象c写在脚本A的start()足够安全
浅谈Unity的脚本执行顺序的更多相关文章
- 浅谈循环中setTimeout执行顺序问题
浅谈循环中setTimeout执行顺序问题 (下面有见解一二) 期望:开始输出一个0,然后每隔一秒依次输出1,2,3,4. for (var i = 0; i < 5; i++) { setTi ...
- Unity脚本执行顺序自研框架
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52372611 作者:car ...
- unity脚本执行顺序
Awake ->OnEable-> Start ->-> FixedUpdate-> Update -> LateUpdate ->OnGUI ->R ...
- 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)
http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...
- MonoBehaviour Lifecycle(生命周期/脚本执行顺序)
脚本执行顺序 前言 搭建一个示例来验证Unity脚本的执行顺序,大概测试以下部分: 物理方面(Physics) 渲染(Scene rendering) 输入事件(InputEvent) 流程图 Uni ...
- [转]Script标签和脚本执行顺序
Script标签和脚本执行顺序 这里详细聊聊和script标签相关的脚本执行顺序. Script标签的默认行为 几个首要特性: script标签(不带defer或async属性)的会阻止文档渲染.相关 ...
- Unity 继承MonoBehaviour脚本 执行顺序 详解
先看结果 Awake ->OnEnable-> Start ->-> FixedUpdate-> Update -> LateUpdate ->OnGUI ...
- html/css基础篇——link和@inport详解以及脚本执行顺序探讨
先说一说两者之间的异同 两者都可以引用外部CSS的方式,现在主流浏览器两者都支持(ps:@import是CSS2.1提出的),但是存在一定的区别: 1.link是XHTML标签,除了加载CSS外,还可 ...
- unity 脚本执行顺序设置 Script Execution Order Settings
通过Edit->Project Settings->Script Execution Order打开MonoManager面板 或者选择任意脚本在Inspector视图中点击Execu ...
随机推荐
- 二、YARN
一.YARN 介绍 yarn 是下一代 MapReduce,即 MRv2,是在第一代 MapReduce 基础上演变而来的,主要是为了解决原始 Hadoop 扩展性较差,不支持多计算框架而提出的,通俗 ...
- package.json中^,~的区别
https://blog.csdn.net/peaceoncemore/article/details/79195206 "devDependencies": { " ...
- MVC4.0接口学习
/// <summary> /// 正则验证身份证号是否合法 /// </summary> /// <param name="sIdCard"> ...
- hibernate 异常分析:java.lang.NoClassDefFoundError: org/hibernate/Session
原因: NoClassDefFoundError的含义就是说编译器找不到org/hibernate/Session这个类的定义 解决方法: 1.检查java中是否导入hibernate 包 impor ...
- SpringCloud(三)- OpenFeign简介及@FeignClient等注解的使用
唯能极于情,故能极于剑 有问题或错误请及时联系小编或关注小编公众号 "CodeCow",小编一定及时回复和改正,期待和大家一起学习交流 此文由四部分组成(OpenFeign简介.@ ...
- vue中 transition组件使用总结
博客园比较啃爹啊,随笔只能手写,之前写在有道云笔记里面的内容也复制不了,忧伤..... 长话短说,看官方的transition 的讲解,可能是内容太多了,或者就是本人太辣鸡了,看的有点懵逼,但是项目中 ...
- ngnix随笔四
1.alias path 例1. =>http://www.a.com/bbs/ root /data/vhosts/; location /bbs/{ alias /data/a.com/; ...
- 关于如何查看论文是否被SCI或者EI收录
最好的方法,在高校图书馆网站上进行查询. 另外还有就是去对应网站查询: SCI:https://apps.webofknowledge.com/UA_GeneralSearch_input.do?pr ...
- [JavaWeb基础] 005.Hibernate的配置和简单使用
1.Hibernate简介 Hibernate是一个基于Java的开源的持久化中间件,对JDBC做了轻量的封装.采用ORM映射机制,负责实现Java对象和关系数据库之间的映射,把sql语句传给数据库, ...
- pandas的loc与iloc
1. loc是用标签(也就是行名和列名)来查找,标签默认是数字,但也可以通过index参数指定为字符型等其他的类型. 格式是df.loc[行名,列名],如果列标签没有给出,则默认为查找指定行标签的所有 ...