昨天被问到一个问题MonoBehaviour的Awake()和Start()的区别是啥?

当然Awake()会在Start()之前被调用,这个地球人都知道了。如果只是顺序问题,那当然就没太大必要搞两个函数了。仔细研究了一下API文档:

  • Awake():Awake is called when the script instance is being loaded.
  • Start():Start is called on the frame when a script is enabled just before any of the Update methods is called the first time.
OK,从文档中我们看到他俩的区别是:Awake()是在脚本对象实例化时被调用的,而Start()是在对象的第一帧时被调用的,而且是在Update()之前。

为了更明确这点,我们做一个小实验,写一个脚本,用来动态创建另外一个脚本对象:
using UnityEngine;
using System.Collections;public class TryObject : MonoBehaviour
{// Use this for initializationvoid Start(){
#if trueGameObject dynaGO = new GameObject("DynamicGO");dynaGO.AddComponent<DynamicObject>();
#elseObject prefab = Resources.Load("DynamicGO");Object instance = GameObject.Instantiate(prefab);
#endif}}

另外一个脚本就写几个空函数,用来打断点:

using UnityEngine;
using System.Collections;public class DynamicObject : MonoBehaviour
{void Awake(){ }// Use this for initializationvoid Start(){}// Update is called once per framevoid Update(){}
}

以下是使用AddComponent()方法时,DynamicObject:Awake()的调用堆栈:

下面是使用加载prefab的方式时,DynamicObject:Awake()的调用堆栈:
以下是DynamicObject:Start()的调用堆栈:
这样的话,前面的结论就更明确了。在使用上,有几点值得注意:
  • 脚本的一些成员,如果想在创建之后的代码中立即使用,则必须写在Awake()里面;
  • 当关卡加载时,脚本的Awake的次序是不能控制的;至于在关卡加载时,对象实例化和Awake()的调用关系,得看源码才知道了。

Unity3D脚本中的Awake()和Start()的本质区别相关推荐

  1. PHP脚本中的两种换行符的区别

    在编写PHP脚本代码的时候,我们经常会看到 \n和<br />这两个字符,它们都有换行的作用,那么到底有什么区别呢? 1.\n是使源代码换行,而浏览器显示的内容不换行: 2.<br ...

  2. 【Unity3D 教程系列第 10 篇】Unity 脚本中的生命周期流程图

    这是[Unity3D 教程系列第 10 篇],如果觉得有用的话,欢迎关注专栏. 文章目录 一:生命周期流程图 二:常用的生命周期函数 三:脚本初始化和销毁 四:脚本的动态添加与静态添加 五:Awake ...

  3. Unity3D脚本中文系列教程(八)

    ◆ static var matrix : Matrix4x4 描述:设置用于渲染所有gizmos的矩阵. 类方法 ◆ Static function DrawCube(center:Vector3, ...

  4. Unity3D脚本中文教程(八)

    http://blog.sina.com.cn/s/blog_4ef78af50100xhc6.html ◆ static var matrix : Matrix4x4 描述:设置用于渲染所有gizm ...

  5. unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  6. Unity3D脚本--常用代码集

    1. 访问其它物体 1) 使用Find()和FindWithTag()命令 Find和FindWithTag是非常耗费时间的命令,要避免在Update()中和每一帧都被调用的函数中使用.在Start( ...

  7. Unity3D——脚本编程

    在本章中我们将学习的是Unity3D的脚本编程,Unity3d目前支持javascript,c#,Boo这三种脚本的开发!由于本人开发过C++所以就直接用C#来进行unity3d的脚本开发!在脚本开发 ...

  8. Unity3D脚本中文系列教程(七)

    http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...

  9. Unity3D脚本中文系列教程(五)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302848544/?suggestedreading&wumii Unit ...

最新文章

  1. 技术债务就像俄罗斯方块,你永远都赢不了!
  2. ie6、7 下input的边框问题 ?
  3. 夯实数字化转型算能基石 构建洛阳银行核心云
  4. SQL Sever sa密码丢失
  5. 为什么 12306 时不时要崩那么一下?
  6. 最大流(Max Flow)
  7. Nginx介绍及安装配置
  8. 半次元收藏夹爬虫(残疾版,不喜勿喷)
  9. 世界杯winner只属于你——MESSI
  10. HTML——表格合并
  11. 2021年中式烹调师(初级)模拟考试系统及中式烹调师(初级)实操考试视频
  12. 定义一个电话簿,用人名查电话
  13. CAN(Controller Area Network)网络通信简介
  14. ionic3保存图片到本地相册
  15. java8的LocalDateTime获取当前月的第一天与最后一天
  16. 思科、华为、瞻博juniper、中兴、阿尔卡特中高端网络设备查看端口收发光功率-命令汇总
  17. 项目经理年终总结|一个高层项目管理者的年终反思
  18. matlab建模DNA双链,PPT绘制科研图形—DNA双链、分子细胞模型
  19. Plants vs. Zombies【二分】
  20. 罗杰波、马毅、华刚等谈视觉研究那些事:是时候重新定义视觉了

热门文章

  1. 鱼眼参数的数值计算优化方法
  2. 简直太猛了!GitHub《植物大战僵尸》重磅开源,两天就破千Star!
  3. php live template,live-templates-introduce.md
  4. 浅谈数字媒体艺术中的技术应用-1-技术概述
  5. ETHEOS开发资源及工具集合(完整汇总版)
  6. 仿慕课网Android端app——慕课Ime(自写服务器接口)
  7. unity 动态字体 和 静态字体
  8. 手动推导计算AES中的s盒的输出
  9. Maven手动导入依赖
  10. ISA2006禁止BT下载方法