Try multiplying the direction with Time.deltaTime, which expresses the elapsed time since last frame in seconds. It can be confusing to get it if you are starting out but it can be helpful to think of its properties like this: If you multiply 1 (for example) by Time.deltaTime, you can think of it being a change of 1 per second.
transform.position = transform.position + Vector3.left;
…can be written shorter as…
transform.position += Vector3.left;
…can be written cleaner as…
transform.Translate(Vector3.left);
Translate basically means “move”, “offset” or “pan” in this context. And to make your code respect timing in Unity, you should multiply the translated value by Time.deltaTime:
transform.Translate(Vector3.left * Time.deltaTime);
Vector3.left and Vector3.right are (-1, 0, 0) and (1, 0, 0) respectively, so the multiplication becomes (-1, 0, 0) * Time.deltaTime
in the previous code snippet. That is to say that you will now translate left by 1 meter per second. If you had not multiplied by Time.deltaTime, we’d been translating by one meter per frame. That can be both fast or slow, depending on your machine. For example a slow computer might be chugging along at 20 frames per second and a fast computer might be racing at 120 frames per second. The net effect if you had not used Time.deltaTime, on one computer you’d be moving 20 meters per second and on another computer you’d be moving 120 meters per second.
To include your configurable speed into this, we can multiply that into the translate too:
transform.Translate(Vector3.left * speed * Time.deltaTime);
So the final script could look like this:
public class Example : MonoBehaviour
{
public float speed = 50f;
public float upSpeed = 0.0015f;
void Update()
{
if (Input.GetKey("left"))
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
}
if (Input.GetKey("right"))
{
transform.Translate(Vector3.right * speed * Time.deltaTime);
}
}
void FixedUpdate()
{
GetComponent<Rigidbody2D>().AddForce(Vector3.up * upSpeed);
}
}
But we can reduce the code a little more if you want by using an input axis:
public class Example : MonoBehaviour
{
public float speed = 50f;
public float upSpeed = 0.0015f;
void Update()
{
var direction = new Vector3(Input.GetAxisRaw("Horizontal"), 0, 0);
transform.Translate(direction * speed * Time.deltaTime);
}
void FixedUpdate()
{
GetComponent<Rigidbody2D>().AddForce(Vector3.up * upSpeed);
}
}