Exemplo n.º 1
0
    private void Update()
    {
        #region Look Settings - Update

        if (enableCameraMovement)
        {
            float mouseXInput;
            float mouseYInput;
            float camFOV = playerCamera.GetComponent <Camera>().fieldOfView;
            mouseYInput = characterInput.getMouseX();
            mouseXInput = characterInput.getMouseY();
            if (targetAngles.y > 180)
            {
                targetAngles.y -= 360; followAngles.y -= 360;
            }
            else if (targetAngles.y < -180)
            {
                targetAngles.y += 360; followAngles.y += 360;
            }
            if (targetAngles.x > 180)
            {
                targetAngles.x -= 360; followAngles.x -= 360;
            }
            else if (targetAngles.x < -180)
            {
                targetAngles.x += 360; followAngles.x += 360;
            }
            targetAngles.y            += mouseYInput * (mouseSensitivity - ((baseCamFOV - camFOV) * fOVToMouseSensitivity) / 6f);
            targetAngles.x            += mouseXInput * (mouseSensitivity - ((baseCamFOV - camFOV) * fOVToMouseSensitivity) / 6f);
            targetAngles.y             = Mathf.Clamp(targetAngles.y, -0.5f * Mathf.Infinity, 0.5f * Mathf.Infinity);
            targetAngles.x             = Mathf.Clamp(targetAngles.x, -0.5f * rotationRange, 0.5f * rotationRange);
            followAngles               = Vector3.SmoothDamp(followAngles, targetAngles, ref followVelocity, (cameraSmoothing) / 500);
            playerCamera.localRotation = Quaternion.Euler(-followAngles.x + originalRotation.x, 0, 0);
            transform.localRotation    = Quaternion.Euler(0, followAngles.y + originalRotation.y, 0);
        }

        #endregion

        #region Movement Settings - Update

        #endregion

        #region Headbobbing Settings - Update

        #endregion

        #region BETA_SETTINGS - Update

        #endregion

        bool wasWalking = !isSprinting;
        if (useStamina)
        {
            if (staminaInternal > 0)
            {
                if (!isCrouching)
                {
                    isSprinting = characterInput.getSprintDown();
                }
            }
            else
            {
                isSprinting = false;
            }

            if (isSprinting == true && staminaInternal > 0)
            {
                staminaInternal -= staminaDepletionSpeed;
            }
            else if (staminaInternal < (Stamina * 10) && !characterInput.getSprintDown())
            {
                staminaInternal += staminaDepletionSpeed / 2;
            }
        }
        else
        {
            isSprinting = characterInput.getSprintDown();
        }

        advanced.tooSteep = false;
        float inrSprintSpeed;
        inrSprintSpeed = sprintSpeedInternal;
        Vector3 dMove = Vector3.zero;
        speed = walkByDefault ? isCrouching ? walkSpeedInternal : (isSprinting ? inrSprintSpeed : walkSpeedInternal) : (isSprinting ? walkSpeedInternal : inrSprintSpeed);
        Ray ray = new Ray(transform.position, -transform.up);
        if (IsGrounded || fps_Rigidbody.velocity.y < 0.1)
        {
            RaycastHit[] hits    = Physics.RaycastAll(ray, capsule.height * jumpRayLength);
            float        nearest = float.PositiveInfinity;
            IsGrounded = false;
            for (int i = 0; i < hits.Length; i++)
            {
                if (!hits[i].collider.isTrigger && hits[i].distance < nearest)
                {
                    IsGrounded = true;
                    nearest    = hits[i].distance;
                }
            }
        }



        if (advanced.useSlopeDetection)
        {
            if (Physics.Raycast(new Vector3(transform.position.x, transform.position.y - 0.75f, transform.position.z + 0.1f), Vector3.down, out advanced.surfaceAngleCheck, 1f))
            {
                if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) < 89)
                {
                    advanced.tooSteep = false;
                    dMove             = transform.forward * inputXY.y * speed + transform.right * inputXY.x * walkSpeedInternal;
                    if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) > advanced.maxSlopeAngle)
                    {
                        advanced.tooSteep = true;
                        isSprinting       = false;
                        dMove             = new Vector3(0, -4, 0);
                    }
                    else if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) > 44)
                    {
                        advanced.tooSteep = true;
                        isSprinting       = false;
                        dMove             = (transform.forward * inputXY.y * speed + transform.right * inputXY.x) + new Vector3(0, -4, 0);
                    }
                }
            }

            else if (Physics.Raycast(new Vector3(transform.position.x - 0.086f, transform.position.y - 0.75f, transform.position.z - 0.05f), Vector3.down, out advanced.surfaceAngleCheck, 1f))
            {
                if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) < 89)
                {
                    advanced.tooSteep = false;
                    dMove             = transform.forward * inputXY.y * speed + transform.right * inputXY.x * walkSpeedInternal;
                    if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) > 70)
                    {
                        advanced.tooSteep = true;
                        isSprinting       = false;
                        dMove             = new Vector3(0, -4, 0);
                    }
                    else if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) > 45)
                    {
                        advanced.tooSteep = true;
                        isSprinting       = false;
                        dMove             = (transform.forward * inputXY.y * speed + transform.right * inputXY.x) + new Vector3(0, -4, 0);
                    }
                }
                else if (Physics.Raycast(new Vector3(transform.position.x + 0.086f, transform.position.y - 0.75f, transform.position.z - 0.05f), Vector3.down, out advanced.surfaceAngleCheck, 1f))
                {
                    if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) < 89)
                    {
                        advanced.tooSteep = false;
                        dMove             = transform.forward * inputXY.y * speed + transform.right * inputXY.x * walkSpeedInternal;
                        if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) > 70)
                        {
                            advanced.tooSteep = true;
                            isSprinting       = false;
                            dMove             = new Vector3(0, -4, 0);
                        }
                        else if (Vector3.Angle(advanced.surfaceAngleCheck.normal, Vector3.up) > 45)
                        {
                            advanced.tooSteep = true;
                            isSprinting       = false;
                            dMove             = (transform.forward * inputXY.y * speed + transform.right * inputXY.x) + new Vector3(0, -4, 0);
                        }
                    }
                }
            }
            else
            {
                advanced.tooSteep = false;
                dMove             = transform.forward * inputXY.y * speed + transform.right * inputXY.x * walkSpeedInternal;
            }
        }
        else
        {
            advanced.tooSteep = false;
            dMove             = transform.forward * inputXY.y * speed + transform.right * inputXY.x * walkSpeedInternal;
        }


        float horizontalInput = characterInput.getHorizontalInput();
        float verticalInput   = characterInput.getVerticalInput();
        inputXY = new Vector2(horizontalInput, verticalInput);
        if (inputXY.magnitude > 1)
        {
            inputXY.Normalize();
        }

        float yv      = fps_Rigidbody.velocity.y;
        bool  didJump = canHoldJump?characterInput.getJump(): characterInput.getJumpDown();

        if (!canJump)
        {
            didJump = false;
        }

        if (IsGrounded && didJump && jumpPowerInternal > 0)
        {
            yv        += jumpPowerInternal;
            IsGrounded = false;
            didJump    = false;
        }

        if (playerCanMove)
        {
            fps_Rigidbody.velocity = dMove + Vector3.up * yv;
        }
        else
        {
            fps_Rigidbody.velocity = Vector3.zero;
        }

        if (dMove.magnitude > 0 || !IsGrounded || advanced.tooSteep)
        {
            GetComponent <Collider>().material = advanced.zeroFrictionMaterial;
        }
        else
        {
            GetComponent <Collider>().material = advanced.highFrictionMaterial;
        }

        fps_Rigidbody.AddForce(Physics.gravity * (advanced.gravityMultiplier - 1));
        if (fOVKick.useFOVKick && wasWalking == isSprinting && fps_Rigidbody.velocity.magnitude > 0.1f && !isCrouching)
        {
            StopAllCoroutines();
            StartCoroutine(wasWalking ? FOVKickOut() : FOVKickIn());
        }

        if (_crouchModifiers.useCrouch)
        {
            isCrouching = _crouchModifiers.crouchOverride || characterInput.getCrouchAxis() > 0;

            if (isCrouching)
            {
                capsule.height      = Mathf.MoveTowards(capsule.height, _crouchModifiers.colliderHeight / 2, 5 * Time.deltaTime);
                walkSpeedInternal   = walkSpeed * _crouchModifiers.crouchWalkSpeedMultiplier;
                sprintSpeedInternal = sprintSpeed * _crouchModifiers.crouchSprintSpeedMultiplier;
                jumpPowerInternal   = jumpPower * _crouchModifiers.crouchJumpPowerMultiplier;
            }
            else
            {
                capsule.height      = Mathf.MoveTowards(capsule.height, _crouchModifiers.colliderHeight, 5 * Time.deltaTime);
                walkSpeedInternal   = walkSpeed;
                sprintSpeedInternal = sprintSpeed;
                jumpPowerInternal   = jumpPower;
            }
        }
    }