<tbody id="c8gyz"><noscript id="c8gyz"><video id="c8gyz"></video></noscript></tbody>

    1. <li id="c8gyz"><tr id="c8gyz"></tr></li>

      <dd id="c8gyz"></dd>
    2. <tbody id="c8gyz"><pre id="c8gyz"></pre></tbody>
        专注3D产业技术16年,三维动画制作,3D特效动画,3D交互开发优质服务商!
        咨询电话:1868 148 2869 (微信同步)  客服QQ:390551442  1931122198
        CASES ·
        新闻中心
        这里象征着我们的方向和能力
        移动终端当前位置:首页 > 新闻中心

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

        发表日期:2018/5/20 0:41:58     文章编辑:     浏览次数:1254     标签:unity3D

        最近在做一个小示例,发现类继承于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");
            }


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

        相关文章
        • 服务热线:18681482869
        • 手机:1868 148 2869
        • 网址:www.k7ylc732.com
        • 地址:深圳市龙岗区大运软件小镇54栋202室

        Copyright ? 2015-2018 sx8d.com All Rights Reserved. 深圳市深信数字科技有限公司 版权所有 | 粤ICP备15084676号

        • qq客服
        • 公众号
        • 手机版
        • 公安备案查询
         
        预约上门

        请拨打销售热线 18681482869,或让我们联系您!

        姓名:  
        电话:  
        地址:  
        建设项目:  
        验证码:  验证码
        ×
        成年男女免费视频在线观看不卡_国产福利萌白酱精品tv一区_老司机成人午夜精品福利视频_欧美肥妇毛多水多bbxx