I am a begginer trying to make a simple 2d platformer. Need help with rotation and jump height.

So, I am a beginner. Just started attempting to make a platformer today instead of following planned projects for once. . I was trying my best to work through it without to much copy and pasting of code and using it to build my knowledge as a beginner. I have gotten confused on rotating the sprite when walking left and right though. Could you tell me how to make my code work for this ?
Atm with how it is now it will rotate in that direction at a fixed speed when i run and it just keeps turning around in circles. Going nowhere fast. lol I estimate this question is probably pretty simple to solve. As I’m obviously just not using the correct method.

My second question however i think is a bit tougher. Basically with the code set up in the current way i can get my sprite to jump pretty consistently without double jumps. Which is better then what i have had in the past. But what i need to do is completely normalize the jumping “thrust”. With things how they are now every once in awhile i will get a high jump anywhere between 2 to 5 times my normal jump height. This cant happen if im trying to jump between platforms and have crates to stack in order to navigate longer jumps like i have set up now in my sample scene that i just started working on. Is there a way to set a failsafe to make sure the jumps stay consistant in height and distance with a rigidbody 2d like i have now ? Or better yet is there a way to do that as a beginner without being completely confused as to how it works. Thanks for your time and hope to hear back on this. I am sure my first question is kind of stupid but cant seem to figure it out.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class playerController : MonoBehaviour
{
    [SerializeField]
    private Animator playeranim;
    private Rigidbody2D rb2d;
   // private BoxCollider2D box2d;
    [SerializeField]
    private int thrust = 100;
    [SerializeField]
    private int jumpHeight = 50;
    [SerializeField]
    private int canJump;
    private Vector2 direction;


    // Use this for initialization
	    void Start ()
    {
        rb2d = gameObject.GetComponent<Rigidbody2D>();
       // box2d = gameObject.GetComponent<BoxCollider2D>();
    }

    // Update is called once per frame
    void Update ()
    
    {
        RotateDirection();
        playeranim = gameObject.GetComponent<Animator>();
        rigidbodymovement();

   
    }

    private void rigidbodymovement()
    {
    

        if (Input.GetKey(KeyCode.D))

        {

            playeranim.SetInteger("running", 2);

            rb2d.AddForce(transform.right * thrust * Time.deltaTime);

        }

        else if (Input.GetKey(KeyCode.A))
        {
       

            playeranim.SetInteger("running", 2);

            rb2d.AddForce(-transform.right * thrust * Time.deltaTime);

        }

        else
            playeranim.SetInteger("running", 0);
        playeranim.SetInteger("jump", 0);

        if (Input.GetKeyDown(KeyCode.Space))  // todo fix double jump and a glitch where the player 
turns his body when jumping and controls glitch
        {
            if( canJump > 1)
            {
                canJump = canJump - 1;
            
                rb2d.AddForce(new Vector2(0, 1) * jumpHeight * Time.deltaTime);
            }
        
        }

    
    {
    
    }

    // }

    //else
    //{
    //  playeranim.SetBool("is_Running", false);
    //  playeranim.SetBool("is_Idle", true);
    // }
}
    private void OnCollisionEnter2D(Collision2D collision)
    {
        switch ( collision.gameObject.tag)
        {
            case "water":
                {
                    Invoke("death", 1f);
                    break;
                }
            case "floor":
                {
                    Debug.Log("i am touching the floor");
                    canJump = 2;
                    break;
                }

            default:
                {
                    canJump = 1;
                    break;
                }
        }
    }

    private void RotateDirection()

     {
     transform.Rotate(direction);

     direction = Vector2.zero;

    if (Input.GetKey(KeyCode.A))
     {
            direction += new Vector2(0, 1);
     }
 
    if (Input.GetKey(KeyCode.D))
      {
            direction += new Vector2(0,1 );
     }

    }

     private void death()
    {
    

        SceneManager.LoadScene(0);
    }
}

Greetings, For your jump issue, useMathf.Clamp to clamp the Y velocity. Example: rb2d.velocity = new Vector2(rb2d.velocity.x, Mathf.Clamp(rb2d.velocity.y, -10f, 10f)); Where the 0f is the min velocity and the 10f is the max velocity. Play around with the 10f to get something that feels right. Then move it to a variable private serialized field. Place the snippet at the beginning of FixedUpdate()


Also, use FixedUpdate() to apply forces to your rigidbody. I would move the call to rigidbodymovement() from Update() to FixedUpdate.


In Update() you have playeranim = gameObject.GetComponent<Animator>(); that should be in Awake() or Start() as it is right now, you are cache the animator component every frame.


As far as the the rotate thing, Are you rotating a ball or something or turning the player to a new direction?


You are off to a great start and welcome to the mind numbing adventures of programing! Don’t ever give up.