unity unity的生命周期期 何时释放 对象

官方参考手册:/Manual/ExecutionOrder.html
unity脚本从唤醒到销毁都有着一套比较完善的生命周期,添加任何脚本都要遵守生命周期法则!  接下来介绍几种系统自调用的重要方法。首先要我们先来说明一下它们的执行顺序:  Awake --& Start --& Update --& FixedUpdate --& LateUpdate --&OnGUI --&Reset --& OnDisable --&OnDestroy  下面我们针对每一个方法进行详细的说明:  1.Awake:用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息Awake总是在Start之前被调用。它不能用来执行协同程序。  2.Start:仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。在所有脚本实例中,Start函数总是在Awake函数之后调用。  3.Update:正常帧更新,用于更新逻辑。每一帧都执行,处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。  4.FixedUpdate:固定帧更新,在Unity导航菜单栏中,点击&Edit&--&&Project Setting&--&&Time&菜单项后,右侧的Inspector视图将弹出时间管理器,其中&Fixed Timestep&选项用于设置FixedUpdate()的更新频率,更新频率默认为0.02s。  5.LateUpdate:在所有Update函数调用后被调用,和fixedupdate一样都是每一帧都被调用执行,这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。LateUpdate,在每帧Update执行完毕调用,他是在所有update结束后才调用,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。  6.OnGUI:在渲染和处理GUI事件时调用。比如:你画一个button或label时常常用到它。这意味着OnGUI也是每帧执行一次。  7.Reset:在用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个默认值。  8.OnDisable:当物体被销毁时 OnDisable将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。注意: OnDisable不能用于协同程序。  9.OnDestroy:当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用。注意:OnDestroy也不能用于协同程序。  备注:  协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。在中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。
阅读(...) 评论()ma_haile 的BLOG
用户名:ma_haile
文章数:38
评论数:25
访问量:610016
注册日期:
阅读量:5863
阅读量:12276
阅读量:416672
阅读量:1104125
51CTO推荐博文
&MonoBehaviour Mono行为&
上图为 常见见的脚本 方法 &&
下面我们看看每个方法的
OnAwake 方法: &当脚本实例被载入时Awake被调用&
OnStart 方法: &Start仅在Update函数第一次被调用前调用。
OnUupdate 方法 :渲染一帧之前被调用。这里是大部分游戏行为代码被执行的地方,除了物理代码
OnGUI 方法: &渲染和处理GUI事件时调用 这里不是 没帧都调用哦&
FixedUpdate 方法:&这个函数在每个物理时间步被调用一次。这是处理基于物理游戏行为的地方。
LateUpdat 方法 :是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现
Reset 方法 :&重置为默认值
OnDisable 方法:&当对象变为不可用或非激活状态时此函数被调用。
On&方法:当MonoBehaviour将被销毁时,这个函数被调用
欢迎各位盆友 提出bug 和一起探讨 &由于忙公司项目了 ,今天先写到这里了,嘻嘻本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
围观59851次
编辑日期: 字体:
Unity是不支持多线程的,也就是说我们必须要在主线程中操作它,可是Unity可以同时创建很多脚本,并且可以分别绑定在不同的游戏对象身上,他们各自都在执行自己的生命周期感觉像是多线程,并行执行脚本的,它是如何执行的呢?
我们做一个小小的实验来验证它。如下图所示,在Hierarchy视图中创建三个游戏对象,在Project视图中创建三条脚本,然后按照顺序将脚本绑定在对应的游戏对象身上。
三条脚本的代码完全一样,只是做了一点名称上的区分,代码写的比较丑我们只是作为测试!!
12345678910111213141516171819202122232425262728293031
using UnityEngine;using System.Collections;&public class Script0 : MonoBehaviour {& void Awake ()
Debug.Log("Script0 ========= Awake"); }& bool isUpdate = false; void Update ()
if(!isUpdate)
Debug.Log("Script0 ========= Update");
isUpdate = true;
} }& bool isLateUpdate = false; void LateUpdate() {
if(!isLateUpdate)
Debug.Log("Script0 ========= LateUpdate");
isLateUpdate = true;
播放游戏,看看他们的执行顺序。如下图所示,Awake、Update、LateUpdate、无论播放游戏多少次,他们执行的顺序是完全一样的。
接着我们在做一个测试,把Script0的Update方法注释掉!!
12345678910111213141516171819202122232425262728293031
using UnityEngine;using System.Collections;&public class Script0 : MonoBehaviour {& void Awake ()
Debug.Log("Script0 ========= Awake"); }&// bool isUpdate =// void Update () // {//
if(!isUpdate)//
Debug.Log("Script0 ========= Update");//
isUpdate =//
}// }& bool isLateUpdate = false; void LateUpdate() {
if(!isLateUpdate)
Debug.Log("Script0 ========= LateUpdate");
isLateUpdate = true;
播放游戏,在看看它的结果。脚本的执行顺序和以前完全一样,Script0即使删除掉了Update方法,但是它也不会直接执行LateUpdate方法,而是等待Script1和Script2的Update方法都执行完毕以后,在去执行所有的LateUpdate方法。
通过这两个例子我们就可以清楚的断定Unity后台是如何执行脚本的了。每个脚本的Awake、Update、LateUpdate、FixedUpdate等等,方法在后台都有一个总汇。
后台的Awake()
脚本0中的Awake();
脚本1中的Awake();
脚本2中的Awake();
后台的方法 Awake、Update、LateUpdate、FixedUpdate等等都是按照顺序,等所有子脚本中的Awake执行完毕后在去执行 Start 、Update、LateUpdate等等。所以这里也就解释了Unity没有多线程的概念。
后台的Update()
脚本0中的Update();
脚本1中的Update();
脚本2中的Update();
Unity还提供的一组协同任务的方法,其实它的原理和上面的完全一样,它们都是假的多线程。说了一圈我们又回到了Unity脚本的执行顺序上来?我们在看两条脚本!
在脚本2的Awake方法中创建一个立方体对象。
12345678910
using UnityEngine;using System.Collections;&public class Script2 : MonoBehaviour { void Awake () {
GameObject.CreatePrimitive(PrimitiveType.Cube); }}
在脚本0的Awake方法中去获取这个立方体对象
12345678910111213
using UnityEngine;using System.Collections;&public class Script0 : MonoBehaviour {& void Awake ()
GameObject go = GameObject.Find("Cube");
Debug.Log(go.name); }&}
如果脚本的执行顺序是 先执行Script2 然后在执行Script0那么Script0中的Awake就可以获取到该立方体对象,可是如果脚本的执行顺序是先Script0然后在Script2,那么Script0肯定会报空指针错误的。
那么实际项目中的脚本会非常非常多,他们的先后顺序我们谁也不知道。所以我的建议一般在Awake方法中创建游戏对象或在Resources.Load(Prefab) 对象。在Start方法中去获取游戏对象,或者游戏组件,这样就可以确保万无一失了。
如果说你非要控制脚本的执行先后顺序,也不是完全不行!Unity可以设置脚本执行的顺序。如下图所示,选择任意脚本在Inspector视图中点击Execution Order..按钮。
如下图所示,点击右下角的“+”将弹出下拉窗口,包括游戏中的所有脚本。添加脚本完毕后,Default Time下方数值越小的排在越前面脚本将率先执行,如果没有设置的脚本将按默认的顺序执行。
按照我的这个设置,程序将先执行Script0然后Script1最后Script2,欢迎一起讨论!!哇咔咔。。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity3d中的Awake()、OnEnable()、Start()等默认函数的执行顺序和生命周期
Unity3d中的Awake()、OnEnable()、Start()等默认函数的执行顺序和生命周期
默认函数生命周期
Awake()在MonoBehavior创建后就立刻调用,在脚本实例的整个生命周期中,Awake函数仅执行一次;如果游戏对象(即gameObject)的初始状态为关闭状态,那么运行程序,Awake函数不会执行;如果游戏对象的初始状态为开启状态,那么Awake函数会执行;值得注意的一点是,Awake函数的执行与否与脚本实例的状态(启用或禁用)并没有关系,而是与脚本实例所绑定的游戏对象的开关状态有关。如果重新加载场景,那么场景内Awake函数的执行情况重新遵循上述两点。
Start()将在MonoBehavior创建后在该帧Update()第一次执行前被调用;Start()函数只在脚本实例被启用时才会执行;Start函数总是在Awake函数之后执行。如果游戏对象开启了,对象上绑定的脚本实例被禁用了,那么Start函数不会执行。这是Start函数的特点,只有在脚本实例被启用时它才会执行,并且Start函数只会在脚本实例首次被开启时才会执行。如果是已经开启过的脚本实例被关闭后再次开启,那么Start函数不会再次执行。
一般开发中都是在Awake函数中获取游戏对象或者脚本实例的信息,然后在Start函数中进行一些获取之后的初始化设置。
Awake、OnEnable、Start,都是游戏开始运行前就调用的方法。
GameObject的Activity为true,脚本的enable为true时,其先后顺序为:Awake、OnEnable、Start;
GameObject的Activity为true,脚本的enable为false时,只运行Awake;
GameObject的Activity为false时,以上都不调用,OnDisable()被调用;
OnDestory:物体被删除时调用。
Update:当MonoBehaviour启用时,其Update在每一帧被调用;
LateUpdate:当Behaviour启用时,其LateUpdate在每一帧被调用
FixedUpdate:这个函数会在每个固定的物理时间片被调用一次.这是放置游戏基本物理行为代码的地方。UPDATE之后调用。
Reset:Reset是在用户点击检视面板的Reset按钮或者首次添加该组件时被调用.此函数只在编辑模式下被调用.Reset最常用于在检视面板中给定一个最常用的默认值.
OnGui:这个函数会每帧调用好几次(每个事件一次),GUI显示函数只能在OnGui中调用。
OnBecameVisible:可以使用OnBecameVisible()和OnBecameVisible(),来控制物体的update()函数的执行以减少开销
我的热门文章
即使是一小步也想与你分享

我要回帖

更多关于 unity3d 生命周期 的文章

 

随机推荐