# Gently increase speed

I have made a simple script wich rotates an object on a key press.
But I want to gently increase the speed to an X amount and when a user lets go of the key it gently decreases to 0.

I’m not sure on how to that, so any help is much appreciated

The script :

``````using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Swing : MonoBehaviour
{

void Start()
{

}

void Update()
{
if (Input.GetKey("w")) transform.RotateAround(transform.position, transform.forward, Time.deltaTime * 10f);
if (Input.GetKey("s")) transform.RotateAround(transform.position, transform.forward, Time.deltaTime * -10f);

}

}
``````

The W key rotates the object a certain way and the S key rotates the object a certain way.

This Should work out:

``````    public float rot_speed = 100;
public float rot_speedUp = 3;
Quaternion targetRotation;
void Start()
{
targetRotation = transform.rotation;
}

void Update()
{
float delta = Time.deltaTime;

if (Input.GetKey("w"))
targetRotation.eulerAngles += new Vector3(0, 0, rot_speed * delta); // Choose your axis, I chose z
else if (Input.GetKey("s")) // Prevents bugging in any way when both keys would be pressed
targetRotation.eulerAngles -= new Vector3(0, 0, rot_speed * delta); // Choose your axis, I chose z

transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, delta * rot_speedUp); // Applying the rotation
}
``````

Greetings,

Max

you can use a secondary number that keeps track of the time that the keys where pressed down and then multiply your speed by the new number

``````	public float downtime;

void Update()
{
bool down = false;
if (Input.GetKey("w")){ down = true;transform.RotateAround(transform.position, transform.forward, downtime*Time.deltaTime * 10f);}
if (Input.GetKey("s")){ down = true; transform.RotateAround(transform.position, transform.forward, downtime*Time.deltaTime * -10f);}
if (down) {if(downtime<1){downtime+=Time.deltaTime;}}else{downtime = 0;}

}
``````

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

`````` public class Swing : MonoBehaviour
{
[SerializeField] private float minRotationSpeed = -10;
[SerializeField] private float maxRotationSpeed = 10;
[SerializeField, Min(0.001f)] private float rotationAcceleration = 1;
[SerializeField, Min(0)] private float rotationDeceleration = 1;
private float rotationSpeed;

void Update()
{
if (Input.GetKey("w"))
rotationSpeed = Mathf.MoveTowards(rotationSpeed, maxRotationSpeed, rotationAcceleration * Time.deltaTime);

if (Input.GetKey("s"))
rotationSpeed = Mathf.MoveTowards(rotationSpeed, minRotationSpeed, rotationAcceleration * Time.deltaTime);

if (!Input.GetKey("w") && !Input.GetKey("s"))
rotationSpeed = Mathf.MoveTowards(rotationSpeed, 0, rotationDeceleration * Time.deltaTime);

transform.RotateAround(transform.position, transform.forward, Time.deltaTime * rotationSpeed);
}
}
``````