Unity系统函数的执行顺序

在Unity脚本中,有一些事件函数会在脚本执行时按预定顺序执行。 该执行顺序如下所述:

编辑

  • Reset:Reset是用来初始化脚本属性的,在第一次脚本附在对象上的时候和按下Reset按钮的时候会被执行。

第一次场景加载

  • AwakeAwake方法总是在Start方法执行之前和在一个prefab初始化后被调用。(如果一个gameobject处于inactive的状态,则Awake不会被调用,一直会到gameobject处于active状态的时候会被调用)
  • OnEnable:(只有在对象处于活动状态时才会调用):在启用对象后立即调用此函数, 当创建一个MonoBehaviour实例时会发生。例如,当一个关卡加载或者一个带有脚本的GameObject实例化的时候。
  • OnLevelWasLoaded:这个方法被执行,是为了通知游戏已经加载了新的关卡。
    请注意,对于添加到场景中的对象,所有脚本的AwakeOnEnable函数将在调用其中的任何脚本的StartUpdate等之前调用。 当然,在游戏过程中对象被实例化时,这不能被强制执行。

在第一帧更新之前

  • Start:只有在启用脚本实例时,才会在第一次帧更新之前调用Start
    对于添加到场景中的对象,对象上的所有脚本的Update函数执行之前调用Start函数。 当然,在游戏过程中对象被实例化时,这不能被强制执行。

帧与帧之间

  • OnApplicationPause:这个方法将在暂停键按下的那一帧结束的时候被调用。在调用OnApplicationPause之后会发出一个额外的帧,以允许游戏显示指示暂停状态的图形。

Update的顺序

当你跟踪游戏逻辑和交互,动画,相机位置等时,可以使用几个不同的事件。 常用的模式是在Update函数中完成大部分的任务,不过也有其他一些函数可以利用。

  • FixedUpdateFixedUpdate通常比Update被调用得更频繁。如果帧率很低的时候,FixedUpdate可以一帧被调用多次;如果帧率很高的时候,FixedUpdate也可以几帧调用一次。所有的物理计算和更新都会在FixedUpdate后立即生效。在FixedUpdate中应用运动计算时,您不需要通过Time.deltaTime乘以您的值。 这是因为FixedUpdate是在可靠的定时器上调用的,与帧速率无关。
  • UpdateUpdate函数每一帧调用一次。这是我们使用最频繁的一个函数。
  • LateUpdateLateUpdate同样也是每一帧调用一次,在Update函数结束之后被调用。LateUpdate常用于第三人称摄像头的实时跟随。如果你在Update函数中让角色移动或者转弯,你可以把所有摄像头的移动和旋转计算都放到LateUpdate函数中。这可以确保在角色完成移动或者转弯动作之后摄像头才开始跟随。

渲染期间

  • OnPreCull:在相机剔除场景之前调用。
  • OnBecameVisible/OnBecameInvisible:当一个物体对任何相机变得可见/不可见时调用。
  • OnWillRenderObject:如果对象可见,则为每个摄像机调用一次。
  • OnPreRender:在相机开始渲染场景之前调用。
  • OnRenderObject:所有常规场景渲染完成后调用。 此时可以使用GL类或Graphics.DrawMeshNow绘制自定义几何图形。
  • OnPostRender:相机完成渲染场景后调用。
  • OnRenderImage:在场景渲染完成后调用,用来对图像进行后期处理。
  • OnGUI:每帧调用多次,用于响应GUI事件。Layout和Repaint事件首先被处理,然后是每个输入事件的布局和键盘/鼠标事件。
  • OnDrawGizmos :用于在场景视图中绘制Gizmos以进行可视化。

协程

正常的协程更新在Update函数返回之后调用。协程是一个函数,可以暂停执行(yield),直到给定的YieldInstruction完成。 Coroutines的不同用途:

  • yield :所有的Update函数在下一帧被调用后,协程将继续。
  • yield WaitForSeconds:在指定的时间延迟后,调用所有Update函数之后,继续。
  • yield WaitForFixedUpdate:在所有脚本上调用所有FixedUpdate后继续。
  • yield WWW:一个WWW下载完成之后继续。
  • yield StartCoroutine:链接协程,会等MyFunc协程先完成。

当对象被销毁的时候

  • OnDestroy:对象存在的最后一帧更新完之后的所有Update函数执行完之后执行。(对象可能在响应Object.Destroy或关闭场景时被销毁)。

当中止的时候

这些函数被调用到场景中的所有活动对象上:

  • OnApplicationQuit:在应用程序退出之前,所有游戏对象都会调用该函数。 在编辑器中,当用户停止播放模式时会调用它。
  • OnDisable:当对象被禁用或不活动时,将调用此函数。

流程图

在这里插入图片描述

代码

public class Demo : MonoBehaviour
{
    private void Awake()
    {
        
    }

    private void OnEnable()
    {
        
    }

    void Start()
    {
        
    }

    private void FixedUpdate()
    {
        
    }

    void Update()
    {

    }

    private void LateUpdate()
    {
        
    }

    private void OnGUI()
    {
        
    }

    private void OnApplicationPause(bool pause)
    {
        
    }

    private void OnDisable()
    {
        
    }

    private void OnApplicationQuit()
    {
        
    }

    private void OnDestroy()
    {
        
    }
}

原文链接

原文链接:https://blog.csdn.net/u012130706/article/details/79393527?utm_source=copy

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,可以通过修改脚本的执行顺序来控制不同脚本之间的事件函数的调用顺序。有三种方法可以实现这个目的。 第一种方法是通过修改脚本的.cs.meta文件来控制脚本的执行顺序。在Unity编辑器中,每个脚本文件都对应着一个.cs.meta文件。你可以打开.cs.meta文件,并修改其中的"executionOrder"属性的值来改变脚本的执行顺序。较小的值表示较早执行,较大的值表示较晚执行。这种方法需要对每个脚本进行手动调整,比较繁琐。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【Unity3D日常开发】Unity3D中实现不同脚本之间的执行顺序控制](https://blog.csdn.net/q764424567/article/details/128920346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Unity改变脚本执行顺序](https://blog.csdn.net/weixin_42935398/article/details/123800807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值