Unity脚本的生命周期
前言:Unity中定义了10个重要的事件函数,按照执行的先后顺序依次为以下的内容:
(1):Reset:重置函数,编辑期当脚本赋值给游戏对象时触发,仅执行一次。
(2):Awake:唤醒函数,最先执行的事件函数,用于优先级最高的事件处理,仅执行一次。
(3):OnEnable:启用函数,当脚本启动的时候触发,随着脚本的不断启用与禁用可以执行多次。
(4):Start:开始函数,一般用于给脚本字段赋初值使用,仅执行一次。
(5):FixedUpdate:固定更新函数,以默认0.02s的时钟频率执行,常用于物体学模拟中处理刚体的移动等,每秒执行多次。
(6):Update:更新函数,执行的频率不固定,与计算机当前的性能消耗乘反比,常用于逻辑计算,每秒执行多次。
(7):LateUpdate:后更新函数,在其余两个更新函数之后执行,常用于摄像机的控制情形中,每秒执行多次。
(8):OnGUI:图形绘制函数:绘制系统UI界面,每秒执行多次。
(9):OnDisable:脚本禁用函数,当脚本禁用的时候触发,随着脚本的不断启用和禁用,可以多次的执行。
(10):OnDestroy:销毁函数,本脚本所属游戏对象销毁的时候执行本脚本。仅执行一次。
1.写下来我们编写脚本来测试一下各个函数的生命周期:
public class Demo10_ScriptLifeCycle : MonoBehaviour { void Reset() { print("重置函数Reset"); } void Awake() { print("唤醒事件函数Awake"); } void OnEnable() { print("脚本启用事件函数OnEnable"); } void Start() { print("开始函数Start"); //开启调用函数 InvokeRepeating("InvokeTest", 0f, 1f); //开始协成 StartCoroutine("CoroutineTest"); } void FixedUpdate() { print("固定更新函数FixedUpdate"); } void Update() { print("更新函数Update"); //停止调用函数 if (Input.GetKey(KeyCode.I)) { CancelInvoke("InvokeTest"); } //停止协成 else if (Input.GetKey(KeyCode.C)) { StopCoroutine("CoroutineTest"); } } void LateUpdate() { print("延迟更新函数LateUpdate"); } void OnGUI() { print("界面绘制函数OnGUI"); } void OnDisable() { print("脚本禁用函数OnDisable"); } void OnDestroy() { print("销毁函数OnDestory"); } void InvokeTest() { print("被测试的调用函数的方法"); } IEnumerator CoroutineTest() { while (true) { yield return new WaitForSeconds(1f); print("被测试的协成"); } } }//class_end
当我们把脚本赋值给层级视图的一个空对象的时候,注意我们Console视图中会出现一个信息:
以上的输出的结果是Unity生命周期中的Reset()函数在编辑期间就触发的(当我们给空对象赋值我们的脚本的时候触发的)。好的,接下来执行我们的程序:
运行的结果我们可以看到脚本中的部分事件函数的执行的顺序与执行的次数。但是我们发现没有OnDisable和OnDestroy事件函数的输出。我们开始禁用这个脚本:
当我们禁用完脚本后会发现“被测试的调用函数的方法”和“被测试的协成”依然还是会执行:
当我们启用脚本的时候会执行OnEnable()事件函数:
我们用结构图表示各个函数的执行的顺序: