zoukankan      html  css  js  c++  java
  • Unity中脚本的执行顺序总结(@WhiteTaken)

    unity中脚本执行顺序

    (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间存在的依赖关系所决定的。

      

  • 相关阅读:
    docker in docker
    docker社区的geodata/gdal镜像dockerfile分析
    howto:在构建基于debian的docker基础镜像时,更换国内包源
    使用Visual Studio 2017构建.Net Core的Docker镜像
    步骤:asp.net core中使用identifyserver4颁发令牌
    部署:阿里云ECS部署Docker CE
    问题:调用 ASP.Net Core WebAPI的HTTP POST方法时,从 [FromBody] 中读取的 MongoDB GeoJsonObjectModel成员总是null
    《.NET 微服务:适用于容器化 .NET 应用的体系结构》关键结论
    SQL数据库注入防范 ASP.NET Globle警告
    数据库中的恶意字符批处理
  • 原文地址:https://www.cnblogs.com/WhiteTaken/p/6253185.html
Copyright © 2011-2022 走看看