// Update is called once per frame void FixedUpdate() { if (scrFpsController.getInput == null) { return; } FpsControllerInput input = scrFpsController.getInput(); if (input.aim) // always shoulder weapon when aim is pressed { scrFpsWeaponPivot.shouldering = true; headCamera.fieldOfView = Mathf.Lerp(headCamera.fieldOfView, headCameraOrigFov * zoomFovMult, zoomLerp); weaponCamera.fieldOfView = Mathf.Lerp(weaponCamera.fieldOfView, weaponCameraOrigFov * zoomFovMult, zoomLerp); scrFpsController.weaponMoveMult = moveAimMultiplier; } else { scrFpsWeaponPivot.shouldering = false; headCamera.fieldOfView = Mathf.Lerp(headCamera.fieldOfView, headCameraOrigFov, zoomLerp); weaponCamera.fieldOfView = Mathf.Lerp(weaponCamera.fieldOfView, weaponCameraOrigFov, zoomLerp); scrFpsController.weaponMoveMult = moveMultiplier; } if (input.fire) { Fire(); } else { fireReleased = true; } fireTimer.Update(Time.fixedDeltaTime); reloadTimer.Update(Time.fixedDeltaTime); }
void FixedUpdate() { // get input if (scrFpsController.getInput == null) { return; } FpsControllerInput input = scrFpsController.getInput(); // lerp toward shouldered or unshouldered position float intensityMultiplier = 1f; if (shouldering) { currentRotation = Quaternion.Lerp(currentRotation, Quaternion.Euler(0f, 0f, 0f), shoulderLerp); currentPosition = Vector3.Lerp(currentPosition, shoulderingPosition, shoulderLerp); if (scrFpsController.grounded) // only have steady weapon if shouldering and grounded { intensityMultiplier = shoulderMovementIntensityMult; } } else { currentRotation = Quaternion.Lerp(currentRotation, originalRotation, unshoulderLerp); currentPosition = Vector3.Lerp(currentPosition, originalPosition, unshoulderLerp); } // movement bob or vertical move inertia float movementBob = 0f; if (scrFpsController.grounded) { // vertical movement Bob movementBob = movementBobIntensity * intensityMultiplier * scrFpsController.GetMoveSpeedPercent() * Mathf.Sin(movementBobTime); movementBobTime += Time.fixedDeltaTime * Mathf.Lerp(movementBobMinFrequency, movementBobMaxFrequency, scrFpsController.GetMoveSpeedPercent()); } else { movementBobTime = 0f; // jump inertia moveInertiaSpring.AddForce(Vector3.down * -scrFpsController.body.velocity.y * moveInertiaMagnitude.y * intensityMultiplier * Time.fixedDeltaTime); } // look inertia lookInertiaSpring.AddSoftForce(new Vector3( input.lookY * -lookInertiaMagnitude.y * intensityMultiplier, // Look Vertical input.lookX * -lookInertiaMagnitude.x * intensityMultiplier, // Look Horizontal input.moveX * -moveBankMagnitude * intensityMultiplier), // Movement Bank lookInertiaDistributeFrames); Vector3 rotatedVelocity = transform.InverseTransformDirection(scrFpsController.body.velocity); // move inertia moveInertiaSpring.AddForce( new Vector3( -rotatedVelocity.x * moveInertiaMagnitude.x * Math.BoolToFloat(!(shouldering && scrFpsController.grounded)), movementBob, -rotatedVelocity.z * moveInertiaMagnitude.z * intensityMultiplier) * Time.fixedDeltaTime); // apply spring transformations transform.localRotation = currentRotation * Quaternion.Euler(lookInertiaSpring.UpdateState()) * Quaternion.Euler(recoilUpwardSpring.UpdateState()); transform.localPosition = currentPosition + moveInertiaSpring.UpdateState() + recoilBackwardSpring.UpdateState(); }