Unity-MonoBehaviour运行周期

MonoBehaviour是Unity中非常重要的一个类,游戏逻辑、资源管理以及画面渲染等都离不开这个类。MonoBehaviour为我们提供了许多的内置函数来实现我们的各种需要。例如AwakeStartUpdate等都是常见的函数,下面会介绍各个重要函数以及其在整个运行周期里的功能。根据不同函数调用次数可以分为:

只调用一次的函数

Awake

Awake函数在脚本实例加载时调用

Start

Update函数第一次被调用前调用

根据情况触发的函数

OnEnable

当MonoBehaviour的状态变为enabled时触发

OnDisable

当MonoBehaviour的状态变为disabled时触发

OnBecameVisible

当MonoBehaviour附加的渲染器被任何的Camera视为可见时触发

OnBecameInvisible

当MonoBehaviour附加的渲染器被任何的Camera视为不可见时触发

OnDestroy

当MonoBehaviour即将被销毁时触发

OnLevelWasLoaded

当新关卡被载入时触发

会定时调用的函数

FixedUpdate

当MonoBehaviour处于enabled状态时,间隔指定的时间调用

Update

当MonoBehaviour处于enabled状态时,每帧调用

LateUpdate

当MonoBehaviour处于enabled状态时,在所有Update函数调用后被调用

重要函数执行顺序

一个对象创建过程

接下来分析下几个重要函数在一个对象的执行顺序,在开发过程中比较常见的有:Awake, OnEnable, Start, Update, LateUpdate.先用一个脚本ScriptA测试一下。

using UnityEngine;
using System.Collections;

public class ScriptA : MonoBehaviour {

    void Awake()
    {
        Debug.Log("Awake");
    }

    void Start () {
        Debug.Log("Start");
    }

    void OnEnable()
    {
        Debug.Log("OnEnable");
    }
    
    void Update ()
    {
        Debug.Log("Update");
    }

    void LateUpdate()
    {
        Debug.Log("Late Update");
    }
}

执行结果如下图:


常用函数执行顺序

从图中可以看到脚本是按着这样的顺序执行的:Awake->OnEnable->Start->Update->LateUpdate.

多个对象创建过程

接下来创建两个物体GameObject A 和 GameObject B,都挂上之前的ScriptA脚本(在函数中打印物体的名字)。然后Play。结果如下:


多个对象的情况

从结果可以看到GameObject B在 执行完AwakeOnEnable后才执行GameObjectA的AwakeOnEnable函数。
这里主要的原因是Unity在初始化实例时会先调用Awake然后若实例为Enable则紧接着调用该实例的OnEnable方法,接着就是执行别的实例的Awake方法及其OnEnable方法。

多个对象销毁过程

将ScriptA改为如下:

using UnityEngine;
using System.Collections;

public class ScriptA : MonoBehaviour {

    void Awake()
    {
        Debug.Log("Awake:" + gameObject.name);
    }

    void Start () {
        Debug.Log("Start:" + gameObject.name);

        Debug.Log("Destroy GameObject~");

        Destroy(gameObject);
    }

    void OnEnable()
    {
        Debug.Log("OnEnable:" + gameObject.name);
    }

    void OnDisable()
    {
        Debug.Log("OnDisable: " + gameObject.name);
    }

    void OnDestroy()
    {
        Debug.Log("OnDestroy: " + gameObject.name);
    }
}

然后执行后得到以下结果:


多个对象销毁过程

高亮部分对GameObject B进行了Destroy操作,可以看到调用后立刻执行了GameObject B的OnDisable函数。之后才执行GameObject A的Start函数。最后执行OnDestroy函数。销毁时: OnDisable->OnDestroy

从以上结果可以看出OnEnable/OnDisable函数在实例实例创建后会即刻执行(OnEnable是在Awake后执行)。

多个脚本的执行情况

对于多个脚本如果在未指定Execution Order的情况下执行顺序是随机的,我们可以在Edit->Project Setting->Script Execution Order窗体中进行设置,值越小,越先执行。(从脚本的Inspector界面里面的Execution Order也可以打开)

通过Inspector打开

通过设置脚本的顺序值就可以达到控制脚本执行顺序的作用,如图中我们给ScriptA设置了100,给ScriptB设置了200.


设置脚本的顺序值

接下来编写简单的脚本的执行情况:


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

推荐阅读更多精彩内容