protected virtual void Update() { if (isClimbing) { Vector3 controllerLocalOffset = GetScaledLocalPosition(grabbingController.transform) - startControllerScaledLocalPosition; Vector3 grabPointWorldPosition = climbingObject.transform.TransformPoint(startGrabPointLocalPosition); playArea.position = grabPointWorldPosition + startPlayAreaWorldOffset - controllerLocalOffset; if (useGrabbedObjectRotation) { Vector3 lastRotationVec = climbingObjectLastRotation * Vector3.forward; Vector3 currentObectRotationVec = climbingObject.transform.rotation * Vector3.forward; Vector3 axis = Vector3.Cross(lastRotationVec, currentObectRotationVec); float angle = Vector3.Angle(lastRotationVec, currentObectRotationVec); playArea.RotateAround(grabPointWorldPosition, axis, angle); climbingObjectLastRotation = climbingObject.transform.rotation; } if (!IsHeadsetColliding()) { positionRewind.SetLastGoodPosition(); } } }