首页 > 解决方案 > 让物理更准确

问题描述

我制作了一个 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()方法来移动火线,但它给了我不平稳的运动,我使用Update()了移动方法,因为它给了我平滑的运动(在这两种方法中我都使用了 Time.deltaTime)。

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

我忘了注意我将 Fixed TimeStep 的值更改为 0.01 以获得更准确的物理。

提前致谢。

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

标签: unity3d

解决方案


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

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

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

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

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

GetComponent<RigidBody2D>().velocity = baseVelocity;

推荐阅读