一、添加脚本的顺序

这是一张官方的脚本顺序图

一般,当我们把脚本绑定在游戏对象上时,或者点击绑定好的脚本的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的脚本执行顺序的更多相关文章

  1. 浅谈循环中setTimeout执行顺序问题

    浅谈循环中setTimeout执行顺序问题 (下面有见解一二) 期望:开始输出一个0,然后每隔一秒依次输出1,2,3,4. for (var i = 0; i < 5; i++) { setTi ...

  2. Unity脚本执行顺序自研框架

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/52372611 作者:car ...

  3. unity脚本执行顺序

    Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->R ...

  4. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  5. MonoBehaviour Lifecycle(生命周期/脚本执行顺序)

    脚本执行顺序 前言 搭建一个示例来验证Unity脚本的执行顺序,大概测试以下部分: 物理方面(Physics) 渲染(Scene rendering) 输入事件(InputEvent) 流程图 Uni ...

  6. [转]Script标签和脚本执行顺序

    Script标签和脚本执行顺序 这里详细聊聊和script标签相关的脚本执行顺序. Script标签的默认行为 几个首要特性: script标签(不带defer或async属性)的会阻止文档渲染.相关 ...

  7. Unity 继承MonoBehaviour脚本 执行顺序 详解

    先看结果 Awake ->OnEnable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ...

  8. html/css基础篇——link和@inport详解以及脚本执行顺序探讨

    先说一说两者之间的异同 两者都可以引用外部CSS的方式,现在主流浏览器两者都支持(ps:@import是CSS2.1提出的),但是存在一定的区别: 1.link是XHTML标签,除了加载CSS外,还可 ...

  9. unity 脚本执行顺序设置 Script Execution Order Settings

     通过Edit->Project Settings->Script Execution Order打开MonoManager面板  或者选择任意脚本在Inspector视图中点击Execu ...

随机推荐

  1. vue中mixins的使用方法和注意点(详2)(异步请求的情况)

    当混合里面包含异步请求函数,而我们又需要在组件中使用异步请求函数的返回值时,我们会取不到此返回值,如下: mixin中 组件中 控制台 解决方案:不要返回结果而是直接返回异步函数 mixin中 组件中 ...

  2. Spring + Struts + Hibernate 简单封装通用接口

    1.BaseDao public interface BaseDao<T> { /** * 获取符合条件的记录数 * @param filter * @param sortName * @ ...

  3. Python一切皆是对象,但这和内存管理有什么关系?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python的第15篇文章,我们来聊聊Python中内存管理机制,以及循环引用的问题. Python的内存管理机制 对于工程师而言,内 ...

  4. 关于MySQL数据被删除后空间重用的问题实验

    以前知道,MySQL在通过delete语句删除数据后,空间并不会被腾出,而只是在数据文件中被标记为已删除,除非执行optimize table.前两天听说,虽然delete数据后硬盘空间不会被腾出,但 ...

  5. stm32实现DMX512协议发送与接收(非标)

    最近把玩了一下485,期间也接触了dmx512通信协议,该协议主要用于各种舞台灯光的控制当中,进而实现各种光效以及色彩变化.根据标准的512协议,其物理连接与传统上的RS485是完全一致的,并没有什么 ...

  6. SQL——MySQL数据类型

    Text类型: Number类型: Date类型:

  7. Msql 给结果拼接字符串

    SELECT CONCAT("内容:",info)AS info FROM 表名;

  8. rancher证书过期

    背景 无法打开rancher服务,报错如下截图,可以看出是证书过期了无法连上k8s,注意这里的证书是rancher自身证书并非k8s证书. 解决方法 rancher升级:https://rancher ...

  9. 【asp.net core 系列】2 控制器与路由的恩怨情仇

    0. 前言 在上一篇文章中,我们初步介绍了asp.net core,以及如何创建一个mvc项目.从这一篇开始,我将为大家展示asp.net core 的各种内容,并且尝试带领大家来挖掘其中的内在逻辑. ...

  10. Rocket - util - Replacement

    https://mp.weixin.qq.com/s/zCP7wPuxgQ-r94Tr6BV5iw   简单介绍Replacement的实现.   ​​   1. 基本介绍   用于实现Cache替换 ...