脚本生命周期流程图

加载第一个场景

场景开始时将调用以下函数(为场景中的每个对象调用一次)。

  • Awake:始终在任何 Start 函数之前并在实例化预制件之后调用此函数。(如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用Awake。)
  • OnEnable:(仅在对象处于激活状态时调用)在启用对象后立即调用此函数。在创建 MonoBehaviour实例时(例如加载关卡或实例化具有脚本组件的游戏对象时)会执行此调用。
  • OnLevelWasLoaded:执行此函数可告知游戏已加载新关卡。 请注意,对于添加到场景中的对象,在为任何对象调用 Start 和 Update 等函数之前,会为所有脚本调用 Awake 和 OnEnable 函数。当然,在游戏运行过程中实例化对象时,不能强制执行此调用。

Editor

  • Reset:调用 Reset 可以在脚本首次附加到对象时以及使用 Reset 命令时初始化脚本的属性。

在第一次帧更新之前

  • Start:仅当启用脚本实例后,才会在第一次帧更新之前调用 Start。

对于添加到场景中的对象,在为任何脚本调用 Update 等函数之前,将在所有脚本上调用 Start 函数。当然,在游戏运行过程中实例化对象时,不能强制执行此调用。

帧之间

  • OnApplicationPause:在帧的结尾处调用此函数(在正常帧更新之间有效检测到暂停)。在调用 OnApplicationPause 之后,将发出一个额外帧,从而允许游戏显示图形来指示暂停状态。

更新顺序

跟踪游戏逻辑和交互、动画、摄像机位置等的时候,可以使用一些不同事件。常见方案是在 Update 函数中执行大多数任务,但是也可以使用其他函数。

  • FixedUpdate:调用 FixedUpdate 的频度常常超过Update。如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。在 FixedUpdate 之后将立即进行所有物理计算和更新。在 FixedUpdate 内应用运动计算时,无需将值乘以 Time.deltaTime。这是因为 FixedUpdate 的调用基于可靠的计时器(独立于帧率)。
  • Update:每帧调用一次 Update。这是用于帧更新的主要函数。
  • LateUpdate:每帧调用一次 LateUpdate__(在 Update__ 完成后)。LateUpdate 开始时,在Update 中执行的所有计算便已完成。LateUpdate 的常见用途是跟随第三人称摄像机。如果在 Update内让角色移动和转向,可以在 LateUpdate 中执行所有摄像机移动和旋转计算。这样可以确保角色在摄像机跟踪其位置之前已完全移动。

动画更新循环

Unity 评估动画系统时,将调用以下函数和 Profiler 标记。

  • OnStateMachineEnter:在状态机更新 (State Machine Update) 步骤中,当控制器的状态机进行流经 Entry 状态的转换时,将在第一个更新帧上调用此回调。在转换到 StateMachine 子状态时不会调用此回调。
    仅当动画图中存在控制器组件(例如,AnimatorController、AnimatorOverrideController 或 AnimatorControllerPlayable)时才会发生此回调。
    注意:将此回调添加到 StateMachineBehaviour 组件会禁用多线程的状态机评估。
  • OnStateMachineExit:在状态机更新 (State Machine Update) 步骤中,当控制器的状态机进行流经 Exit 状态的转换时,将在最后一个更新帧上调用此回调。在转换到 StateMachine 子状态时不会调用此回调。
    仅当动画图中存在控制器组件(例如,AnimatorController、AnimatorOverrideController 或 AnimatorControllerPlayable)时才会发生此回调。
    注意:将此回调添加到 StateMachineBehaviour 组件会禁用多线程的状态机评估。
  • 触发动画事件 (Fire Animation Events):调用在上次更新时间和当前更新时间之间采样的所有剪辑中的所有动画事件。
  • StateMachineBehaviour(OnStateEnter/OnStateUpdate/OnStateExit):一个层最多可以有 3个活动状态:当前状态、中断状态和下一个状态。使用一个定义 OnStateEnter、OnStateUpdate 或 OnStateExit 回调的 StateMachineBehaviour 组件为每个活动状态调用此函数。
    依次针对当前状态、中断状态和下一个状态调用此函数。
    仅当动画图中存在控制器组件(例如,AnimatorController、AnimatorOverrideController 或 AnimatorControllerPlayable)时才会执行此步骤。
  • OnAnimatorMove:在每个更新帧中为每个 Animator 组件调用一次此函数来修改根运动 (Root Motion)。
  • StateMachineBehaviour(OnStateMove):使用定义此回调的 StateMachineBehaviour在每个活动状态中调用此函数。
  • OnAnimatorIK:设置动画 IK。为每个启用 IK pass 的 Animator Controller 层进行一次此调用。
    仅当使用人形骨架时才会执行此事件。
  • StateMachineBehaviour(OnStateIK):使用在启用 IK pass 的层上定义此回调的StateMachineBehaviour 组件在每个活动状态中调用此函数。
  • WriteProperties:从主线程将所有其他动画属性写入场景。

有用的性能分析标记

脚本生命周期流程图中显示的某些动画函数不是可以调用的事件函数;它们是 Unity 处理动画时调用的内部函数。

这些函数具有 Profiler 标记,因此您可以使用 Profiler 查看 Unity 在帧中调用这些函数的时间。知道 Unity 调用这些函数的时间有助于准确了解所调用的事件函数的具体执行时间。

例如,假设在 FireAnimationEvents 回调中调用 Animator.Play。如果知道只有在执行状态机更新 (State Machine Update) 和流程图 (Process Graph) 函数后才会触发 FireAnimationEvents 回调,就可以预期动画剪辑会在下一帧播放,而不是马上播放。

  • 状态机更新 (StateMachineUpdate):在执行序列的此步骤中评估所有状态机。仅当动画图中存在控制器组件(例如,AnimatorController、AnimatorOverrideController 或 AnimatorControllerPlayable)时才会发生此回调。
    注意:状态机评估通常是多线程的,但添加某些回调(例如,OnStateMachineEnter 和 OnStateMachineExit)会禁用多线程。请参数上文的动画更新循环以了解详细信息。
  • ProcessGraph:评估所有动画图。此过程包括对需要评估的所有动画剪辑进行采样以及计算根运动 (Root Motion)。
  • ProcessAnimation:混合动画图的结果。
  • WriteTransforms:将所有动画变换从工作线程写入场景。
    如果一个人形骨架的多个层启用了 IK pass,则该人形骨架可以有多个 WriteTransforms 通道(请参阅脚本生命周期流程图)。

Rendering

  • OnPreCull:在摄像机剔除场景之前调用。剔除操作将确定摄像机可以看到哪些对象。正好在进行剔除之前调用 OnPreCull。
  • OnBecameVisible/OnBecameInvisible:对象变为对任何摄像机可见/不可见时调用。
  • OnWillRenderObject:如果对象可见,则为每个摄像机调用一次。
  • OnPreRender:在摄像机开始渲染场景之前调用。
  • OnRenderObject:所有常规场景渲染完成之后调用。此时,可以使用 GL 类或 Graphics.DrawMeshNow 来绘制自定义几何形状。
  • OnPostRender:在摄像机完成场景渲染后调用。
  • OnRenderImage:在场景渲染完成后调用以允许对图像进行后处理,请参阅后期处理效果。
  • OnGUI:每帧调用多次以响应 GUI 事件。首先处理布局和重新绘制事件,然后为每个输入事件处理布局和键盘/鼠标事件。
  • OnDrawGizmos 用于在场景视图中绘制辅助图标以实现可视化。

协程

Update 函数返回后将运行正常协程更新。协程是一个可暂停执行 (yield) 直到给定的 YieldInstruction 达到完成状态的函数。 协程的不同用法:

  • yield 在下一帧上调用所有 Update 函数后,协程将继续。
  • yield WaitForSeconds 在为帧调用所有 Update 函数后,在指定的时间延迟后继续协程
  • yield WaitForFixedUpdate 在所有脚本上调用所有 FixedUpdate 后继续协程
  • yield WWW 在 WWW 下载完成后继续。
  • yield StartCoroutine 将协程链接起来,并会等待 MyFunc 协程先完成。

销毁对象时

  • OnDestroy:对象存在的最后一帧完成所有帧更新之后,调用此函数(可能应 Object.Destroy 要求或在场景关闭时销毁该对象)。

退出时

在场景中的所有活动对象上调用以下函数:

  • OnApplicationQuit:在退出应用程序之前在所有游戏对象上调用此函数。在编辑器中,用户停止播放模式时,调用函数。
  • OnDisable:行为被禁用或处于非活动状态时,调用此函数。

unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期相关推荐

  1. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )

    文章目录 一.Groovy 脚本中调用另外一个 Groovy 脚本 1.调用 evaluate 方法执行 Groovy 脚本 2.参数传递 二.完整代码示例 1.调用者 Groovy 脚本 2.被调用 ...

  2. shell实例第19讲:一个脚本中调用另一个脚本的3种方法

    在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...

  3. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  4. 在 Shell 脚本中调用另一个 Shell 脚本的三种方式

    先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh s ...

  5. linux shell脚本中调用另一个shell脚本

    先来说一下主要以下有几种方式: 1.fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. 2.exec: exec path/to/foo. ...

  6. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 绑定作用域 binding 变量分析 | Binding 类 variables 成员分析 )

    文章目录 一.绑定作用域 binding 变量分析 二.Binding 类 variables 成员分析 三.完整代码示例 1.调用者 Groovy 脚本 2.被调用者 Groovy 脚本 3.执行结 ...

  7. 【linux】Shell脚本中调用另外一个脚本的方法

    在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一 ...

  8. linux fork脚本,在Shell脚本中调用另一个脚本的三种方式讲解

    先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh s ...

  9. 【Shell】Shell脚本中调用另一个脚本的三种方式(fork/exec/source)

    先来说一下主要以下有几种方式: (1)fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. (2)exec: exec path/to/fo ...

最新文章

  1. qlist length 函数讲解_读《JavaScript 轻量级函数式编程》
  2. [转] 使用nginx sticky实现基于cookie的负载均衡
  3. Linux---系统日志
  4. 解决 wcf HTTP 无法注册 另一应用程序正在使用 TCP 端口 80
  5. Python- 反射 及部份内置属性方法
  6. vi执行Linux命令,如何从Vim中访问shell或运行外部命令
  7. MyBatis第四天
  8. 转dem_约会大作战:真那离开DEM社,欠着的500万就不用还了
  9. Android编程获取手机型号,本机电话号码,sdk版本及firmware版本号(即系统版本号)...
  10. freeBSD的vi
  11. Go语言之高级篇beego框架之参数配置与路由配置
  12. 数据结构与算法--Tree(二叉树、B±树、红黑树)
  13. TortoiseGit 安装
  14. C语言的常用字符串操作函数(一)
  15. Bootstrap(5)栅格系统
  16. python—day01_环境安装
  17. struts2第一个程序的详解(配图)
  18. 华为云认证报名条件是什么?考试去哪里考?
  19. 十折交叉验证python_Python机器学习:6.2 K折交叉验证评估模型性能
  20. Windows10键盘快捷键大全

热门文章

  1. 浅析ASP.NET的Page.IsPostBack 属性http://www.sina.com.cn 2008年05月06日 11:33 IT168.com
  2. leetCode-第四题求两个数组的中位数
  3. 二进制转十进制-栈的方式实现
  4. Head First JSP---随笔八(传统标记)
  5. Spring boot使用Rabbitmq注解及消息序列化
  6. 操作系统(九)进程控制
  7. STM32F4 HAL库开发 -- SPI Flash
  8. C语言再学习 -- 结构和其他数据形式
  9. Java网络编程之IP地址和InetAddress类
  10. VNC over reverse SSH