Unity学习疑问记录之脚本生命周期

总的来说unity的脚本生命周期分几个部分:编辑→初始化→游戏逻辑→渲染→GUI→Teardown
首先是Reset,顾名思义:重置。在什么情况下调用呢?1.用户第一次添加组件时。2用户点击见组件面板上的Reset按钮时。
接下来的几个比较重要:
Awake():当脚本实例被载入时调用,一般进行一些初始化赋值。
Start():Start只在Update第一次被调用前执行一次。
接下来是三个更新函数(比较重要这里我做了详细讲解):
Update(),FixedUpdate(),LateUpdate()三者的区别:
1.Update():每帧执行一次
2.FixedUpdate():以固定的时间间隔执行,不受帧率影响,默认0.02s,如果卡帧了Update就不会再执行,而FixedUpdate则继续执行。
时间间隔可以在Edit->ProjectSetting->time->Fixedtimestep中修改。主要用于处理物理逻辑,比如Rigidbody等。
3.LateUpdate():LateUpdate是在所有Update函数调用后被调用。比如相机跟随就可以用这个函数,即人物移动在Update中实现,相机
跟随在LateUpdate()中实现,Play后的效果是:角色移动发生在前,相机移动紧跟其后。
OnGUI 方法: 渲染和处理GUI事件时调用,用于渲染图形界面,同样很重要。
OnDisable 方法: 当对象变为不可用或非激活状态时此函数被调用。
OnDestroy 方法:当MonoBehaviour将被销毁时,这个函数被调用。
以上是单个脚本的生命周期执行顺序,大家知道Unity是不支持多线程的,但是Unity可以同时创建很多脚本,并且可以分别绑定在不同的游戏对
象上,他们分别执行各自生命周期时又如同多线程并行执行脚本的,那么当有多个脚本时Awake(),Update()等函数执行顺序是如何呢?
答案是与单个脚本执行顺序一样,什么意思?
例如:我建立两个脚本:Script1和Script2
在两个脚本中我都加入Awake()和Update()函数:
public class Script1 : MonoBehaviour public class Script2 : MonoBehaviour
{ {
void Awake () void Awake ()
{ {
Debug.Log("Script1 Awake"); Debug.Log("Script2 Awake");
} }
void Update () void Update ()
{ {
Debug.Log("Script1 Update"); Debug.Log("Script2 Update");
} }
} }
我们看下执行结果: Script1 Awake
Script2 Awake
Script1 Update
Script2 Update
由此我们得出结论:每个脚本的Awake,Update方法在后台都汇集在一起。
如上两个脚本在后台:void Awake()
{
Script1中的Awake();
Script2中的Awake();
}
后台中Update函数汇总也是一样,这里就不列出了。
在实际的项目中脚本会非常多,那么如此多的脚本在后台脚本中的顺序可能不是我们预期那样,此时可以在脚本的Inspector面板下方Execution Order中修改脚本执行顺序,不过这样非常麻烦。建议一般在Awake中做一些初始化,在Start中获取游戏对象等,在实际项目中应灵活应对。
Unity学习疑问记录之脚本生命周期的更多相关文章
- Unity学习疑问记录之Awake和Update
Awake() 当一个脚本实例被载入时Awake被调用. Awake用于在游戏开始之前初始化变量或游戏状态.在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与 ...
- Unity学习疑问记录之新GUI
学习Unity 4.6新GUI系统 http://segmentfault.com/a/1190000000642686
- Unity学习疑问记录之协程
http://blog.csdn.net/huang9012/article/details/38492937 总结:1.协程相当于多线程但不是,(尽管它们看上去是这样的),它们运行在同一线程中,跟普 ...
- Unity学习疑问记录之保卫伦敦塔学习体会
1.生成的prefab如果要产生反向: Instantiate(Rocket, rocketPosition.position, Quaternion.Euler(new Vector3(0,0,18 ...
- Unity学习疑问记录之查找
unity中提供了获取对象的五种方法: 通过对象名称(Find方法) 通过标签获取单个游戏对象(FindWithTag方法) 通过标签获取多个游戏对象(FindGameObjectsWithTags方 ...
- Unity学习疑问记录之触屏
当将Unity游戏运行到ios或android设备上时,桌面系统中的鼠标左键操作可以自动变为手机屏幕上的触屏操作,但鼠标操作无法实现一些特有的触屏操作,比如多点触屏. 触控对于Android移动设备来 ...
- Unity学习疑问记录之layer问题
在Sprite Render中有个Sorting Layer,这里可以建层,而Inspector窗口中也有个layer,也可以新建层,这2者有什么不一样呢? layer主要通过光线投射来选择性地忽略碰 ...
- Unity学习疑问记录之Apply Root Motion
Should we control the character's position from the animation itself or from script. 如果我们勾选了Animator ...
- Unity学习疑问记录之正交与透视
Unity中相机的投影是2种方式,正交和透视 这是透视方式 正交方式: //计算屏幕宽度 float height = 2.0f * Camera.main.orthographicSize;//正交 ...
随机推荐
- MiniProfiler(MiniProfiler.EF6监控调试MVC5和EF6的性能)
git: https://github.com/MiniProfiler 以前开发Webform的时候可以开启trace来跟踪页面事件,这对于诊断程序的性能是有很大的帮助的,起到事半功倍的作用,今天 ...
- cf595d
题意:给出一个轮子,上面有一个随着它转动的传感器在圆周上,给出一个指定距离m,和轮子向前行进的速度v以及轮子的半径r.问让传感器通过该距离最少需要多少时间. 分析:首先我们列出传感器行进距离与时间的轮 ...
- 图片切换小demo
<body> <div class="body"><img src="bopin/images/bigImg1.jpg" widt ...
- Mybatis Collection查询集合只出现一条数据
1.原因 如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条. 2.解决办法 级联查询的时候,主表和从表有一样的字段名的时候,在mysql上命令查询是没问题的.但在mybat ...
- 解决IE8 内置JSON.stringify,中文变unicode的问题
转自:http://my.oschina.net/u/919074/blog/191131 项目中出现在IE下出现把json对象转为json串中文变成unicode的问题,最后经过排查,发现是IE8内 ...
- MySQL源码分析:源码文件结构及主要数据结构
原文地址:http://blog.itpub.net/30186219/viewspace-1481125/BUILD: 内含在各个平台.各种编译器下进行编译的脚本.如compile-pentium- ...
- 一些实用的Windows注册表
一些实用的Windows注册表 1.去掉快捷方式文件名后面自动添加的"-快捷方式" 在给某个文件创建快捷方式时(选中文件-->右键-->发送到-->桌面快捷方式) ...
- IP地址,子网掩码,默认网关,DNS服务器详解
为了更深入的学习TCP/IP协议,最近看了不少有关资料,收集整理记录如下,以备后面的使用和方便各位学习: IP地址,子网掩码,默认网关,DNS服务器是什么意思? (一) 问题解析 001. 问: ...
- sqlserver 中row_number,rank,dense_rank,ntile排名函数的用法
1.row_number() 就是行号 2.rank:类似于row_number,不同之处在于,它会对order by 的字段进行处理,如果这个字段值相同,那么,行号保持不变 3.dense_rank ...
- 关于mat2gray
最小的是0,最大的是1,那么介于中间的那些值我们怎么处理? 那么事实上我们试了很多样例之后.. 我猜他是..每个步长step_length=1/(max-min+1) 然后每个值就会变成(val-1) ...