- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了this和官方文档:fixedUpdate() ,以及 deep explanation .
所以我试图分离我的代码。首先,在 Update()
,我没有给出完整的代码,变量是不言自明的:
private void Update()
{
if (Input.GetButton("Jump")) {
if (groundsTouched>0) {
_jumpRequest = true;
} else {
_keepOnJumping = true;
}
} else {
_keepOnJumping = false;
}
/* Handle release button: */
_fallRequest = true;
}
FixedUpdate()
中的所有计算。像这样:
private void FixedUpdate()
{
if (_jumpRequest) {
if (!_jumpGravitySent) {
_jumpGravitySent = true;
_animator.SetBool("Jump", true);
_jumpRequest = false;
jumpTimeCounter = jumpTime;
/* Cancel all force (couldn't find a better way) */
_rigidbody.velocity = Vector3.zero;
_rigidbody.angularVelocity = Vector3.zero;
_rigidbody.AddForce(
Vector3.up * jumpVelocity, ForceMode.VelocityChange
);
}
} else if (_keepOnJumping) {
jumpTimeCounter -= Time.fixedDeltaTime;
if (jumpTimeCounter >= 0) {
_rigidbody.AddForce(
Vector3.up * jumpVelocity * jumpKeepMultiplier,
ForceMode.Acceleration
);
}
}
if (groundsTouched == 0 &&
_rigidbody.velocity.y > velocityFallMin &&
_rigidbody.velocity.y < velocityFallMax
) {
_animator.SetBool("Jump", false);
_animator.SetBool("Fall", true);
}
if (_fallRequest) {
_fallRequest = false;
_jumpGravitySent = false;
_keepOnJumping = false;
}
}
You are adding Force dependent on fixedDeltaTime which is dependent on your available performance (or frame rate essentially).
If you go to Edit->Project Settings->Time and change fixed Timestep to a larger value, you will get the expected behavior. Try a few different values of Fixed Timestep and see how the behavior changes.
Another suggestion would be to rewrite the code so it's not dependent on frame rate (eg. use Velocity and not force or add a specific amount of force on jump, not dependent on Timestep).
最佳答案
我想知道给你这个答案的那个 Unity QA 是谁,这太令人畏惧了。
让我解释一下现实中会发生什么。
1) 让我们从 fixedDeltaTime
开始: 此值从不依赖于帧速率 .它可以在编辑器中设置(在 Edit->Project Settings->Time
中),这是在运行时保留的值,除非任何脚本通过赋值更改它。 Unity 引擎永远不会自行更改它。
2) 物理循环:在完整的引擎循环中,Unity 将执行多个物理循环(0,1 或更多),然后执行单个渲染循环。每个渲染循环执行的物理循环数基于 fixedDeltaTime
以及距离上一次已经过去了多少时间(即:渲染循环的 deltaTime
)。
例如,假设 fixedDeltaTime = 0.0166667
并且自上次物理循环以来耗时小于那个,例如10
小姐。 Unity 不会执行物理循环。现在假设在10
中甚至已经渲染了下一帧。 ms - 这意味着自上次物理循环以来,20
ms过去了。由于这高于 fixedDeltaTime
, Unity 将执行一个物理循环。
有时可能会出现帧渲染非常缓慢(由于不可预见的原因),例如在 40
中。小姐。为了保持物理模拟的一致性,Unity 必须连续运行两个物理循环,这是因为 0.04/0.0166667 = 2.4
.
请记住,Unity 会跟踪上一个物理循环开始时间与下一个物理循环开始时间之间的差异:如果渲染持续 10
每帧毫秒,fixedDeltaTime
设置为 166667
ms (60Hz),一旦你开始运行时,Unity 将执行第一个物理循环,然后在第一个渲染帧之后跳过一个(因为只有 10
毫秒而不是 166667
),然后执行一个物理循环在第二个渲染帧之后( 20
毫秒通过 166667
)。但是现在我们的循环被 3.3333
去同步了。 ms,所以 Unity 会对此进行跟踪。
第 3 帧之后,另一个 10
ms 已过,但自 10+3.3333 = 13.3333
起不会执行任何物理循环仍低于 fixedDeltaTime
.现在,让我们假设第 4 个渲染帧“出错”,并且持续了 25
ms 而不仅仅是 10
.在下一个物理循环开始时,共有 25+13.3333 = 38.3333
个自上次物理更新以来已过去,38.3333/16.6667 = 2.3
, Unity 将执行 两个 在继续渲染第 5 帧之前,物理循环连续进行以跟上固定步长模拟。
在所有这些介绍之后,让我们回到你的问题,看看会发生什么:
在某个时刻执行 Update()
, 并设置 _jumpRequest = true;
和 _fallRequest = true;
.
在这个渲染帧之后,FixedUpdate()
第一次执行,执行AddForce ForceMode.VelocityChange
行,并设置 _fallRequest = false;
, _jumpGravitySent = false;
和 _keepOnJumping = false;
.结束后FixedUpdate()
, Unity 执行物理模拟,借助物理引擎调整刚体的位置和速度。
现在问题触发了:由于渲染帧很慢,物理循环至少连续执行两次,但没有Update()
在两者之间执行,所以 FixedUpdate()
中的所有内容被跳过,但物理模拟第二次运行,相对于预期的最高位置向下拖动刚体位置。
当Update()
再次执行,最后你的代码集 _keepOnJumping = true;
, 当它返回 FixedUpdate()
它将执行 AddForce ForceMode.Acceleration
,但紧接着,第二次执行另一个物理模拟(由于低帧率),再次向下拖动刚体,然后才能在屏幕上渲染。
希望这有助于理解您的问题及其发生的原因,以便您现在拥有正确的工具来正确修复它。
关于unity3d - 与帧率无关的 FixedUpdate 与 Update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55066052/
假设我们要描述一个满足以下真值表的组合电路: a b | s0 s1 s2 s3 ----------------- 0 0 | 1 d d d 0 1 | 0 1 d d 1 0 |
.mainIDv { height:300px; width:400px; padding:5px; margin: 8px auto 8px auto; } .ImgDisp{
我的 iOS 应用程序遇到了一个恼人的问题。突然,当我启动带有 TableView 的 View Controller 时,出现以下错误: Unrecognized selector sent to
我有一个简单的 PreferenceActivity 类,它的 onCreate 将我的 R.xml.preferences 屏幕传递给 ((PreferenceActivity)super).add
在大学项目范围内,我应该实现数据库的聚合。 我得到了一个实体关系模型,它看起来与此类似: 现在我应该实现一个 SQL 脚本来创建这样的数据库,但我在谷歌或其他任何地方找不到有关此主题的任何内容。在我教
我一直在努力阅读 GCD 并试图弄明白。我读了很多地方,应该始终使用 GCD,如果一个人正在做一些繁重的工作,这会卡住 UI,我确实理解这一点,但是 GCD 也可以仅仅为了性能而使用吗?假设我有一个循
当有人用他们自己的类重载线程时,这个问题似乎已经以一种或另一种形式得到了回答,但是如果只是尝试使用 QTimer 类而不扩展 QThread 类呢?我正在尝试将 QTimer 用于 QT。他们在 上的
在网上看了类似的问题/错误,没有一个对我有帮助... 未处理的拒绝 SequelizeEagerLoadingError:任务未关联到用户! 我的用户路线 router.get('', functio
如果我正在评估两个变量而不是两个方法调用,那么我使用“&&”或“&”是否重要 //some logic that sets bool values boolean X = true; boolean
我们目前正在内部为我们的项目使用 Oracle 10g,这不太可能改变,但最终我们将向其他客户提供此应用程序,我们需要能够提出替代的免费数据库。 那么使 Hibernate 持久层独立于所使用的底层
我的 AsyncTask 类中的 onPostExecute() 方法有问题。 我有一个SignupActivity: public class SignupActivity extends AppC
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我一直在大量关注 sequelize 的文档,但在处理关系时遇到了问题。这是我使用 belongsTo 创建两个非常基本的 1:1 关系的非常简单的代码 import Sequelize, { STR
我希望这与 GMT 无关,否则我会觉得自己很愚蠢。 2 个快速相关的问题。为什么这会转换为不同的日期?正在失去一天。我查看了其他答案中所述的时区,但它始终是 GMT 时区 0000,这正是我所期望的。
我发现了这个问题的很多版本,但似乎都没有比明显的 Google Chrome 错误更进一步。 发生的情况是,每当我将 codeigniter 设置复制到服务器上的新文件夹,以基于它启动新项目时,我在尝
我需要一个与 UI 无关的简单布局管理器。通过这个,我的意思是它不应该指定我想如何在屏幕上表示我的形状/控件。它应该能让我说: 我想要 X 形状。我想要 X 形下的 Y 形。我希望形状 Z 包围 X,
当有一个方法== , 方法 !=被定义为采用该结果并应用 !给它。 (可能还有 =~ 和 !~ 。) 与此不同,>= , 通常表示 >或 == , 实际上独立于 >和 == .这两个定义似乎都不会影响
我在 Ruby Netbeans 6.5.1 中获得了大量(我称之为)无关的自动完成信息。 例如,如果我输入一个模型对象的名称,然后输入一个句点(无论我是在 Controller 中还是在 View
我是 NodeJS 的新手,有 express 和 Sequelize。当我想创建图书租赁时,控制台会提示我“图书与租赁无关”。 当我将表迁移到 sql 数据库时,id 就在它们的位置并且我的播种机正
我有众所周知的错误: implicit declaration of function 'STLINKReadSytemCalls' [-Wimplicit-function-declaration]
我是一名优秀的程序员,十分优秀!