场景中有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. Verilog笔记.三段式状态机

    之前都是用的一段式状态机,逻辑与输出混在一起,复杂点的就比较吃力了. 所以就开始着手三段式状态机. 组合逻辑与时序逻辑分开,这样就能简单许多了. 但是两者在思考方式上也有着很大的区别. 三段式,分作: ...

  2. 基于FPGA(DDS)的正弦波发生器

    记录背景:昨晚快下班时,与同事rk聊起怎么用FPGA实现正弦波的输出.我第一反应是利用高频的PWM波去滤波,但感觉这样的波形精度肯定很差:后来想起之前由看过怎么用FPGA产生正弦波的技术,但怎么都想不 ...

  3. 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x-packV5.4.2安装

    相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+klanaV5.4.2+x-p ...

  4. Java中获取包含变量的配置文件config.properties内容

    应用场景 有些时候项目中会用到很多路径,并且很可能多个路径在同一个根目录下,那为了方便配置的修改,达到只修改根目录即可达到一改全改的效果,此时就会想到要是有变量就好了: 另外有时候路径中的文件名是不确 ...

  5. redis,nodejs,php,pub/sub 实战: 微信语音识别

    2015年5月22日 20:20:20 星期五 效果: 这边对微信说话,  浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...

  6. tensorflow variable的保存和修改(加载一部分variable到新的model中)

    link: https://www.tensorflow.org/guide/saved_model 中文博客:https://blog.csdn.net/Searching_Bird/article ...

  7. Java基础85 MVC开发模式

    1.MVC开发模式 本文用 Servlet+JSP+javaBean 的开发模式来讲解 Model:用javabean实现,用于封装业务数据View:用jsp实现,用于显示数据Controller:用 ...

  8. Navicat Premium 常用功能讲解

    https://www.linuxidc.com/Linux/2016-04/130159.htm Navicat Premium 常用功能讲解 1.快捷键 1.1. F8 快速回到当前对象列表 1. ...

  9. json多态序列化

    https://blog.csdn.net/java_huashan/article/details/46428971 https://blog.csdn.net/bruce128/article/d ...

  10. java List去重方式及效率对比

    对List去重并保证添加顺序主要有三种方式: 方式一,利用HashSet不能添加重复数据的特性 由于HashSet不能保证添加顺序,所以只能作为判断条件: private static void re ...