一图看懂 Unity函数执行顺序/Unit脚本生命周期

2023-11-17

温故而知新,有些函数过久了忘了调用顺序,发个文记一下,下边有对各个函数的解释。

第一个场景加载

这些函数在场景开始时被调用(场景中的每个对象一次)。

  • Awake:这个函数总是在任何 Start 函数之前调用,也只是在一个预制件被实例化。(如果游戏对象在启动期间处于非活动状态,则在激活之前不会调用 Awake。)
  • OnEnable:(仅在对象处于活动状态时调用):此函数在对象启用后立即调用。这发生在创建 MonoBehaviour 实例时,例如在加载关卡或游戏对象用脚本组件实例化。

请注意,对于添加到场景中的对象,所有对象的 Awake 和 OnEnable 函数 脚本将在为它们中的任何一个调用 Start、Update 等之前调用。当然,当您在游戏过程中实例化一个对象时,这不能强制执行。

编辑

  • Reset:当脚本第一次附加到对象时以及使用重置命令时,都会调用重置以初始化脚本的属性。
  • OnValidate:只要设置了脚本的属性,就会调用 OnValidate,包括反序列化对象时,这可能发生在不同的时间,例如在编辑器中打开场景时和域重新加载后。

第一帧更新前

  • Start:仅当启用脚本实例时,才会在第一帧更新之前调用 Start。

对于属于场景资源的对象,在 Update 之前对所有脚本调用 Start 函数,等等对它们中的任何一个调用。当然,当您在游戏过程中实例化一个对象时,这不能强制执行。

在帧之间

  • OnApplicationPause:在检测到暂停的帧结束时调用,在正常帧更新之间有效。调用OnApplicationPause后将发出一帧额外的帧,以允许游戏显示指示暂停状态的图形。

更新订单

当您跟踪游戏逻辑和交互、动画时,相机
位置等,您可以使用一些不同的事件。常见的模式是在Update函数中执行大多数任务,但您也可以使用其他函数。

  • FixedUpdate: FixedUpdate通常比Update更频繁地调用。如果帧速率较低,则每帧可以调用多次,如果帧速率较高,则可能根本不会在帧之间调用。所有物理计算和Update都在FixedUpdate之后立即发生。在FixedUpdate中应用移动计算时,您不需要将值乘以Time.deltaTime。这是因为FixedUpdate是在一个可靠的计时器上调用的,与帧速率无关。

  • Update: 每帧调用一次Update。它是帧更新的主要主力功能。

  • LateUpdate: LateUpdate在Update完成后每帧调用一次。当LateUpdate开始时,在Update中执行的任何计算都将完成。LateUpdate的常见用途是跟随第三人称相机。如果您让角色在Update中移动和转动,您可以在LateUpdate中执行所有摄像机移动和旋转计算。这将确保角色在相机跟踪其位置之前已完全移动。

一般来说,您不应该依赖于为不同的游戏对象调用相同事件函数的顺序——除非该顺序被明确记录或可设置。(如果您需要对播放器循环进行更细粒度的控制,可以使用PlayerLoop API。)

您不能指定为同一 MonoBehaviour 子类的不同实例调用事件函数的顺序。例如,一个 MonoBehaviour 的Update函数可能在另一个 GameObject 上的相同 MonoBehaviour 的Update函数之前或之后调用 - 包括它自己的父级或子级 GameObjects。

您可以指定一个 MonoBehaviour 子类的事件函数应该在另一个子类的事件函数之前被调用(使用“项目设置”窗口的“脚本执行顺序”面板)。例如,如果您有两个脚本,EngineBehaviour 和 SteeringBehaviour,您可以设置脚本执行顺序,使 EngineBehaviour 始终在 SteeringBehaviour 之前更新。

动画更新循环

