使物理更准确

时间:2018-07-15 00:14:24

标签: unity3d

我制作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帧/秒的弱电话上运行时,它不会检测到碰撞,而60帧/秒的手机中的相同射击会相撞。

我认为这是因为在30帧/秒的手机中,起火幅度增加了2倍。

一个选择是使用FixedUpdate()方法移动火力,但是它给了我剧烈的运动,而我使用Update()方法运动了,因为它给了我平稳的运动(在这两个方法中我都使用了时间)。 deltaTime)。

您能建议我在使用平稳运动时如何使精度更高吗? 就像在Update()方法中移动对象一样,但是要检查对象在比其实际位置更多(偏移)位置的位置!

我忘了注意到我将“固定时间步长”(Fixed TimeStep)的值更改为0.01,以获得更准确的物理效果。

谢谢。

编辑: 最后,我最终自己使用了FixedUpdate()来移动对象,由于许多原因,我无法使用物理引擎,因此我将FixedUpdate TPS(tick per second)设置为60左右,这与我的60 FPS Update(以及仍然不知道为什么增加FixedUpdate TPS会使对象移动变得生涩!)。 并将使这个问题保持开放状态,以便寻找更好的答案。

1 个答案:

答案 0 :(得分:1)

您似乎是在手动做物理学。手动更新位置的问题是您不知道弹丸在框架之间的位置。即使您使用FixedUpdate,您仍然可能处于两次FixedUpdate调用导致弹丸错过对象的情况。

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

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

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

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

GetComponent<RigidBody2D>().velocity = baseVelocity;