澄清Update() 和FixedUpdate() 的使用? Unity2D [关闭]

2024-06-20

所以我知道FixedUpdate应该用于物理操作等,但我很难理解什么算作物理。例如,我通过查看按下的键来移动角色,然后施加力。目前我正在 Update() 中执行此操作。由于 addForce 是应用于物理对象(玩家,因为它具有刚体组件)的代码,是否应该将此功能移至FixedUpdate()?

但是,如果我确实将此代码移至fixedUpdate(),那么在该方法中运行input.GetKey 可以吗?我在某处读到,如果在 FixUpdate() 中监听输入,输入可能会被丢弃?所以是的,令人困惑...听起来好像 Input.GetKey 应该在 Update() 中,并且当按下某个键时,会激活一个标志。同时,FixedUpdate() 中的功能正在监视要激活的适当标志。这样...这种方式输入是在 Update() 中处理的,移动是在 FixUpdate() 中...我理解对吗?

另外,我正在使用碰撞器和触发器,这些代码是否也位于FixedUpdate() 中?


如果没有良好的资源,这是最难理解的事情之一。它通常是新 Unity 开发人员代码中大多数“初学者错误”的原因。

在我们开始之前:

正如您可能已阅读的文档,您可以理解以下内容。

初始化顺序:

  1. Awake
  2. Start

帧顺序:

  1. Update
  2. 后期更新

您可以通过转到“编辑”>“项目设置”>“脚本执行顺序”进一步自定义特定脚本的顺序(例如:始终在 PlayerMovement 之前运行 ScoreManager)。

However,这不是 Unity 中发生的事情的完整列表。物理循环、渲染和输入都按此顺序在不同时间发生。需要注意的关键是有 2脚本执行周期。 “框架”(最常见 - 更新)和“固定”(最常见 - 固定更新)。

考虑粗略地浏览一下脚本执行顺序 https://docs.unity3d.com/Manual/ExecutionOrder.html.

有 2 个脚本执行周期意味着什么?简而言之,所有 MonoBehaviour 方法都与这两个周期之一相关联。这些方法只会执行一次逻辑,直到循环完成。换句话说,“PlayerMovement.cs”脚本的 Update 方法只会为每一帧运行一次。您的 OnCollissionStay 对于每个固定周期仅运行一次。

为什么 Unity 有 2 个不同的周期。

固定周期Unity 中的(FixedUpdate)是:

  • 确定性的
  • 基于数学的
  • 不依赖于渲染

物理不需要渲染精灵或可见的 UI 元素就能够计算是否已击中碰撞体或是否应应用重力。 Unity 分离出特定于物理的数据以有效地执行计算。此外,其中很多都是确定性的。如果您在一帧上从 (0,0) 开始,并且您的刚体在下一帧上移动到 (10,10)(并且您没有传送),我可以合理地假设您移动到了点 (5,5)。这使得 Unity 的物理引擎能够“插入”碰撞和交互。这意味着物理学不需要查看每一帧“动作”来确定是否发生了碰撞。固定周期允许 Unity 独立于帧计算物理并安全地传达这些变化。

帧周期Unity中的(更新)是Unity所有交互的基础。如果没有更新游戏的框架,什么都不会发生。如果帧没有更新,那么浪费 CPU 周期来计算游戏逻辑是没有意义的。这意味着:

  • 输入绑定到框架
  • 帧周期取决于渲染

需要注意的重要一点:固定循环可能会也可能不会每帧都会发生。在较低的帧速率下,每帧可能会出现多个固定周期。在较高的帧速率下,将出现许多帧,而没有任何固定周期。

这对我的游戏逻辑意味着什么?

在大多数情况下,这两个周期相当协调地工作。最常见的担忧原因如下:

  • 尝试使用 Transform 更新游戏对象位置and物理学(即刚体)。您应该尝试仅在 2 个周期之一更新游戏对象位置。如果游戏对象预计会与物体碰撞或与重力等物理相互作用,请使用 Rigidbody.move 或 Rigidbody.velocity。

  • 尝试在固定周期中读取输入。由于固定周期每帧可能出现 0-多次,因此输入可能会丢失。如果您在一帧上使用 GetButtonDown() 但 FixCycle 不运行,您将“错过”FixedUpdate 中的输入。通常最好使用布尔值或队列来管理输入和物理系统之间的这种差异。 (就像在Update中设置bool Jump = true,以及当您实际执行物理组件时在FixedUpdate中读取/更新bool Jump)

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

