Unity中脚本的执行顺序总结(@WhiteTaken)

(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)的更多相关文章
- 【转】Unity3D中脚本的执行顺序和编译顺序
支持原文,原文请戳: Unity3D中脚本的执行顺序和编译顺序 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与脚本有关的也就是编译和执行啦 ...
- Unity3D中脚本的执行顺序和编译顺序
http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与 ...
- 【转】Unity3D中脚本的执行顺序和编译顺序(vs工程引用关系)
http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与 ...
- (转)Unity3D中脚本的执行顺序和编译顺序(vs工程引用关系)
自:http://www.cnblogs.com/champ/p/execorder.html 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行 ...
- Postman集合/文件夹/请求中脚本的执行顺序
Postman的Collection(集合)/Folder(集合的子文件夹)/Request(请求)中都有Pre-request Script(请求前脚本)和Tests(请求后脚本) 这个功能类似于不 ...
- 5. Unity脚本的执行顺序
Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不同的游戏对象身上,他们各自都在执行自己的生命周期感觉像是多线程,并行执行脚本的, ...
- (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不 ...
- jquery中各个事件执行顺序如下:
jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...
- 我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序
大家好,今天我们来讲一个笔试和面试偶尔都会问到的问题,并且在工作中不知道原理,也会造成滥用. 大家可能都知道,try 块用来捕获异常,catch块是处理try块捕获的异常,finally 块是用来关闭 ...
随机推荐
- 1.C#WinForm基础制作简单计算器
利用c#语言编写简单计算器: 核心知识点: MessageBox.Show(Convert.ToString(comboBox1.SelectedIndex));//下拉序号 MessageBox.S ...
- SharePoint2013 显示网站菜单中设计管理器功能
当部署完SharePoint2013后,并创建了对应的网站集,就开始试图去按照企业VI(Visual Identity)来定制站点的布局.色彩.字体等等的页面元素.可是,在站点的设置菜单中,默认没有“ ...
- 安装nodejs express框架时express命令行无效
我也是看了这篇才明白.http://jingyan.baidu.com/article/922554468a3466851648f419.html 最近在看一本书,nodejs开发指南.至于出现这个问 ...
- MFC&Halcon之实时视频监控
上一篇实现了在MFC的窗体内显示图片,本篇介绍如何在MFC窗体内实时显示摄像头的影像. 要实现的功能是点击一个“开始”按钮,可以显示影像,再点击“停止”按钮,可以停止显示. 因为实时显示影像需要在一个 ...
- WinForm 调用 PrintDocument
使用WinForm 打印 Devexpress BarCodeControl 二维码 /// <summary> /// Handles the ItemClick event of th ...
- java基础知识总结(1)
定义类: 访问修饰符 class 类名{ } 访问修饰符如:public .priate是可选的 class是声明类的关键字 按照命名规范,类名首字母大写 例:创建“人”类,关键代码: pub ...
- spider 配置文件参考
spider有一个配置文件spider.xml,为xml格式,spider.xml采用DTD进行管理,用于管理spider的所有特性.路由.高可用等. 配置文件支持三种不同的方式进行指定: 1. 通过 ...
- getting started with transformjs
Introduction In the past two years, more and more friends for mobile web development have used the t ...
- 详解Paint的setXfermode(Xfermode xfermode)
一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是 ...
- iOS系统分析(二)Mach-O二进制文件解析
➠更多技术干货请戳:听云博客 0x01 Mach-O格式简单介绍 Mach-O文件格式是 OS X 与 iOS 系统上的可执行文件格式,类似于windows的 PE 文件 与 Linux(其他 Un ...