Create an empty gameObject, rename to Floor
Add BoxCollider2D as shown in image below
Select and icon for the gameObject - select in top section of inspector - example green oval
Set Layer: Ground, after following directions to create custom layers below.
Unity Configuration Steps: Jumping Player
In order to use the following script to enable your player to jump, the following changes must be configured in Unity before the following script will work
Custom Layer: Ground
Create a new Layer:Ground in the Unity Layer Editor. All gameObjects which will act as ground, (example: Floor) to allow jumping, must have this layer set in the inspector. See image below
Set the Layer: Ground for all gameObjects that the player should be able to jump from. Example: Floor
GroundCheck: Create an empty gameObject, make it a child of the Player, name: GroundCheck. Add an icon (orange capsule in the image ), so it's easy to see. Move the GroundCheck gameObject to the bottom of the player's feet, this gameObject will check to see if it's in contact with a gameObject that is in the 'Ground' layer.
PlayerController - with jump Code
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassPlayerController : MonoBehaviour{publicenumHeroState { idle, walk, jump } //create custom data-type - have integer valuespublicHeroState currentHeroState; //will display the current enum privateAnimator animator; //- null - reference variable to access animator componentpublic bool facingRight; //keep track of sprite direction - used in FlipprivateRigidbody2D myRBody2D;publicfloat forceX; //used for adjusting velocitypublicTransform groundCheck; //transform component on GroundCheck objectpublicLayerMask groundLayer; //allows us to interact with a physics Layer publicfloat groundCheckRadius ; //publicfloat jumpForce;public bool grounded =false; //will let us see if the gameOjb is grounded// Start is called before the first frame updatevoidStart() { currentHeroState =HeroState.idle; //initialize to show it's in idle to start animator =GetComponent<Animator>();//is on the same game object as this scriptanimator.SetInteger("HeroState", (int)HeroState.idle); //send in the signal: 0 facingRight =true; myRBody2D =GetComponent<Rigidbody2D>(); forceX =100.0f; //force value may need adjusted groundCheckRadius =0.2f; //may need modified jumpForce =10f; //may need modified }// Update is called once per framevoidFixedUpdate() //physics methods executed - want consistant time between frames {float inputX =Input.GetAxis("Horizontal"); //values of -1, 0 , 1 bool isWalking =Mathf.Abs(inputX) >0;if (isWalking) {//check for flippingif( inputX >0&&!facingRight) //moving right, facing left {Flip(); //flip right }elseif( inputX <0&& facingRight) //moving left, facing right {Flip(); //flip left }animator.SetInteger("HeroState", (int)HeroState.walk);myRBody2D.velocity=newVector2( 0,myRBody2D.velocity.y); //reset the velocity to 0 //may come back and changemyRBody2D.AddForce(newVector2(inputX * forceX,0)); //add horizontal force to move the player }else {animator.SetInteger("HeroState", (int)HeroState.idle); } bool jumpPressed =Input.GetButtonDown("Jump"); //is spacebar pressed grounded =Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);if (jumpPressed && grounded) {animator.SetInteger("HeroState", (int)HeroState.jump);Debug.Log("Jumping");///Vertical Force for MovementmyRBody2D.velocity=newVector2(myRBody2D.velocity.x,0); //reset the velocity to 0 //keep horizontal movementmyRBody2D.AddForce(newVector2(0,jumpForce),ForceMode2D.Impulse); //add horizontal force to move the player } }//end FixedUpdate//we have determined it is facing the wrong direction, it must need flipped for this to be executedprivatevoidFlip() { facingRight =!facingRight; //toggle direction variable//get Scale VectorVector3 theScale =transform.localScale; //get the current values for Scale VectortheScale.x*=-1; //modify the X component //mirror the spritetransform.localScale= theScale; //set the actual Scale vector with our temp Vector }/// <summary>/// This is the start of the Event-Chain for Game Score, health to be changed/// </summary>/// <param name="collision">Collision.</param>privatevoidOnTriggerEnter2D(Collider2D collision) {Debug.Log("Collided with something");//check tag on gameObject that has this collider on itif (collision.CompareTag("Collectible")) {//get the PickUp component from the gameObject with this collider on itPickUp item =collision.GetComponent<PickUp>();Debug.Log("collided with a collectible of value: "+item.Value);GameData.instanceRef.Add(item.Value);Destroy(collision.gameObject); //destroy GameObject of the object we collided with } elseif (collision.CompareTag("Hazard")) {PickUp item =collision.GetComponent<PickUp>();Debug.Log("collided with a hazard of value: "+item.Value);//update gameData databaseGameData.instanceRef.TakeDamage(item.Value);Destroy(collision.gameObject); //destroy GameObject of the object we collided with } }}///end of Class