当 Unity 评估动画系统时, 这些功能和Profiler会调用标记。

  • OnStateMachineEnter:状态机更新步骤期间,当控制器的状态机进行流经进入状态的转换时,在第一个更新帧上调用此回调。不需要转换到StateMachine子状态。
    仅当动画图中存在控制器组件(例如AnimatorControllerAnimatorOverrideControllerAnimatorControllerPlayable)时才会发生此回调。
    注意:将此回调添加到StateMachineBehaviour组件会禁用多线程状态机评估。

  • OnStateMachineExit:状态机更新步骤期间,当控制器的状态机进行通过退出状态的转换时,在最后一个更新帧上调用此回调。不需要转换到StateMachine子状态。
    仅当动画图中存在控制器组件(例如AnimatorControllerAnimatorOverrideControllerAnimatorControllerPlayable)时才会发生此回调。
    注意:将此回调添加到StateMachineBehaviour组件会禁用多线程状态机评估。

  • Fire Animation Events调用从上次更新时间到当前更新时间之间采样的所有剪辑的所有动画事件。

  • StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit):一个层最多可以有 3 个活动状态:当前状态、中断状态和下一个状态。使用定义OnStateEnterOnStateUpdateOnStateExit回调的 StateMachineBehaviour 组件为每个活动状态调用此函数。
    该函数首先针对当前状态调用,然后是中断状态,最后是下一个状态。
    仅当动画图中存在控制器组件(例如AnimatorControllerAnimatorOverrideControllerAnimatorControllerPlayable)时才会发生此步骤。

  • OnAnimatorMove:每个更新帧,每次调用一次动画组件修改根运动(Root Motion)

  • StateMachineBehaviour(OnStateMove):在每个活动状态上调用它,并使用定义此回调的StateMachineBehaviour 。

  • OnAnimatorIK:设置动画 IK。对于启用了IK 通道的每个 Animator Controller 层调用一次。
    此事件仅在您使用 Humanoid 装备时执行。

  • StateMachineBehaviour(OnStateIK):使用StateMachineBehaviour组件在每个活动状态上调用该组件,该组件在启用IK 传递的层上定义此回调。

  • WriteProperties:将所有其他动画属性从主线程写入场景。

