Exemplo n.º 1
0
    /// <summary>
    ///
    /// </summary>
    private void ApplyRotation()
    {
        KGFCharacterController3rdPerson aCharacterController = itsKGFCharacterData.itsCharacterController;
        float anAxis1Horizontal = aCharacterController.GetAxis1Horizontal();


        if (aCharacterController.GetIsTurning())                //accelerate turn speed
        {
            aCharacterController.SetCurrentTurnSpeed(Mathf.Lerp(aCharacterController.GetCurrentTurnSpeed(), aCharacterController.GetMaxTurnSpeed(), Time.deltaTime / aCharacterController.GetTurnAccerlerationTime()));
        }
        else
        {
            aCharacterController.SetCurrentTurnSpeed(aCharacterController.GetMinTurnSpeed());
        }

        float aTurnSpeed = aCharacterController.GetCurrentTurnSpeed();



        Vector3 aControllerDirection = Vector3.zero;

        aControllerDirection.z = aCharacterController.GetAxis1Vertical();

        if (aCharacterController.GetAxis1Horizontal() != 0.0f)
        {
            aCharacterController.SetIsTurning(true);
        }
        else
        {
            aCharacterController.SetIsTurning(false);
        }

        if (aCharacterController.GetAxis1Horizontal() > 0.0f)
        {
            itsTurningLeft = true;
        }
        else
        {
            itsTurningLeft = false;
        }

        if (aControllerDirection.z == 0)
        {
            itsKGFCharacterData.itsReoriented = false;
        }

        float aTurnSpeedMultiplicator = 1.0f - (aCharacterController.GetSpeedNormalized() * 0.5f);
        float aFinalTurnSpeed         = aTurnSpeedMultiplicator * aTurnSpeed;           //speed hack for ludwig

        if (aFinalTurnSpeed < aCharacterController.GetMinTurnSpeed())
        {
            aFinalTurnSpeed = aCharacterController.GetMinTurnSpeed();
        }

        transform.Rotate(0.0f, aFinalTurnSpeed * anAxis1Horizontal * Time.deltaTime, 0.0f);

        itsKGFCharacterData.itsCharacterRotator.transform.localRotation = Quaternion.identity;
    }
Exemplo n.º 2
0
    /// <summary>
    /// Calculates the forces that have to be applierd to the character container, based on ground normal direction and controller input
    /// </summary>
    private void ApplyForces()
    {
        KGFCharacterController3rdPerson aCharacterController = itsKGFCharacterData.itsCharacterController;

        itsKGFCharacterData.itsResultingControllerDirection = Vector3.zero;
        Vector3 aLocalControllerInput = Vector3.zero;
        Vector3 aTargetVelocity       = Vector3.zero;



        float anAxis1Vertical = aCharacterController.GetAxis1Vertical();


        if (Mathf.Abs(anAxis1Vertical) > 0)
        {
            itsAcceleration = Mathf.Lerp(itsAcceleration, 1, Time.deltaTime * aCharacterController.GetAcceleration());
        }
        else
        {
            itsAcceleration = 0;
        }
        aCharacterController.SetSpeedNormalized(itsAcceleration);



        Vector3 aFinalDirection = new Vector3(0.0f, 0.0f, anAxis1Vertical);

        itsKGFCharacterData.itsResultingControllerDirection.z = aFinalDirection.z; //anAxis1Vertical;
        aLocalControllerInput = itsKGFCharacterData.itsTransform.TransformDirection(aFinalDirection);
        itsKGFCharacterData.itsResultingControllerDirection.x = aFinalDirection.x; //aCharacterController.GetAxis1Horizontal ();

        aLocalControllerInput.Normalize();                                         //by normalizing this value will always be 1 so acelleration caused by control damping is disabled

        float aBackWardSpeedMultiplicator = 1.0f;

        if (itsKGFCharacterData.itsResultingControllerDirection.z < 0.0f)
        {
            aBackWardSpeedMultiplicator = aCharacterController.GetBackwardSpeedMultiplicator();
        }

        bool aIsSlopeOK = CheckIfSlopeOK(aLocalControllerInput);

        if (aIsSlopeOK)                                                                                                     //change velocity only if
        {
            aTargetVelocity = aLocalControllerInput * aCharacterController.GetCurrentSpeed() * aBackWardSpeedMultiplicator; //multiply direction with desired speed
        }
        else
        {
            aTargetVelocity = Vector3.zero;
        }



        Vector3 aVelocityChange = aTargetVelocity - itsKGFCharacterData.itsRigidBody.velocity;

        aVelocityChange.y = 0;          //TODO: check this?


        itsKGFCharacterData.itsRigidBody.AddForce(aVelocityChange, ForceMode.VelocityChange);



        if (itsKGFCharacterData.itsRigidBody.velocity.magnitude < aCharacterController.GetCurrentSpeed() * 0.1f)                //if not moving
        {
            itsKGFCharacterData.itsIsMoving = false;
        }
        else
        {
            itsKGFCharacterData.itsIsMoving = true;
        }

        itsKGFCharacterData.itsRigidBodyVelocity = itsKGFCharacterData.itsRigidBody.velocity;
    }