事件函数的执行顺序
先说一下执行顺序吧。
官方给出的脚本中事件函数的执行顺序如下图:
我们可以做一个小实验来测试一下:
在Hierarchy视图中创建三个游戏对象,在Project视图中创建三条脚本,如下图所示,然后按照顺序将脚本绑定到对应的游戏对象上:
三条脚本的代码完全一样,只是做了一点名称上的区分: using UnityEngine;
using System.Collections;
public class Scring0 : MonoBehaviour
{
void Awake()
{
Debug.Log("script0=======Awake");
}
bool isUpdate=false;
void Update()
{
if(!isUpdate)
{
Debug.Log("script0=======Update");
isUpdate=true;
}
}
bool isLateUpdate=false;
void LateUpdate()
{
if(!isLateUpdate)
{
Debug.Log("script0=======LateUpdate");
isLateUpdate=true;
}
}
}
播放游戏,看看它们的执行顺序。如下图所示,Awake、Update、LateUpdate,无论运行游戏多少次,它们的执行顺序是完全一样的。
接着我们再做一个测试,把script0的Update方法注释掉!!
using UnityEngine;using System.Collections;
public class script0 : MonoBehaviour
{
void Awake ()
{
Debug.Log("script0=========Awake");
}
// bool isUpdate=false;
// void Update ()
// {
// if(!isUpdate)
// {
// Debug.Log("script0=========Update");
// isUpdate=true;
// }
// }
bool isLateUpdate=false;
void LateUpdate()
{
if(!isLateUpdate)
{
Debug.Log("script0=========LateUpdate");
isLateUpdate=true;
}
}
}
再次运行游戏,看看它的结果。脚本的执行顺序和以前完全一样,script0即便删除掉了Update方法,但是它也不会直接执行LateUpdate方法,而是等待script1和script2中的Update方法都执行完毕以后,再去执行所有的LateUpdate方法。
通过这两个例子,我们就可以很清楚地断定,Unity后台是如何执行脚本的了。每个脚本的Awake、Start、Update、LateUpdate、FixedUpdate等等,所有的方法在后台都会被汇总到一起:
后台的Awake(){
// 这里暂时按照上图中的脚本执行顺序,后面会谈到其实可以自定义该顺序的
脚本2中的Awake();
脚本1中的Awake();
脚本0中的Awake();
}
后台的方法Awake、Update、LateUpdate等等,都是按照顺序,等所有游戏对象上脚本中的Awake执行完毕之后,再去执行Start、Update、LateUpdate等方法的。
后台的Update(){
// 这里暂时按照上图中的脚本执行顺序,后面会谈到其实可以自定义该顺序的
脚本2中的Update();
脚本1中的Update();
脚本0中的Update();
}
共0条 [查看全部]相关评论