澄清Update() 和FixedUpdate() 的使用? Unity2D [关闭] 的相关文章

  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 私有模板函数

    我有一堂课 C h class C private template
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub

随机推荐

  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • 如何更改列表中的元素并保留原始列表的副本?

    我四处搜寻并尝试了很多东西 但我无法让它发挥作用 我认为问题与 Python 列出名称的方式有关point到列表中 而不是being实际的列表 但我仍然无法弄清楚 情况是这样的 这是一个字典列表 list original dictiona
  • RSolr::错误::InvalidRubyResponse - 200 OK

    即使启动 forreman 并启动 sunspot solr 后 我仍收到以下错误 RSolr Error InvalidRubyResponse 200 OK Error
  • Django 1.11 我们可以在两个不同数据库的表之间创建关系吗?

    在我的项目中 我试图创建具有多个数据库的中央数据库服务 所以我的问题是我们可以在两个不同数据库的表之间创建关系吗 Example MySQL DB1 表用户 class User models Model name models CharF
  • 在 Cython 中访问 NumPy 记录数组列

    我是一位相对经验丰富的 Python 程序员 但很长一段时间没有编写任何 C 语言 并且正在尝试理解 Cython 我正在尝试编写一个 Cython 函数 该函数将在 NumPy 记录的列上进行操作 到目前为止我的代码如下 recarray
  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 从按钮执行 Segue 时应用程序冻结

    我的故事板中有一个按钮 它呈现一个带有模式序列的视图控制器 每次按下此按钮时 应用程序都会冻结 没有崩溃 也没有错误消息 prepareForSegue被调用 所有应该存在的视图控制器都在代码中prepareForSegue 但它们不会出现
  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • 基于网络的应用程序中的图表

    可使用 ASP NET 在网页上显示图表的各种图表工具有哪些 我了解 Dundas 和 Infragistics 等商业工具 我可以用谷歌搜索这个 但我想知道参与者使用过的各种工具 任何可用的免费图表工具也欢迎提及 如果您不介意使用 Fla
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 如何在启动时向 groovysh 添加导入?

    我正在开发一个项目 希望用户在 Groovysh 上试验 Java 类 我想让他们方便 并希望在 groovysh 启动时默认导入某些包 这样用户就不必在每次启动 shell 时重新输入相同的导入 有谁知道如何做到这一点 提前致谢 伊戈尔
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • MSBuild 找不到异步所需的引用

    我们安装了 Visual Studio 2010 SP1 和 Async CTP SP1 刷新 包含使用的项目的解决方案async await从 VS IDE 构建时 关键字构建正常 另外 当构建时devenv build Debug so
  • C#:询问用户密码,然后将其存储在 SecureString 中

    在我目前为客户开发的小型应用程序中 我需要询问用户他的 Windows 登录用户名 密码和域 然后使用这些信息系统 诊断 进程 启动启动一个应用程序 我有一个带有 UseSystemPasswordChar 的文本框来屏蔽输入的密码 我需要
  • XSLT:如何在“匹配”属性中表示 OR?

    我想对与名称 A 或 B 匹配的元素执行一系列操作 我在想下面类似的事情 但它不起作用
  • javadoc:@value 引用其他类中的字段

    value Constants KEY MEAN blah value Constants KEY STDDEV return A JSONObject with keys for mean and standardDeviation 当我
  • 为什么我需要结束 ob_start()?

    php 文档建议我应该用 ob end flush 结束每个 ob start 我在网站的每个页面上使用一个 只是为了允许我在应用程序中的任何位置使用 firephp 日志方法 该应用程序运行良好 但我想知道是否有任何我不知道的东西可能有害
  • 澄清Update() 和FixedUpdate() 的使用? Unity2D [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 所以我知道FixedUpdate应该用于物理操作等 但我很难理解什么算作物理 例如 我通过查看按下的键来移动角色 然后施加力 目前我正