有用的轮廓标记(Useful profile markers

脚本生命周期流程图中显示的一些动画函数不是您可以调用的事件函数;它们是 Unity 处理动画时调用的内部函数。

这些功能有探查器标记( Profiler Markers,因此您可以使用Profiler查看 Unity 何时在框架中调用它们。了解 Unity 何时调用这些函数可以帮助您准确了解您调用的事件函数何时执行。

例如,假设您在FireAnimationEvents回调中调用Animator.Play 。如果您知道FireAnimationEvents回调仅在状态机更新进程图函数执行后触发,您可以预期您的动画剪辑
将在下一帧播放,而不是立即播放。

  • 状态机更新:在执行序列中的这一步评估所有状态机。仅当动画图中存在控制器组件(例如AnimatorControllerAnimatorOverrideControllerAnimatorControllerPlayable)时,才会发生此步骤。
    注意:状态机评估通常是多线程的,但添加某些回调(例如OnStateMachineEnterOnStateMachineExit)会禁用多线程。有关详细信息,请参阅上面的动画更新循环

  • ProcessGraph:评估所有动画图。这包括对所有需要评估的动画片段进行采样,以及计算 Root Motion。

  • ProcessAnimation:混合动画图的结果。

  • WriteTransforms:将所有动画变换从工作线程写入场景。具有多个启用了IK 通道
    的图层的 Humanoid 装备可以有多个WriteTransforms通道

渲染

  • OnPreCull:在相机剔除场景之前调用。剔除确定哪些对象对相机可见。OnPreCull 在剔除发生之前被调用。
  • OnBecameVisible/OnBecameInvisible:当对象对任何相机可见/不可见时调用。
  • OnWillRenderObject:如果对象可见,则为每个摄像机调用一次。
  • OnPreRender:在相机开始渲染场景之前调用。
  • OnRenderObject:在所有常规场景渲染完成后调用。此时您可以使用GL类或Graphics.DrawMeshNow来绘制自定义几何图形。
  • OnPostRender:在相机完成渲染场景后调用。
  • OnRenderImage:场景渲染完成后调用以允许 post-processing图像的,请参阅后处理效果
  • OnGUI:每帧调用多次以响应 GUI 事件。首先处理 Layout 和 Repaint 事件,然后是每个输入事件的 Layout 和键盘/鼠标事件。
  • OnDrawGizmos用于绘图 Gizmos在里面 scene view用于可视化目的。

注意:这些回调仅适用于内置渲染管线

协程

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

  • yield在下一帧调用了所有 Update 函数后,协程将继续。
  • yield WaitForSeconds在为帧调用了所有更新函数之后,在指定的时间延迟后继续。
  • yield WaitForFixedUpdate在所有脚本上调用了所有 FixedUpdate 后继续。如果协程在 FixedUpdate 之前产生,那么它会在当前帧的 FixedUpdate 之后恢复。
  • yield WWW在 WWW 下载完成后继续。
  • yield StartCoroutine链接协程,并等待 MyFunc 协程首先完成。

当对象被销毁时

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

退出时

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

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


有个更详细的 放下链接icon-default.png?t=M3C8https://blog.csdn.net/u014361280/article/details/81363101​​​​​​​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一图看懂 Unity函数执行顺序/Unit脚本生命周期 的相关文章

  • 一些个人常用的网站网址

    一些个人常用的网站网址 GitHub https github com Gitee https gitee com 1 书栈网 https www bookstack cn explore cid 27 tab popular 2 Unit
  • Unity用Vuforia做AR实现脱卡效果

    有时在识别目标丢失后我们仍希望虚拟物体能够出现在摄像机前 或者到一个特定的位置 我们能对其进行操作 这就是脱卡功能 自带的脱卡功能应该是ExtendedTracking 允许模型在识别图丢失的时候还存在 位置不变 在丢失的时候的位置 这样也
  • Unity3D之Rigidbody

    目录 常用的Rigidbody属性和方法 rigidbody AddForce rigidbody AddTorque rigidbody velocity rigidbody angularVelocity rigidbody Sleep
  • 【Unity Shader】屏幕后处理1.0:调整亮度/饱和度/对比度

    1 Unity中实现屏幕特效的基本步骤 什么叫屏幕后处理 Screen post processing effects 渲染完整个场景得到屏幕图像后对图像进行一系列操作 实现各种屏幕特效 这一步我们可以添加很多例如景深 Depth of F
  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • 【UGUI】2D头顶血条制作

    前言 近期因为需要制作玩家和敌人头顶的2D血条 查找了很多博客 发现很多都拘束于Canvas的渲染模式必须要设定为ScreenSpace Overlay 还有应该是版本原因 我的是unity2019 1 11f1 用RecttTransfo
  • Unity中loading页加载的实现

    首先创建一个Global cs 使用单例用于存储场景的名字 便于后续脚本的调用 此脚本不必挂载在游戏物体上 using UnityEngine using System Collections public class Global Mon
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity之获取游戏物体对象或组件的几个方法

    文章目录 前言 通过物体名称获取对象 GameObject Find Transform Find 通过物体标签获取对象 GameObject FindWithTag GameObject FindGameObjectWithTag Gam
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • unity3d 自定义的图片无法放入source image中

    须将图片的texture type改为 sprite
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之NPC药品商店系统(NGUI版)

    后续会出UGUI Json的版本 敬请期待 游戏开发中经常会出现药品商店 实际操作与武器商店类似 甚至根据实际情况可以简化设置 废话不多说 直接上代码 药品商店的源码 using System Collections using Syste

随机推荐

  • 哈工大操作系统实验二:系统调用的实现

    实验链接 文章目录 前言 做实验前一定要先拍个快照 操作系统实验环境的搭建请看如下链接 Ubuntu系统 Linux0 11环境搭建 一 实验内容 二 基础知识 三 实验步骤 注 因为实验一已经修改过启动文件 但此次实验需要完整的启动文件
  • 小白如何做好项目管理?看这里

    作为项目管理新手 你刚被安排负责一个重要的新项目 这是你的第一个项目 是一个重大的挑战 以下这些方法可以帮你有个好的开始 成功管理你的第一个项目 一 学习和培养能力 能力发展首先要突破不知道没有能力 认识项目管理是一个职业方向 通过了解项目
  • MySql Community Downloads 社区版下载地址

    https dev mysql com downloads mysql
  • Servlet+JSP+JavaBean开发模式(MVC)介绍

    好伤心 写登陆注册之前看见一篇很好的博文 没有收藏 然后找不到了 前几天在知乎上看见一个问题 什么时候感觉最无力 前两天一直想回答 尝试过google到的所有solve case 结果bug依然在 今天想回答 明明遇见过 就是找不到那篇文的
  • 深度学习 卷积神经网络即插即用的小插件

    卷积神经网络即插即用的小插件 前言 卷积神经网络设计技巧 小插件 STN ASPP Non local SE CBAM DCN v1 v2 BlurPool RFB ASFF 代码实现 前言 本篇博客主要介绍卷积神经网络中的即插即用的模块
  • Python日志库logging总结(最全的版本)

    转自 https cloud tencent com developer article 1354396 1 日志级别 Python 标准库 logging 用作记录日志 默认分为六种日志级别 括号为级别对应的数值 NOTSET 0 DEB
  • (前端)HTML之表格

    表格标签 table 的基本语法 table 表格容器tr 列td 单元格th 粗体caption 标题列 例子 table width 400 border 1 cellspacing 2 cellpadding 2 align left
  • python中两种getter和setter方法

    当给属性赋值的时候 使用实例 属性 属性值的方式显然把属性暴露出来了 并且也无法对属性值进行限制检查 java中提供了setter和getter方法 那么python是如何做的呢 在绑定属性时 如果我们直接把属性暴露出去 虽然写起来很简单
  • 【指针内功修炼】函数指针 + 函数指针数组 + 回调函数(二)

    文章目录 1 函数指针 2 函数指针数组 函数指针数组的用途 3 指向函数指针数组的指针 4 回调函数 冒泡排序 qsort 排序 qsort 排序整型数组 qsort 排序结构体 模拟实现 qsort 1 函数指针 函数指针 顾名思义 就
  • List转换为String

    public static void main String args List
  • JBOSS实践一:安装

    因为工作关系 需要接受一套基于JBOSS容器的应用 首先从JBOSS环境搭建开始 JBOSS环境可以在一台机器上运行 也可以在一台机器上部署多套JBOSS 一 目标 1 在一台机器上部署JBOSS 4 2 2 GA 原系统运行于此 2 在一
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • background属性介绍

    background属性在CSS中有较多的应用 主要用来设置背景颜色 图片 background属性可以分开写 也可以合并 建议合并减少代码量 1 background color 设置背景颜色 设置的背景颜色会填充元素的内容 内边距和边框
  • 【SpringBoot笔记39】SpringBoot + SockJS + Stomp实现WebSocket通信(建立连接、发送消息、订阅消息、断开连接)

    这篇文章 主要介绍SpringBoot SockJS Stomp实现WebSocket通信 建立连接 发送消息 订阅消息 断开连接 目录 一 WebSocket通信 1 1 前端环境 1 2 后端环境 1 3 添加WebSocket配置
  • 传统程序优化与终身程序优化

    传统程序优化示例一 cpu示例 3个方面浅谈程序优化 每一个程序员都有一个大梦想当初在学校实验室的时候 常常写一个算法 让程序跑着四处去晃荡一下回来 结果也就出来了 可工作后 算法效率似乎重要多了 毕竟得真枪实弹放到产品中 卖给客户的 很多
  • uni-app,文本实现展开、收起全文

    效果 思路 1 根据文本显示的布局中 每行大致能显示的文字个数 实例是大致每行26个文字 2 首先加载页面时 根据文字总长度判断是否超出自定义行数 来处理相应的数据 多余自定义行数 截取对应的文字个数做显示 代码与讲解 1 设置参数 scr
  • 【Docker】Docker快速入门,常用网址与常用命令

    目录 一 docker常用网址 建议收藏 docker官方公开库 Docker Hub docker官方网站 Home Docker docker菜鸟联盟教程 Docker 教程 菜鸟教程 二 docker常用命令 一 镜像使用 1 镜像操
  • Mastering Debugging in Visual Studio 2010 - A Beginner's Guide

    Mastering Debugging in Visual Studio 2010 A Beginner s Guide http www codeproject com Articles 79508 Mastering Debugging
  • 非常好用的自动化运维工具------ansible

    目录 一 ansible 简介 1 ansible 是什么 2 ansible 特点 3 ansible 架构图 二 ansible的配置部署 1 使用 yum 安装epel源和ansible 2 修改ansible的仓库文件 3 配置公私
  • 一图看懂 Unity函数执行顺序/Unit脚本生命周期

    温故而知新 有些函数过久了忘了调用顺序 发个文记一下 下边有对各个函数的解释 第一个场景加载 这些函数在场景开始时被调用 场景中的每个对象一次 Awake 这个函数总是在任何 Start 函数之前调用 也只是在一个预制件被实例化 如果游戏对