我正在做一个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之后,变换才会更新,因此手无法访问最新鲜的变换。
唯一可以解决此问题的方法是通过一些智能的关节设置。
答案 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。