/// <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; }
/// <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; }