Unity3d 使物理学更精确

Unity3d 使物理学更精确,unity3d,Unity3d,我做一个2D游戏。在这个游戏中,我有一个投射物,我自己移动它,就像这样: void Update() { gameObject.transform.position = new Vector3( gameObject.transform.position.x + baseVelocity * Time.deltaTime, gameObject.transform.position.y + baseVelocity * Time.deltaTime, gameObject.tran

我做一个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(collized2dother)
来了解碰撞何时发生

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

我认为这是因为30-FPS手机的火灾移动速度是原来的2倍

一个选项是使用
FixedUpdate()
方法移动火源,但它给了我剧烈的移动,我使用
Update()
方法移动火源,因为它给了我平滑的移动(在这两种方法中,我都使用Time.deltaTime)

你能建议我如何在使用平滑运动时更精确吗? 类似于在
Update()
方法中移动对象,但检查对象在比其所在位置更多(偏移)位置的位置

我忘了注意,为了获得更精确的物理结果,我将Fixed TimeStep的值更改为0.01

提前谢谢

编辑:
最后,我自己使用FixeUpdate()来移动对象,由于很多原因,我无法使用物理引擎,我将FixeUpdate TPS(滴答每秒)设置为60左右,以与我的60 FPS更新相匹配(但仍然不明白为什么增加FixeUpdate TPS会使对象移动不平稳!)。
为了找到更好的答案,这个问题将保持开放状态。

你似乎在手工做物理。手动更新位置的问题是,您不知道帧之间投射物的位置。即使要使用FixedUpdate,也可能会出现两个FixedUpdate调用导致射弹丢失一个对象的情况

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

请注意,只有在您自己不手动更新职位的情况下,上述操作才会起作用。这是因为物理引擎使用速度来计算物理更新周期之间的碰撞

因此,与其自己更新位置(这对物理学不利),不如使用力

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

GetComponent<RigidBody2D>().velocity = baseVelocity;
GetComponent().velocity=baseVelocity;

使用固定更新。您能显示您与FixeUpdate一起使用的代码吗?罗德里格斯我说,使用FixeUpdate给了我一个不稳定的体验,如何处理这个问题?检查它是否有效。我要写一份正式的报告answer@RodrigoRodrigues我的代码就像我的更新一样,我应该使用fixedDeltaTime而不是Time.deltaTime吗?我最终自己使用FixedUpdate()来移动对象,由于很多原因我不能使用物理引擎,我将FixedUpdate TPS(滴答每秒)设置为60左右,与我的60 FPS更新相匹配(仍然不明白为什么增加FixedUpdate TPS会使对象移动不平稳!)感谢您的支持,并保持此问题的开放性,以便找到更好的答案。