(Editor)以上是Unity官方文档中的截图,脚本在被挂载到物体上,会启用Editor的方法Reset。

(Initialization)当执行脚本开始,初始化的过程中,依次执行的是Awake->OnEnable->Start,这些方法均只被执行一次。

(Physics)接下来执行的方法依次是FixedUpdate->yield WaitForFixedUpdate->内部的物理更新->OnTriggerXXX->OnCollisionXXX,这些方法循环执行,主要用于物理计算过程。

(Input events)再执行完物理部分以后,会执行Input的事件过程(http://docs.unity3d.com/ScriptReference/Input.html),如OnMouseDown等。

(Game logic)Input执行之后的,执行的脚本的逻辑部分,即Update->yield null->yield WaitForSeconds->yield WWW->yield StartCoroutine->动画更新->LateUpdate。

(Scene rendering)执行完成逻辑以后,会执行场景的绘制部分,该部分执行了一连串的绘制操作,OnWillRenderObject->OnPreCull->OnBecameVisible->OnBecameInVisible->OnPreRender->OnRenderObject->OnPostRender->OnRenderImage。

(Gizmo rendering)接下来的执行顺序到了OnDrawGizmos,此过程仅在Editor模式下执行。

(GUI rendering)在此过程,OnGUI的方法每帧会被执行多次。

(End of frame)每帧结束调用的方法,即yield WaitForEndOfFrame。

(Pausing)当帧停止时,执行OnApplicationPause方法,当继续执行后直接从Start之后的方法继续执行。

(Disable/enable)脚本禁用时,执行Ondisable方法,如果脚本在此开启,则从OnEnable处继续执行,也就是说还会重新执行一次Start方法。

(Decommissioning)当脚本被吊销,最后执行OnDestroy方法,最后是程序退出。

  以上过程就是脚本的整个生命周期,里边的每个阶段需要关注一下,以前了解的不够直观,争取以后能用到这些。这里还需要注意一个点,就是如果每个脚本都有Awake方法,具体哪个脚本的Awake方法先执行呢,这里可以通过Unity进行设置,通过Edit->Project Settings->Script Execution Order菜单进行设置,脚本后面的数字越小,脚本越靠上,也就越先执行,其中的DefaultTime表示没有设置脚本的执行顺序的执行顺序。


  接下来从别人的博客借鉴过来的,从项目文件中分析脚本的编译顺序,中途涉及到了特殊文件夹,希望能对大家有用。(作者地址:http://www.cnblogs.com/champ/p/execorder.html)

  关于脚本的编译顺序,官方的说法有点模糊,官方的解释如下:

  由于脚本的编译顺序会涉及到特殊文件夹,比如上面提到的Plugins、Editor还有Standard Assets等标准的资源文件夹,所以脚本的放置位置就非常重要了。下面用一个例子来说明不同文件夹中的脚本的编译顺序:

  实际上,如果你细心的话会发现,如果在你的项目中建立如上图所示的文件夹层次结构时,编译项目之后会在项目文件夹中生成一些文件名中包含Editor、firstpass这些字样的项目文件。比如按照上图的文件夹结构,我们打开项目文件夹来看一下产生的项目文件是什么样的?

  下面就来详细探讨一下这些个字样是什么意思?它们与脚本的编译顺序有着怎样的联系?

1、首先从脚本语言类型来看,Unity3d支持3种脚本语言,都会被编译成CLI的DLL

  如果项目中包含有C#脚本,那么Unity3D会产生以Assembly-CSharp为前缀的工程,名字中包含”vs”的是产生给Vistual Studio使用的,不包含”vs”的是产生给MonoDevelop使用的。

项目中的脚本语言 工程前缀 工程后缀
C# Assembly-CSharp csproj
UnityScript Assembly-UnityScript unityproj
Boo Assembly-Boo booproj

  如果项目中这三种脚本都存在,那么Unity将会生成3种前缀类型的工程。

2、对于每一种脚本语言,根据脚本放置的位置(其实也部分根据脚本的作用,比如编辑器扩展脚本,就必须放在Editor文件夹下),Unity会生成4中后缀的工程。其中的firstpass表示先编译,Editor表示放在Editor文件夹下的脚本。

  在上面的示例中,我们得到了两套项目工程文件:分别被Virtual Studio和MonoDevelop使用(后缀包不包含vs),为简单起见,我们只分析vs项目。得到的文件列表如下: 
  Assembly-CSharp-filepass-vs.csproj 
  Assembly-CSharp-Editor-filepass-vs.csproj 
  Assembly-CSharp-vs.csproj 
  Assembly-CSharp-Editor-vs.csproj

  根据官方的解释,它们的编译顺序如下: 
  (1)所有在Standard Assets、Pro Standard Assets或者Plugins文件夹中的脚本会产生一个Assembly-CSharp-filepass-vs.csproj文件,并且先编译; 
  (2)所有在Standard Assets/Editor、Pro Standard Assets/Editor或者Plugins/Editor文件夹中的脚本产生Assembly-CSharp-Editor-filepass-vs.csproj工程文件,接着编译; 
  (3)所有在Assets/Editor外面的,并且不在(1),(2)中的脚本文件(一般这些脚本就是我们自己写的非编辑器扩展脚本)会产生Assembly-CSharp-vs.csproj工程文件,被编译; 
  (4)所有在Assets/Editor中的脚本产生一个Assembly-CSharp-Editor-vs.csproj工程文件,被编译。之所以按照这样建立工程并按此顺序编译,也是因为DLL间存在的依赖关系所决定的。

  

Unity中脚本的执行顺序总结(@WhiteTaken)的更多相关文章

  1. 【转】Unity3D中脚本的执行顺序和编译顺序

    支持原文,原文请戳: Unity3D中脚本的执行顺序和编译顺序 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与脚本有关的也就是编译和执行啦 ...

  2. Unity3D中脚本的执行顺序和编译顺序

    http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与 ...

  3. 【转】Unity3D中脚本的执行顺序和编译顺序(vs工程引用关系)

    http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与 ...

  4. (转)Unity3D中脚本的执行顺序和编译顺序(vs工程引用关系)

    自:http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行 ...

  5. Postman集合/文件夹/请求中脚本的执行顺序

    Postman的Collection(集合)/Folder(集合的子文件夹)/Request(请求)中都有Pre-request Script(请求前脚本)和Tests(请求后脚本) 这个功能类似于不 ...

  6. 5. Unity脚本的执行顺序

    Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不同的游戏对象身上,他们各自都在执行自己的生命周期感觉像是多线程,并行执行脚本的, ...

  7. (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)

    http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不 ...

  8. jquery中各个事件执行顺序如下:

    jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...

  9. 我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序

    大家好,今天我们来讲一个笔试和面试偶尔都会问到的问题,并且在工作中不知道原理,也会造成滥用. 大家可能都知道,try 块用来捕获异常,catch块是处理try块捕获的异常,finally 块是用来关闭 ...

随机推荐

  1. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup

    开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...

  2. 中文分词工具探析(一):ICTCLAS (NLPIR)

    1. 前言 ICTCLAS是张华平在2000年推出的中文分词系统,于2009年更名为NLPIR.ICTCLAS是中文分词界元老级工具了,作者开放出了free版本的源代码(1.0整理版本在此). 作者在 ...

  3. 「译」JUnit 5 系列:基础入门

    原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...

  4. HTML5应用程序缓存Application Cache

    什么是Application Cache HTML5引入了应用程序缓存技术,意味着web应用可进行缓存,并在没有网络的情况下使用,通过创建cache manifest文件,可以轻松的创建离线应用. A ...

  5. ES5概述(ECMAScript262/5.1)

    ES5概述(ECMAScript262/5.1) 本文参考:ES5概述 ECMAScript 是基于对象的: 基本语言和宿主设施都由对象提供,ECMAScript 程序是一组可通信的对象.ECMASc ...

  6. 百度地图隐藏BMKAnnotationView

    BMKAnnotationview.hidden 失效,只能移除Annotation BMKPinAnnotationView设置setHidden为yes时不能隐藏

  7. 安卓开发树形控件之ExpandableListView(一)

    这个例子非常简单,简单到一个初学者都能随便开发出来,今天的目的仅仅只是为了将效果实现出来,如果想深入这里有几篇非常不错的博客: Android 之ExpandableListView几个特殊的属性 h ...

  8. ASP.NET MVC 3 网站优化总结(一) 使用 Gzip 压缩

    网站开启 Gzip 压缩的好处相信很多人都已经清楚,这样做可以提高网站的性能.那么为什么很多网站没有开启 Gzip 压缩功能呢?原因有4点:防病毒软件.浏览器 bug.网站代理和服务器未配置. 使用 ...

  9. 排序 order by 的用法

    order by  跟在select* from 后面 order by 默认的是升序, asc 升序  desc 降序 select * from 表名 order by  字段名  asc 在带有 ...

  10. 使用Java实现单线程模式

    我们都知道单例模式,有很多种实现方法.今天我们实现一个单线程实例模式,也就是说只能实例化该类的一个线程来运行,不允许有该类的多个线程实例存在.直接上代码: public class Singleton ...