场景中有2个物体:A,B

每一个物体上绑定2个脚本:A,B

初始化log:
Object : A , Script : B , Message : Awake
Object : A , Script : B , Message : OnEnable
Object : A , Script : A , Message : Awake
Object : A , Script : A , Message : OnEnable
Object : B , Script : B , Message : Awake
Object : B , Script : B , Message : OnEnable
Object : B , Script : A , Message : Awake
Object : B , Script : A , Message : OnEnable
Object : A , Script : B , Message : Start
Object : A , Script : A , Message : Start
Object : B , Script : B , Message : Start
Object : B , Script : A , Message : Start

特征:
1.每次Awake和OnEnable都是连续运行,最后才运行Start
2.物体运行顺序是依照字母升序排列。脚本顺序是依照字母降序排列
3.先运行完每一个物体上的全部脚本,再运行完下个物体上的全部脚本。以此类推。
相当于数据库的先group by obj ascending,group by script decending

销毁的log:
Object : A , Script : A , Message : OnDisable
Object : A , Script : B , Message : OnDisable
Object : A , Script : A , Message : OnDestroy
Object : A , Script : B , Message : OnDestroy
Object : B , Script : A , Message : OnDisable
Object : B , Script : B , Message : OnDisable
Object : B , Script : A , Message : OnDestroy
Object : B , Script : B , Message : OnDestroy
特征:
运行顺序:
1.依照唔拍拖的升序排列(ascending)
2.对于每一个物体上的脚本依照升序排列(ascending),这点是和初始化最大的不同点。
3.先运行完一个物体上的全部脚本的disable,再运行该物体上的全部脚本的destroy。然后轮到下一个物体。

掌握脚本生命周期直接决定脚本之间的调用顺序,否则非常可能出现NPE(null pointer exception)
在android 出现NPE还好,一旦iOS出现NPE。就会出现BAD_ACCESS,程序就挂掉了。这点Mono框架做的不是非常出色。


附:
AbstractMonoBehaviour.cs
using UnityEngine;

using System.Text;

public abstract class AbstractMonoBehaviour : MonoBehaviour 

{





    protected abstract bool EnableLog { get;}





void Start () 

       {

        Log("Start");

}

    void Awake()

    {

        Log("Awake");

    }





    void OnDestroy()

    {

        Log("OnDestroy");

    }





    void OnDisable()

    {

        Log("OnDisable");

    }





    void OnEnable()

    {

        Log("OnEnable");

    }



    





    protected void Log(object obj)

    {

        if (EnableLog)

        {

            StringBuilder sb = new StringBuilder();

            sb.Append("Object : ").Append(gameObject.name)

                .Append(" , Script : ").Append(GetType().Name)

                .Append(" , Message : ").Append(obj);

            Debug.Log(sb.ToString());

        }

    }





}

A.cs
using UnityEngine;

public class A : AbstractMonoBehaviour

{

    protected override bool EnableLog

    {

        get { return true; }

    }

}
B.cs
using UnityEngine;

public class B : AbstractMonoBehaviour

{

    protected override bool EnableLog

    {

        get { return true; }

    }

}

Unity3D脚本(MonoBehaviour)生命周期的更多相关文章

  1. Unity3d脚本的生命周期

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

  2. Unity3D 中 脚本(MonoBehaviour) 生命周期WaitForEndOfFrame需要注意的地方

    首先看看MonoBehaviour的生命周期 先上个图(来源 http://blog.csdn.net/qitian67/article/details/18516503): 1.Awake 和 St ...

  3. Unity3D脚本的生命周期(执行顺序)

    Unity脚本中有许多固定的函数 例如Start();Update(); 而这些函数都有固定的执行顺序 搞清楚这些函数的执行顺序 对于我们理清代码的逻辑就显得尤为重要 举个简单的例子 //脚本A pu ...

  4. MonoBehaviour生命周期

    MonoBehaviour生命周期 上图中重要的信息点很多,需要特别注意的是所有脚本的Awake方法都执行完才会执行Start,但是如果在Awake 中开启了一个协程这个协程中每一帧执行一些操作然后等 ...

  5. Unity脚本的生命周期中几个重要的方法

    1.function Update () {} 正常更新,用于更新逻辑.此方法每帧都会由系统自动调用一次.2.function LateUpdate () {} 推迟更新,此方法在Update() 方 ...

  6. Unity3D实践系列04, 脚本的生命周期

    Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...

  7. U3D C#脚本的生命周期

    MonoBehaviour是每个脚本的基类. 每个Javascript脚本自动继承MonoBehaviour,使用C#或Boo时,需要显式继承MonoBehaviour. 一开始实例化,直到结束实例被 ...

  8. 一张图彻底了解Unity脚本的生命周期

    以前没好好看Unity的脚本手册,原来写的是这么的全...尤其起yield  www  协同 这部分看了这张图彻底的懂了..

  9. Unity脚本的生命周期 同一脚本/不同脚本/游戏对象激没激活/脚本激没激活,几种情况下的Awake,OnEnable,Start的执行顺序

    可以自己在Unity里面试一下 游戏对象在Hierarchy面板不是激活的,它的脚本没作用,脚本中的函数不会执行; 游戏对象在Hierarchy面板是激活的,脚本没激活,Awake会执行,OnEnab ...

随机推荐

  1. PyQT5 No module named ‘PyQt5.QtWebEngineWidgets’

    PyQT5查找不到模块QtWebEngineWidgets pip install pyqt5==5.10.1 或 安装64位的Pyhon解释器

  2. vb 中recordset提示对象关闭时不允许操作

    vb中执行查询后,一般要判断是否为空,只要执行的查询执行了select,都可以用rs.eof 或者 rs.recordcount来判断, 但是,如果执行的sql中加了逻辑判断,导致没有执行任何sele ...

  3. 如何让你的.vue在sublime text 3 中变成彩色?

    作者:青鲤链接:https://www.zhihu.com/question/52215834/answer/129495890来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  4. Convert Expression to Reverse Polish Notation

    Given an expression string array, return the Reverse Polish notation of this expression. (remove the ...

  5. MYSQL数据库链接层- SUMMER-SQL

    2015年3月31日 18:27:34 最后编辑: 2016年4月17日 00:22:00 星期日 最后编辑: 2018-4-25 16:58:44 星期三 最新代码: https://gitee.c ...

  6. html可用于跨域的三个标签

    img 应用场景: <img>用于打点统计,统计网站可能是其他域 script 应用场景: 可以用于cdn,还可以用于JSONP link 可用于cdn

  7. JavaScriptSerializer中日期序列化解决方案

    后台代码: JavaScriptSerializer _jsSerializer = new JavaScriptSerializer(); ViewBag.ProcName = ProcInst.P ...

  8. Java第三阶段学习(十二、HttpServletRequest与HttpServletResponse)

    一.HttpServletRequest 1.概述: 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和 ...

  9. 【LOJ】#2269. 「SDOI2017」切树游戏

    题解 把所有的数组一开始就FWT好然后再IFWT回去可以减小常数 从13s跑到0.7s-- 可以参照immortalCO的论文,感受一下毒瘤的动态动态DP 就是用数据结构维护线性递推的矩阵的乘积 由于 ...

  10. PHP与MySQL设计模式:代理模式

    一.数据库连接通用类 重要的接口: 接口用来存储MySQL连接数据.实现这个接口的类都可以使用这些数据. 通过接口可以隔离出程序中一个简单而必要的部分,任何程序都可以实现这个接口. 接口通过inter ...