Пример #1
0
        // 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);
        }
Пример #2
0
        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();
        }