何为脚本生命周期?
Unity脚本从唤醒到销毁的过程。
消息:当满足某种条件Unity引擎自动调用的函数。
图表如下所示:
初始阶段:
1、Awake唤醒:
当物体载入时立即调用1次;
常用于在游戏开始前进行初始化,可以判断当满足某种条件执行此脚本this.enable = true
2、OnEnable当可用:每当脚本对象启用时调用。
3、Start开始:
物体载入且脚本对象启用时被调用1次,且只执行一次。
常用于数据或游戏逻辑初始化,执行时机晚于Awake。
物理阶段:
1、FixedUpdate固定更新:脚本启用后,固定时间被调用,适用于对游戏对象做物理操作,例如移动等。设置更新频率:“Edit”--> "Project Setting" --> "Time" --> "Fixed Timestep"值,默认为0.02.
2、OnCollisionXXX碰撞:当满足碰撞条件时调用。
3、OnTriggerXXX触发:当满足触发条件时调用。
4、OnMouseEnter鼠标移入:鼠标移入到当前Collider时调用。
5、OnMouseOver鼠标经过:鼠标经过当前Collider时调用。
6、OnMouseExit鼠标离开:鼠标离开当前Collider时调用。
7、OnMouseDown鼠标按下:鼠标按下当前Collider时调用。
8、OnMouseUp鼠标抬起:鼠标在当前Collider上抬起时调用。
游戏逻辑:
1、Update更新:
脚本启用后,每次渲染场景时调用,频率与设备性能及渲染量有关。
循环调用,每帧调用一次,一秒钟大概执行60次。
帧:我们的游戏画面是在不停的刷新的,每刷新一次,就是一帧。
2、LateUpdate延迟更新:
在Update函数被调用后执行,适用于跟随逻辑。
场景渲染:
1、OnBecameVisible当可见:
当Mesh Renderer在任何相机上可见时调用。
2、OnBecameInvisible当不可见:
当Mesh Renderer在任何相机上都不可见时调用。
结束阶段:
1、OnDisable当不可用:
对象变为不可用或附属游戏对象非激活状态时此函数被调用。
2、OnDestroy当销毁:
当脚本销毁或附属的游戏对象被销毁时被调用。
3、OnApplicationQuit当程序结束:
应用程序退出时被调用。
代码如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 脚本生命周期/必然事件/消息Message
/// </summary>
public class Lifecycle : MonoBehaviour
{
//脚本:.cs的文本文件 类文件
// 附加到游戏物体中,定义游戏对象行为指令的代码
//序列化字段 作用:在编辑器中显示私有变量
[SerializeField]
private int a = 100 ;
//作用:在编辑器中隐藏字段
[HideInInspector]
public float b;
[Range(0,100)]
public int c;
//属性:在编辑器中不能显示,通常在脚本中不写
public int A
{
get { return this.a; }
set { this.a = value; }
}
public Lifecycle()
{
Debug.Log("构造函数");
//不要再脚本中写构造函数
//不能在子线程中访问主线程成员
//b = Time.time;
}
//***********初始阶段****************
//执行时机:创建游戏对象 --> 立即执行1次(早于start)
//作用:初始化
private void Awake()
{
Debug.Log("Awark-"+Time.time+"-"+this.name);
}
//执行时机:创建游戏对象 -> 脚本启用 -> 才执行(1次)
//作用:初始化
private void Start()
{
Debug.Log("Start-"+Time.time+"-"+this.name);
}
//****************物理阶段*****************
//执行时机:每隔固定时间(大概0.02s)执行1次。(时间可以修改)
//适用性:适合对物体做物理操作(移动、旋转......),不会受到渲染影响
private void FixedUpdate()
{
//渲染时间不固定(每帧渲染量不同、机器性能不同)
//Debug.Log(Time.time);
}
private void OnMouseEnter()
{
Debug.Log("OnMouseEnter");
}
private void OnMouseDown()
{
Debug.Log("OnMouseDown");
}
//*************游戏逻辑*****************
//执行时机:渲染帧执行,执行间隔不固定
//适用性:处理游戏逻辑
private void Update()
{
//向前移动1m
//查看某一帧程序执行情况
//启动调试 F5 --> 运行场景 --> 暂停 --> 在可能出错的行加断点 --> 单帧运行 --> 调试…… --> 停止调试 Shift + F5
int a = 1;
int b = 2;
int c = a + b;
}
}