/// <summary> /// Fixed update /// </summary> void FixedUpdate() { if (optimized) { _transform.Rotate(_speed, 0f, 0f, Space.Self); } else { TrainPhysics.ApplyBrakes(_rigidbody, _brake, 0f); } }
/// <summary> /// Control speed base on max speed, acceleration and brakes /// </summary> /// <param name="rigidbody"></param> /// <param name="isGrounded"></param> /// <param name="maxSpeedKph"></param> /// <param name="speed_KPH"></param> /// <param name="acceleration"></param> /// <param name="brake"></param> /// <param name="targetVelocityIn"></param> /// <param name="targetVelocityOut"></param> /// <param name="currentSpeedIn"></param> /// <param name="currentSpeedOut"></param> /// <param name="targetSpeedIn"></param> /// <param name="targetSpeedOut"></param> public static void SpeedControl(Rigidbody rigidbody, bool isGrounded, float maxSpeedKph, float speed_KPH, float acceleration, float brake, Vector3 targetVelocityIn, out Vector3 targetVelocityOut, float currentSpeedIn, out float currentSpeedOut, float targetSpeedIn, out float targetSpeedOut) { currentSpeedOut = currentSpeedIn; targetSpeedOut = targetSpeedIn; targetVelocityOut = targetVelocityIn; if (isGrounded) { targetSpeedOut = TrainPhysics.GetTargetSpeed(acceleration, maxSpeedKph); targetSpeedOut = TrainPhysics.ApplyBrakes(rigidbody, brake, targetSpeedOut); currentSpeedOut = TrainPhysics.SoftAcceleration(currentSpeedOut, targetSpeedOut); //Apply velocity if (speed_KPH < maxSpeedKph) { targetVelocityOut = currentSpeedOut == 0f ? Vector3.zero : rigidbody.velocity + (rigidbody.transform.forward * currentSpeedOut); rigidbody.velocity = Vector3.MoveTowards(rigidbody.velocity, targetVelocityOut, Time.deltaTime * GeneralSettings.AccelerationRate); } } }