unity3d中脚本生命周期(MonoBehaviour lifecycle)

转载 2015年07月10日 14:07:25

最近在做一个小示例,发现类继承于MonoBehaviour的类,有很多个方法,于是乎必然要问出一个问题:这么多个方法,执行先后顺序是如何的呢?内部是如何进行管理的呢?于是在网上找了许多资料,发现了Richard Fine在2012年就已经发布了一篇文章,而且讲得算是相当深入,并且很有道理的,这里加上我的一些尝试与思考,分享给大家。

先贴上图,大家有个直观认识:




接下来,做出一下讲解:最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=false,如果这样做了,则会直接跳转到OnDisable方法执行一次,然后其它的任何方法,都将不再被执行。

如果当前脚本处于可用状态,则正常的执行顺序是继续向下执行OnEnable,当然我们可以在另外一个脚本中实现这个脚本组件的启动:this.enab=true;

再向下执行,会进行一个判断,如果Start方法还没有被执行,则会被执行一次,如果已经被执行了,则不会再被执行。这是个什么意思呢?我们可以在某个脚本中将组件禁用this.enable=false,再启用时会转到OnEnable处执行,这时继续向下走,发现Start执行过了,将不再被执行。比如说:第一次启用时,将怪物的初始位置定在了(0,0,0)点,然后怪物可能会发生了位置的变换,后来被禁用了,再次启用时,不会让怪物又回到初始的(0,0,0)位置。

继续向后执行,就是Update了,然后是FixUpdate,再然后是LateUpdate,如果后面写了Reset,则会又回到Update,在这4个事件间可以进行循环流动。

再向后执行,就进入了渲染模块(Rendering),非常重要的一个方法就是OnGUI,用于绘制图形界面。当然,如果你使用了NGUI,这个生命周期的事情你就不用考虑了。

再向后,就是卸载模块(TearDown),这里主要有两个方法OnDisable与OnDestroy。当被禁用(enable=false)时,会执行OnDisable方法,但是这个时候,脚本并不会被销毁,在这个状态下,可以重新回到OnEnable状态(enable=true)。当手动销毁或附属的游戏对象被销毁时,OnDestroy才会被执行,当前脚本的生命周期结束。


特别要强调的是:这里虽然可以使用C#来写代码,但是这个类构造对象的生命周期,与MonoBehaviour的生命周期,是完全不同的。


可以通过如下示例:对脚本进行验证(两个脚本添加到同一个游戏对象上):

脚本1Monster1:

    void OnBecameInvisible()
    {
        Debug.Log("invisible");
        MonsterController mc1 = this.gameObject.GetComponent<MonsterController>();
        mc1.enabled = false;
    }


    void OnBecameVisible()
    {
        Debug.Log("visible");
        MonsterController mc1 = this.gameObject.GetComponent<MonsterController>();
        mc1.enabled = true;
    }

脚本2MonsterController:

    void Awake()
    {
        Debug.Log("awake");
        this.enabled = false;
    }


    void OnEnable()
    {
        Debug.Log("enable");
        this.enabled = true;
    }


    void Start()
    {
        Debug.Log("start");
        //this.gameObject.SetActive(false);
    }


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


    void OnGUI()
    {
        Debug.Log("gui");
    }
    void OnDisable()
    {
        Debug.Log("disable");
    }


    void OnDestroy()
    {
        Debug.Log("destroy");
    }


如果您觉得有不对之处,欢迎指正,为了技术进步,我们一起努力。

unity3d中脚本生命周期(MonoBehaviour lifecycle)

unity3d开发游戏真是一个好东西,但是不会写脚本真是一件悲哀的事情。脚本写出来了,可是脚本中那么多方法是怎么执行的呢?接下来咱们一起讨论一下MonoBehaviour的生命周期life cycle...
  • qitian67
  • qitian67
  • 2014年01月19日 21:48
  • 38291

MonoBehaviour生命周期

MonoBehaviour是Unity中所有脚本的基类,如果你使用JS的话,脚本会自动继承MonoBehaviour。如果使用C#的话,你需要显式继承MonoBehaviour。 在我们使用Mono...
  • wangyongfei123
  • wangyongfei123
  • 2015年10月12日 10:05
  • 1900

Unity3D脚本(MonoBehaviour)生命周期

场景中有2个物体:A,B 每个物体上绑定2个脚本:A,B 初始化log: Object : A , Script : B , Message : Awake Object : A , ...
  • aijingsun
  • aijingsun
  • 2014年04月23日 16:42
  • 1804

Unity_一张图看懂MonoBehaviour的生命周期

Unity_一张图看懂MonoBehaviour的生命周期
  • husheng0
  • husheng0
  • 2015年08月31日 22:26
  • 2030

Unity3D脚本(MonoBehaviour)生命周期分析

欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌...
  • book_longssl
  • book_longssl
  • 2014年11月01日 22:31
  • 613

Unity3D MonoBehaviour Lifecycle

 Notes Supposing your scene starts at frame 0 (or an object gets activated, or a component get...
  • Game_jqd
  • Game_jqd
  • 2014年09月01日 16:41
  • 1292

Unity3d 中 MonoBehaviour 生命周期

MonoBehaviour Mono行为    一个游戏组件的脚本有一个生命周期——一开始实例化,直到结束实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状态;对于活动,对用户有...
  • tintick
  • tintick
  • 2013年03月29日 16:34
  • 751

Unity 脚本基类 MonoBehaviour 与 GameObject 的关系

MonoBehaviour 是 Unity 中所有脚本的基类,如果你使用JS的话,脚本会自动继承MonoBehaviour。如果使用C#的话,你需要显式继承MonoBehaviour。...
  • hihozoo
  • hihozoo
  • 2017年03月27日 12:55
  • 1774

【构】框架中如何对待MonoBehaviour脚本

最近在重构局内逻辑,发现很多核心类直接继承自MonoBehaviour,挂在prefab上,其导致很多问题。到底是prefab上面挂脚本,还是脚本中包含prefab,其实这个问题,从自己接触unity...
  • zhou8jie
  • zhou8jie
  • 2015年12月21日 19:16
  • 651

Unity3d的脚本类为什么要尽量避免继承MonoBehaviour类

unity3d文档里虽然说所有脚本继承MonoBehaviour类,但是你如果想自定义类,就可以不用继承MonoBehaviour,但是可以类只能调用其中的方法和属性,无法拖到场景的物体中使用。 ...
  • flyfish0113
  • flyfish0113
  • 2016年01月23日 01:27
  • 1823
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:unity3d中脚本生命周期(MonoBehaviour lifecycle)
举报原因:
原因补充:

(最多只允许输入30个字)