Пример #1
0
    void Update()
    {
        currentTerrain = GetTerrain();

        BoostCheck();

        if (ListOfStates.Contains(driveState.boosting))
        {
            boostTimer.Tick();
            if (boostTimer.Ended())
            {
                DeactivateState(driveState.boosting);
            }

            currentSpeed += ((acceleration * Time.deltaTime) * 6.0f);
        }

        finalTopSpeed = topSpeed * GetTopSpeedModifier();

        if (!ListOfStates.Contains(driveState.in_air))
        {
            //Forward and backwards
            if (Input.GetAxis("Vertical") > 0)
            {
                reverseTransmission.Reset();
                if (currentSpeed > finalTopSpeed)
                {
                    currentSpeed -= (deaccelRate * Time.deltaTime);
                }
                else
                {
                    currentSpeed += ((acceleration * Input.GetAxis("Vertical")) * Time.deltaTime);
                }
            }
            else if (Input.GetAxis("Vertical") == 0)
            {
                reverseTransmission.Reset();
                if (currentSpeed > (deaccelRate * Time.deltaTime))
                {
                    currentSpeed -= (deaccelRate * Time.deltaTime);
                }
                else if (currentSpeed < (-deaccelRate * Time.deltaTime))
                {
                    currentSpeed += (deaccelRate * Time.deltaTime);
                }
                else
                {
                    currentSpeed = 0;
                }
            }
            else if (Input.GetAxis("Vertical") < 0)
            {
                DeactivateState(driveState.boosting);
                if (currentSpeed > (brakes * Time.deltaTime))
                {
                    currentSpeed -= (brakes * Time.deltaTime);
                }
                else if (currentSpeed < (-topSpeed / 4))
                {
                    currentSpeed = (-finalTopSpeed / 4);
                }
                else if ((currentSpeed <= 0) && (reverseTransmission.Ended()))
                {
                    currentSpeed -= (acceleration * Time.deltaTime);
                }
                else
                {
                    reverseTransmission.Tick();
                    currentSpeed = 0;
                }
            }
        }

        //Turning
        if (Input.GetAxis("Horizontal") != 0)
        {
            modSteering = GetSteeringAfterModifier();

            if (currentSpeed > 0)
            {
                targetAngle += ((modSteering * Input.GetAxis("Horizontal")) * Time.deltaTime);
                turnChange  += ((modSteering * Input.GetAxis("Horizontal")) * Time.deltaTime);
            }
            else if (currentSpeed < 0)
            {
                targetAngle -= ((modSteering * Input.GetAxis("Horizontal")) * Time.deltaTime);
                turnChange  -= ((modSteering * Input.GetAxis("Horizontal")) * Time.deltaTime);
            }
        }

        //===================================================================================================
        if (turnChange > 90.0f)
        {
            turnChange  = 90.0f;
            targetAngle = currentVelocityAngle + 90.0f;
        }
        if (turnChange < -90.0f)
        {
            turnChange  = -90.0f;
            targetAngle = currentVelocityAngle - 90.0f;
        }
        //===================================================================================================

        //===================================================================================================
        //Keep the numbers from overinflating by knocking them down/up by 360 whenever the amount goes over.
        if (targetAngle > 360.0f)
        {
            targetAngle           = 0;
            currentVelocityAngle -= 360.0f;
        }
        if (targetAngle < -360.0f)
        {
            targetAngle           = 0;
            currentVelocityAngle += 360.0f;
        }
        //====================================================================================================

        //==========================================================
        //Simulation of the reduced ability to turn at higher speeds
        float gForceFactor = ((currentSpeed / 2) / finalTopSpeed);

        if (gForceFactor > 1)
        {
            gForceFactor = 1;
        }

        currentTurnSpeed = (GetGripModifier() *
                            (1.0f - gForceFactor));
        //==========================================================

        if (currentVelocityAngle != targetAngle)
        {
            float speedModifier = 0;
            if (turnChange > 0)
            {
                speedModifier = turnChange;
            }
            else if (turnChange < 0)
            {
                speedModifier = -turnChange;
            }

            if (speedModifier > 90.0f)
            {
                speedModifier = 90;
            }
            if (speedModifier < 0)
            {
                speedModifier = 0;
            }

            currentSpeed *= (1 - ((speedModifier / 90) / 40));

            if (turnChange > 0)
            {
                if (turnChange < (currentTurnSpeed * Time.deltaTime))
                {
                    currentVelocityAngle = targetAngle;
                    turnChange           = 0;
                }
                else
                {
                    currentVelocityAngle += (currentTurnSpeed * Time.deltaTime);
                    turnChange           -= (currentTurnSpeed * Time.deltaTime);
                }
            }
            else if (turnChange < 0)
            {
                if (turnChange > -(currentTurnSpeed * Time.deltaTime))
                {
                    currentVelocityAngle = targetAngle;
                    turnChange           = 0;
                }
                else
                {
                    currentVelocityAngle -= (currentTurnSpeed * Time.deltaTime);
                    turnChange           += (currentTurnSpeed * Time.deltaTime);
                }
            }
        }

        GetSlopeRotations();

        velocityDirection = Quaternion.Euler(targetBank, currentVelocityAngle, targetRoll) * Vector3.forward;

        SoundHandler_Update();

        //Debug.Log((int)currentSpeed + " / " + (int)targetAngle + " / " + (int)turnChange + " / " + currentTerrain.ToString() + " / " + targetBank + ":" + targetRoll);
    }