【问题标题】:Make Physics more accurate让物理更准确
【发布时间】:2018-07-15 00:14:24
【问题描述】:

我制作了一个 2D 游戏。在这个游戏中,我有一个弹丸,我自己移动火是这样的:

void Update()
{
 gameObject.transform.position = new Vector3(
  gameObject.transform.position.x + baseVelocity * Time.deltaTime,
  gameObject.transform.position.y + baseVelocity * Time.deltaTime,
  gameObject.transform.position.z);
}

而且,我使用void OnTriggerEnter2D(Collider2D other) 来了解何时发生冲突。

问题是当游戏在 30-FPS 的弱手机上运行时,它不会检测到碰撞,而在 60-FPS 的手机中同样的火会发生碰撞。

我认为这是因为火焰在 30-FPS 手机中移动了 2 倍。

一种选择是使用FixedUpdate() 方法来移动fiers,但它给了我不平稳的运动,我使用Update() 方法来移动,因为它给了我平滑的运动(在这两个方法中我都使用了Time.deltaTime)。

您能否建议我如何在使用平滑运动时更准确? 就像在 Update() 方法中移动对象,但检查对象位置比它所在的位置更多(偏移)!

我忘记指出我将 Fixed TimeStep 的值更改为 0.01 以获得更准确的物理。

提前致谢。

编辑: 我最终自己使用 FixedUpdate() 来移动对象,由于很多原因我不能使用物理引擎,我将 FixedUpdate TPS(tick per second) 设置为 60 左右,以适应我的 60 FPS 更新(和仍然无法弄清楚为什么增加 FixedUpdate TPS 会使对象移动不稳定!)。 并将保持这个问题开放,以便找到更好的答案。

【问题讨论】:

  • 使用固定更新。你能展示你在 FixedUpdate 中使用的代码吗?它不应该是生涩的。
  • @RodrigoRodrigues 我说,使用fixedupdate给我带来了生涩的体验,如何处理?
  • 检查它是否有效。我会写一个正确的答案
  • @RodrigoRodrigues 我的代码就像我的更新代码一样,我应该使用 fixedDeltaTime 而不是 Time.deltaTime?

标签: unity3d


【解决方案1】:

你似乎是手动做物理。手动更新位置的问题是您不知道弹丸在帧之间的位置。即使您要使用 FixedUpdate,您仍然可能会遇到两次 FixedUpdate 调用导致您的射弹错过一个对象的情况。

因此,您应该使用 RigidBody2D,而不是手动更新位置,并将碰撞检测设置为“连续”。连续碰撞检测将在物理更新周期之间插入对象碰撞,因此即使在非常高的速度下也能击中目标。此外,此解决方案不依赖于帧速率。

请注意,上述方法仅在您不自己手动更新职位时才有效。这是因为物理引擎使用速度来计算物理更新周期之间的碰撞。

所以不要自己更新位置(这对物理学不利),而是使用力。

或者,如果您不想影响力,请改为更新速度:

GetComponent<RigidBody2D>().velocity = baseVelocity;

【讨论】:

  • 我最终自己使用 FixedUpdate() 来移动对象,由于很多原因我不能使用物理引擎,我将 FixedUpdate TPS(tick per second) 设置为 60 左右与我的 60 FPS 更新相匹配(仍然无法弄清楚为什么增加 FixedUpdate TPS 会使对象移动不稳定!)。感谢您的支持,并保持这个问题开放以找到更好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2015-03-18
  • 2021-05-26
  • 1970-01-01
  • 2020-06-15
  • 2018-09-25
相关资源
最近更新 更多