场景中有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. jquery的clone方法bug的修复select,textarea的值丢失

    项目中多次使用了iframe,但是操作起来是比较麻烦,项目中的现实情况是最外面是一个form,里面嵌套一个iframe,下面是一个其他的数据,在form提交的时候将iframe的数据和其他的数据一块提 ...

  2. springcloud配置详解

    Spring Boot的配置参考Spring Boot系列文章,这里只对Spring Cloud用到的配置解释. spring.application.name:配置应用名称,在注册中心中显示的服务注 ...

  3. Shiro:ajax的session超时处理

    本问题解决方案参照网站多篇文章融合解决,在此表示感谢! 环境:springboot+shiro+jquery-easyui 问题:在ajax请求时,如果此时session已经失效,系统没有自动跳转到登 ...

  4. python try详细说明(python的异常捕捉模块)

    #自己常用 try: pass except Exception as e: print("break for :"+str(e)) # 划重点: 1. 正常执行try情况 pri ...

  5. findHomography和perspectiveTransform

    opencv中的两个函数,之前一直不明白这俩函数到底是要干嘛的. 得到两帧图像中的特征点后,就可以用findHomography得到单应性矩阵. 得到单应性矩阵后,可以 (1)根据相应的计算方法,由前 ...

  6. hdu 2065(泰勒展式)

    比赛的时候遇到这种题,只能怪自己高数学得不好,看着别人秒.... 由4种字母组成,A和C只能出现偶数次. 构造指数级生成函数:(1+x/1!+x^2/2!+x^3/3!……)^2*(1+x^2/2!+ ...

  7. SVN使用过程中遇到的一些问题

    更新svn的客户端TortoiseSVN后 ,之前使用svn管理的文件的关联图标消失了 说明:下面的解决方法及图片来自博客:装了SVN,你的关联图标变了没有? 解决办法:在同步的文件点击右键如下图   ...

  8. .NetCore 下使用多个DbContext

    一个项目中使用多个DbContext 或者种数据库的多个DbContext 业务需要 单个DbContext使用不需要给出说明 1.dotnet ef migrations add migration ...

  9. hive1.2.1安装步骤(在hadoop2.6.4集群上)

    hive1.2.1在hadoop2.6.4集群上的安装 hive只需在一个节点上安装即可,这里再hadoop1上安装 1.上传hive安装包到/usr/local/目录下 2.解压 tar -zxvf ...

  10. 在谈PHP中的 抽象类(abstract class)和 接口(interface)

    一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类. 2 ...