RigidBody MovePosition落后于另一个RigidBody

时间:2019-11-28 10:29:54

标签: unity3d

我正在做一个VR游戏,并且相机是通过RigidBody来控制的:

private void FixedUpdate() {
   Vector2 primaryAxis = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick);
   ...
   rigidbody.AddForce(velocityChange, ForceMode.VelocityChange);
}

现在我想移动玩家的手,它也有一个RigidBody,所以我这样做:

private void FixedUpdate() {
    GetComponent<Rigidbody>().MovePosition(mainPlayer.transform.TransformPoint(controller));
    GetComponent<Rigidbody>().MoveRotation(mainPlayer.transform.rotation * rot);
}

当我使用指尖杆移动主要角色时,手确实会随之移动,但明显滞后。我知道游戏引擎和物理引擎的运行循环之间的区别,但仍然无法解决。

编辑:

我的猜测是,当我在相机上执行AddForce时,直到调用完所有FixedUpdates之后,变换才会更新,因此手无法访问最新鲜的变换。

唯一可以解决此问题的方法是通过一些智能的关节设置。

enter image description here

2 个答案:

答案 0 :(得分:1)

这是正在发生的事情

当我在func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: nil) annotationView.pinTintColor = UIColor.red return annotationView } 的相机上调用AddForce时,直到所有FixedUpdate被调用并且物理引擎继续进行模拟计算之后,变换才会改变。 / p>

这就是为什么当我用手打FixedUpdate时,总是跟在后面的物理位置上。

我通过预测应该在当前物理框架中的位置来修复它。

MovePosition

现在一切都顺利了!

答案 1 :(得分:0)

您应该将逻辑从固定更新中移开,因为它不是每帧都被调用,有时它每帧出现两次,有时每两帧发生一次。

  

FixedUpdate通常比Update更常被调用。如果帧速率低,则可以每帧多次调用它;如果帧速率高,则可以在帧之间根本不调用它。所有物理计算和更新都在FixedUpdate之后立即进行。在FixedUpdate中应用运动计算时,不需要将值乘以Time.deltaTime。这是因为在可靠的计时器上调用了FixedUpdate,而与帧速率无关。

您可以阅读this article以获得更好的解释,并且您还拥有official documentation