脚本生命周期

1.0简介

Unity的生命周期指的是Unity脚本从唤醒到销毁的过程。

Unity官方也称之为消息,指的是当满足某种条件Unity引擎自动调用的函数,早期也称为必然事件。

参考:https://docs.unity.cn/cn/current/ScriptReference/MonoBehaviour.html

1.1 初始阶段

Awake唤醒:

  • 当物体载入时立即调用1次;常用于在游戏开始前进行初始化,可以判断当满足某种条件执行此脚本this.enable=true;

OnEnable当可用:

  • 每当脚本对象启用时调用。

Start开始:

  • 物体载入且脚本对象启用时被调用1次。常用于数据或游戏逻辑初始化,执行时机晚于Awake。

1.2物理阶段

FiexedUpdate固定更新:

  • 脚本启用后,固定时间被调用,适用于对游戏对象做物理操作,例如移动等。
  • 设置更新频率:Edit/ProjectSetting/Time/Fixed Timestep,值默认为0.02s(不建议修改)

OnCollisionXXX 碰撞:

  • 当满足碰撞条件时调用

OnTriggerXXX 触发:

  • 当满足触发条件时调用

1.3输入事件

  • OnMouseEnter 鼠标移入- 鼠标移入当前Collider时调用
  • OnMouseOver 鼠标经过 – 鼠标经过当前Collider时调用
  • OnMouseExit 鼠标离开 – 鼠标离开当前Collider时调用
  • OnMouseDown 鼠标按下 – 鼠标按下当前Collider时调用
  • OnMouseUp 鼠标抬起 – 鼠标在当前Collider上抬起时调用

1.4游戏逻辑阶段

Update 更新:

  • 脚本启用后,每次渲染场景时调用,频率与设备性能及渲染量有关

LateUpdate 延迟更新:

  • 在Update函数被调用后执行,适用于跟随逻辑

1.5场景渲染

OnBecameVisible 当可见:

  • 当Mesh Renderer在任何相机上可见时调用。

OnBecameInvisible 当不可见:

  • 当Mesh Renderer在任何相机上都不可见时调用。

1.6 结束阶段

OnDisable当不可用:

  • 对象变为不可用或附属游戏对象非激活状态时此函数被调用。

OnDestroy 当销毁:

  • 当脚本销毁或附属的游戏对象被销毁时被调用。

OnApplicationQuit 当程序结束:

  • 应用程序退出时被调用

1.7 相关代码

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

/// <summary>
/// 脚本生命周期/必然事件/消息 Message
/// </summary>
public class Lifecycle : MonoBehaviour
{
    //脚本:.cs的文本文件  类文件
    //       附加到游戏物体中,定义游戏对象行为指令的代码

    //C#类
    //字段
    //属性
    //构造函数
    //方法

    //脚本 : 通常不写属性,因为在编译器中不显示。
    //字段
    //方法


    //序列化字段  作用:在编辑器中显示私有变量
    [SerializeField]
    private int a = 100;

    //作用:在编译器中隐藏字段
    [HideInInspector] 
    public float b;


    [Range(0,100)]
    public int c;

    //属性:在编译器中不能显示,通常脚本中不写
    public int A 
    {
        get { return a; }
        set { a = value; }
    }

    //构造函数
    public Lifecycle() 
    {
        //Debug.Log("构造函数");
        //不要在脚本中写构造函数
        //不能在子线程中访问主线程成员
        //b = Time.time;
    }

    //生命周期
    //***************************初始阶段***********************************

    //执行时机:创建游戏对象 --> 立即执行(1次)(早于Start)
    //作用:初始化
    private void Awake()
    {
        //Debug.Log("Awake--" +Time.time+"--"+this.name);
    }

    //执行时机:创建游戏对象--->脚本启用--> 才执行(1次)
    //作用:初始化
    private void Start()
    {
        Debug.Log("Start--" + Time.time+"--"+this.name);
    }

    //***************************物理阶段***********************************
    //执行时机:每隔固定时间执行一次。
    //适用性:适合对物体做物理操作(移动、旋转...),不会受到渲染影响
    private void FixedUpdate()
    {
        Debug.Log(Time.time);
    }

    //***************************输入事件***********************************
    private void OnMouseDown()
    {
        Debug.Log("OnMouseDown");
    }


    //***************************游戏逻辑阶段***********************************
    //执行时机:渲染帧执行,执行间隔不固定
    //适用性:处理游戏逻辑
    private void Update()
    {

    }

}

发表评论

邮箱地址不会被公开。 必填项已用*标注