Unity 事件函数的执行顺序

翻译自 Unity 官方文档

在 Unity 脚本中,有许多事件函数在脚本执行时按预定的顺序执行。这个执行顺序如下所述:

首个场景加载

这些函数在场景开始时调用(对于场景中的每个对象调用一次)。

  • Awake:在所有 Start 函数之前,以及 prefab 实例化之后调用。(如果一个 GameObject 在启动期间处于非活动状态,则在激活之前不会调用它。)
  • OnEnable(仅在对象处于活动状态时调用):在对象启用后调用。这发生在创建 MonoBehaviour 实例时,例如加载关卡或实例化带有脚本组件的 GameObject 时。
  • OnLevelWasLoaded:执行此函数是为了通知游戏已加载新关卡。

注意,对于添加到场景中的对象,所有脚本的 AwakeOnEnable 函数都将在任何一个脚本调用 StartUpdate 等之前调用。当然,对于在游戏过程中已被实例化的对象,这些函数并不能强制执行。

编辑器

  • Reset:当脚本的属性首次附加到对象时,以及使用 Reset 命令时,调用该函数来初始化脚本的属性。

第一帧之前

  • Start:只有在脚本实例被启用时,才会在第一个帧更新之前调用 Start

对于添加到场景中的对象,所有脚本的 Start 函数在 Update 等函数之前调用。当然,对于在游戏过程中已被实例化的对象,这个函数并不能强制执行。

帧间

  • OnApplicationPause:在检测到暂停的帧的末尾调用,在正常帧更新之间有效。在调用 OnApplicationPause之后,将会发出一个额外的帧,以允许游戏显示暂停状态的图形。

更新顺序

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

  • FixedUpdateFixedUpdate 通常比 Update 更频繁地被调用。如果帧率很低,它可以在每帧中调用多次;如果帧率很高,它也可能根本不会在帧之间被调用。所有物理计算和更新在 FixedUpdate 调用后立即发生。在 FixedUpdate 中应用移动计算时,不需要将值乘以 Time.deltaTime。这是因为 FixedUpdate 是在一个可靠的定时器上调用的,与帧率无关。
  • Update:每帧调用一次 Update。它是帧更新的主要主力函数。
  • LateUpdate:在 Update 调用完成后,每帧调用一次 LateUpdate。在 Update 中执行的任何计算都将在 LateUpdate 开始之前完成。LateUpdate 的一个常用功能是第三人称视角跟随相机。如果角色在 Update 中发生移动和旋转,那么相机的移动和旋转就应该在 LateUpdate 中发生。这将确保角色在摄像机跟踪其位置之前已经移动完成。

渲染

  • OnPreCull:在摄像机对场景进行剔除前被调用。剔除动作决定了哪些对象对相机可见。OnPreCull 在进行剔除动作之前调用。
  • OnBecameVisible/OnBecameInvisible:当对象对任意相机可见/不可见时调用。
  • OnWillRenderObject:如果对象可见,则每个相机调用一次
  • OnPreRender:在相机开始渲染场景之前调用。
  • OnRenderObject:在所有常规场景渲染完成后调用。此时可以使用 GL 类或 Graphics.DrawMeshNow 来绘制自定义几何图形。
  • OnPostRender:在相机完成对场景的渲染后调用。
  • OnRenderImage:在场景渲染完成后调用,允许对图像进行后处理。
  • OnGUI:响应 GUI 事件,每帧调用多次。首先处理布局和重绘事件,然后为每个输入事件处理布局和键盘/鼠标事件。
  • OnDrawGizmos:用于在 scene 视图中绘制 Gizmo。

协程

一般的协程更新在 Update 函数返回后运行。协程是一个函数,它可以暂停执行(yield),直到给定的 YieldInstruction 完成。协程的不同用法:

  • yield:下一帧的所有 Update 函数被调用后,协程继续。
  • yield WaitForSeconds:延时特定时间后,在当前帧所有 Update 函数被调用之后继续。
  • yield WaitForFixedUpdate:在所有脚本的 FixedUpdate 被调用后继续。
  • yield WWW:在一个 WWW 下载完成后继续。
  • yield StartCoroutine:将协程链起来,并等待 MyFunc协程首先完成。

对象被销毁

  • OnDestroy:在对象存在的最后一帧的所有更新之后调用(对象可能在会响应 Object.Destroy 时或在场景结束时被销毁)。

退出

这些函数会调用场景中的所有活动对象:

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

脚本生命周期流程图

下图总结了脚本生命周期中事件函数的排序和重复。

脚本生命周期流程图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343