Check out example codes for "unity 2d controler". It will help you in understanding the concepts better.

Code Example 1

public float speed;
	public float jumpForce;
	public float moveInput;
	public Transform groundCheck;
	public float checkRadius;
	public LayerMask whatIsGround;
	public int extraJump;
	public int ejV;

	private bool isGrounded;
	private bool facingRight = true;
	private Rigidbody2D rb;

	void Start()
	{
		extraJump = ejV;
		rb = GetComponent<Rigidbody2D>();
	}

	void Update()
    {
		if (isGrounded == true)
        {
			extraJump = ejV;
        }

        if (Input.GetKey(KeyCode.Space) && extraJump > 0)
        {
			rb.velocity = Vector2.up * jumpForce;
			extraJump--;
        }else if (Input.GetKey(KeyCode.Space) && extraJump == 0 && isGrounded == true)
        {
			rb.velocity = Vector2.up * jumpForce;
		}
    }

	void FixedUpdate()
	{
		isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);
		moveInput = Input.GetAxis("Horizontal");
		rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
		if (facingRight == false && moveInput > 0)
        {
			Flip();
        }else if (facingRight == true && moveInput < 0)
        {
			Flip();
        }
	}

	void Flip()
    {
		facingRight = !facingRight;
		Vector3 Scaler = transform.localScale;
		Scaler.x *= -1;
		transform.localScale = Scaler;
    }

Code Example 2

public float speed;
	public float jumpForce;
	public float moveInput;
	public Transform groundCheck;
	public float checkRadius;
	public LayerMask whatIsGround;
	public int extraJump;
	public int ejV;

	private bool isGrounded;
	private bool facingRight = true;
	private Rigidbody2D rb;

	void Start()
	{
		extraJump = ejV;
		rb = GetComponent<Rigidbody2D>();
	}

	void Update()
    {
		if (isGrounded == true)
        {
			extraJump = ejV;
        }

        if (Input.GetKey(KeyCode.Space) && extraJump > 0)
        {
			rb.velocity = Vector2.up * jumpForce;
			extraJump--;
        }else if (Input.GetKey(KeyCode.Space) && extraJump == 0 && isGrounded == true)
        {
			rb.velocity = Vector2.up * jumpForce;
		}
    }

	void FixedUpdate()
	{
		isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);
		moveInput = Input.GetAxis("Horizontal");
		rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
		if (facingRight == false && moveInput > 0)
        {
			Flip();
        }else if (facingRight == true && moveInput < 0)
        {
			Flip();
        }
	}

	void Flip()
    {
		facingRight = !facingRight;
		Vector3 Scaler = transform.localScale;
		Scaler.x *= -1;
		transform.localScale = Scaler;
    }

Code Example 3

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

public class PhysicsObject : MonoBehaviour {

    public float minGroundNormalY = .65f;
    public float gravityModifier = 1f;

    protected Vector2 targetVelocity;
    protected bool grounded;
    protected Vector2 groundNormal;
    protected Rigidbody2D rb2d;
    protected Vector2 velocity;
    protected ContactFilter2D contactFilter;
    protected RaycastHit2D[] hitBuffer = new RaycastHit2D[16];
    protected List<RaycastHit2D> hitBufferList = new List<RaycastHit2D> (16);


    protected const float minMoveDistance = 0.001f;
    protected const float shellRadius = 0.01f;

    void OnEnable()
    {
        rb2d = GetComponent<Rigidbody2D> ();
    }

    void Start () 
    {
        contactFilter.useTriggers = false;
        contactFilter.SetLayerMask (Physics2D.GetLayerCollisionMask (gameObject.layer));
        contactFilter.useLayerMask = true;
    }

    void Update () 
    {
        targetVelocity = Vector2.zero;
        ComputeVelocity ();    
    }

    protected virtual void ComputeVelocity()
    {

    }

    void FixedUpdate()
    {
        velocity += gravityModifier * Physics2D.gravity * Time.deltaTime;
        velocity.x = targetVelocity.x;

        grounded = false;

        Vector2 deltaPosition = velocity * Time.deltaTime;

        Vector2 moveAlongGround = new Vector2 (groundNormal.y, -groundNormal.x);

        Vector2 move = moveAlongGround * deltaPosition.x;

        Movement (move, false);

        move = Vector2.up * deltaPosition.y;

        Movement (move, true);
    }

    void Movement(Vector2 move, bool yMovement)
    {
        float distance = move.magnitude;

        if (distance > minMoveDistance) 
        {
            int count = rb2d.Cast (move, contactFilter, hitBuffer, distance + shellRadius);
            hitBufferList.Clear ();
            for (int i = 0; i < count; i++) {
                hitBufferList.Add (hitBuffer [i]);
            }

            for (int i = 0; i < hitBufferList.Count; i++) 
            {
                Vector2 currentNormal = hitBufferList [i].normal;
                if (currentNormal.y > minGroundNormalY) 
                {
                    grounded = true;
                    if (yMovement) 
                    {
                        groundNormal = currentNormal;
                        currentNormal.x = 0;
                    }
                }

                float projection = Vector2.Dot (velocity, currentNormal);
                if (projection < 0) 
                {
                    velocity = velocity - projection * currentNormal;
                }

                float modifiedDistance = hitBufferList [i].distance - shellRadius;
                distance = modifiedDistance < distance ? modifiedDistance : distance;
            }


        }

        rb2d.position = rb2d.position + move.normalized * distance;
    }

}

Learn ReactJs, React Native from akashmittal.com