一、生命周期
脚本的生命周期就是一个脚本的执行过程,在U3D中是指定的方法,就像cocos2d中的OnEnter和OnExit方法一样,是一个脚本的生命过程。他的过程就是下面这个图。
其中Start方法之后的那三个函数可以看成是平行调用的。
二、生命周期函数和测试代码
using UnityEngine; using System.Collections; public class zhouqi : MonoBehaviour { // Use this for initialization void Awake(){ Debug.Log("Awake"); } void OnEnable(){ Debug.Log("OnEnable"); } void Start () { Debug.Log("Start"); } // Update is called once per frame void Update () { Debug.Log("Update"); } void LateUpdate(){ Debug.Log("LateUpdate"); } void OnDisable(){ Debug.Log("OnDisable"); } void OnDestroy(){ Debug.Log("OnDestroy"); } void OnGUI(){ Debug.Log("OnGUI"); } void FixedUpdate(){ Debug.Log("FixedUpdate"); } }
三、周期函数的使用说明
1、调用的过程顺序
当脚本开启的时候,会依次调用这几个函数,其中Awake和OnEnable,Start会在脚本开始的时候调用一次,而Update则是每一帧都在调用,LateUpdate是紧接着Update调用,OnGUI调用的更加频繁,主要是用GUI的时候渲染使用,FixedUpdate则是固定频率调用。
特殊情况:当脚本刚开始状态就是未引入的情况(脚本前面没有打勾),这个时候加载完成之后只会调用Awake这一个方法。
OnDisable是在取消引入脚本的时候调用,比如下面这个图,取消引用时会调用OnDisable,当引用的时候,就是脚本前面打勾的时候,就会调用OnEnable。
OnDestroy则是在脚本销毁的时候调用,比如脚本从project中移除或者绑定的project被销毁的时候,这时候会被调用。
2.脚本周期的一般使用
Awake是在脚本加载的时候调用的,当脚本并未使用的时候,只会调用Awake这一个方法,Start则是在这个脚本引入之后,会调用一次Start方法,所以一般脚本的Public的变量会在Awake方法中初始化,避免出现脚本未使用的时候,其他脚本引入该脚本的Public的变量的时候没有初始化的情况。而一般私有化的变量在Start方法中初始化。
OnEnable则是该脚本可使用的情况下调用,可用来重置数据。
OnGUI是在实用GUI的东西的时候,比如GUI.Button这些的时候,在这个函数里面渲染。
Update,LateUpdate和FixedUpdate都可以更新数据,但是是不一样的,下面说下区别。
3.Update,LateUpdate和FixedUpdate的区别
Update和LateUpdate只是调用顺序的前后,其他调用没有区别,主要就是Update和FixedUpdate的区别。
Update是动画的每一帧都调用,一般默认是一秒60帧,但是会因为机器显卡性能的高低和机器性能的高低有变化,比如说同一个游戏,好的机器一秒刷新40帧,垃圾机器一秒刷新10帧,所以垃圾机器就会感觉到游戏画面卡,所以垃圾机器的Update的调用就会降低。
而FixedUpdate则是固定频率的调用,说一秒调用10次,就是一秒调用10次。
所以一般情况下,画面逻辑的判断如果是每帧调用的话,比如移动什么的就在Update里面调用,而物理碰撞等判断就最好在FixedUpdate里面判断。不同之处看下面例子
例子:
比如说射击类游戏,当玩家点击射击的时候,机器卡了,帧数降低,而对方则在正常移动,当你机器恢复了,已经过了几秒,这个时候对方在你的界面上就是所谓的瞬移,如果射击是在Update里面判断的,对方已经瞬移了,你这时候判断的肯定是没有打中,但是如果在FixedUpdate里面判断的话,虽然你画面因为帧数降低变卡了,但是判断是固定频率不变的,等界面恢复了,其实还是算打中的。这就是两者的区别。
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/292.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!