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;
public class PlayerController : MonoBehaviour
{
public enum HeroState { idle, walk, jump } //create custom data-type - have integer values
public HeroState currentHeroState; //will display the current enum
private Animator animator; //- null - reference variable to access animator component
public bool facingRight; //keep track of sprite direction - used in Flip
private Rigidbody2D myRBody2D;
public float forceX; //used for adjusting velocity
public Transform groundCheck; //transform component on GroundCheck object
public LayerMask groundLayer; //allows us to interact with a physics Layer
public float groundCheckRadius ; //
public float jumpForce;
public bool grounded = false; //will let us see if the gameOjb is grounded
// Start is called before the first frame update
void Start()
{
currentHeroState = HeroState.idle; //initialize to show it's in idle to start
animator = GetComponent<Animator>();//is on the same game object as this script
animator.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 frame
void FixedUpdate() //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 flipping
if( inputX > 0 && !facingRight) //moving right, facing left
{
Flip(); //flip right
}else if( inputX <0 && facingRight) //moving left, facing right
{
Flip(); //flip left
}
animator.SetInteger("HeroState", (int)HeroState.walk);
myRBody2D.velocity = new Vector2( 0, myRBody2D.velocity.y); //reset the velocity to 0 //may come back and change
myRBody2D.AddForce(new Vector2(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 Movement
myRBody2D.velocity = new Vector2(myRBody2D.velocity.x, 0); //reset the velocity to 0 //keep horizontal movement
myRBody2D.AddForce(new Vector2(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 executed
private void Flip()
{
facingRight = !facingRight; //toggle direction variable
//get Scale Vector
Vector3 theScale = transform.localScale; //get the current values for Scale Vector
theScale.x *= -1; //modify the X component //mirror the sprite
transform.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>
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log("Collided with something");
//check tag on gameObject that has this collider on it
if (collision.CompareTag("Collectible"))
{
//get the PickUp component from the gameObject with this collider on it
PickUp 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
}
else if (collision.CompareTag("Hazard"))
{
PickUp item = collision.GetComponent<PickUp>();
Debug.Log("collided with a hazard of value: " + item.Value);
//update gameData database
GameData.instanceRef.TakeDamage(item.Value);
Destroy(collision.gameObject); //destroy GameObject of the object we collided with
}
}
}///end of Class
Floor: Empty GameObject with BoxCollider
Populate New Items in Player: Inspector PlayerController Component