生命周期回调

如果熟悉任何一种GUI开发,比如Android,我们会知道其中Activity就有好几个生命周期函数,分别在界面创建、获取焦点、暂停、销毁等时机被回调。在Unity中也是类似的。只不过游戏开发和传统的GUI开发略有不同,游戏中的逻辑是按帧或物理时序循环调用的,而传统GUI界面都是基于事件的。

脚本组件的生命周期

这里我们直接给出Unity文档中的一张图:

虽然图画的很复杂,但我们如果熟悉游戏引擎架构,就会知道无论是游戏脚本,还是各种GUI框架,其实都大同小异。这里我们介绍几个最常用的生命周期回调函数。

  • Awake();脚本实例被载人时就会调用,整个生命周期中只会调用一次。
  • Start():在第一次帧逻辑循环前调用,但在Awake()之后,整个生命周期中只会调用一次。
  • FixedUpdate():基于物理时序循环调用,默认调用间隔固定为0.02s,可以在Project Settings -> Time中查看修改。
  • Update():基于帧循环调用,调用频率和帧数(也就是说计算机的显示性能)相关,每帧调用。
  • LateUpdate():在场景中所有脚本的Update()执行完后,会调用LateUpdate(),因此该函数也是每帧调用。
  • OnDestroy():组件销毁时调用。

注:LateUpdate()可以起到保证多个游戏对象的逻辑调用顺序的作用,因为场景中多个游戏对象的Update()调用是没有顺序的,把一段逻辑放在LateUpdate()中,可以保证该逻辑在所有Update()之后执行。

我们可以写一个简单的脚本进行测试:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyTest : MonoBehaviour
{
    void Awake()
    {
        Debug.Log("Awake");
    }

    void Start()
    {
        Debug.Log("Start");
        // 3s后自动销毁
        Destroy(this.gameObject, 5f);
    }

    void FixedUpdate()
    {
        Debug.Log("FixedUpdate: " + Time.deltaTime);
    }

    void Update()
    {
        Debug.Log("Update: " + Time.deltaTime);
    }

    void LateUpdate()
    {
        Debug.Log("LateUpdate");
    }

    void OnDestroy()
    {
        Debug.Log("OnDestroy");
    }
}
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap