I don't know how to ground check the player

I’m trying to use the OverlapCircle to check if the player is on the ground or not but I don’t know how to continue the script

using UnityEngine;
using System.Collections;

public class playercontroller : MonoBehaviour
{

[HideInInspector]
public bool facingRight = true;
[HideInInspector]
public bool jump = false;
public float moveForce = 365f;
public float maxSpeed = 5f;
public float jumpForce = 1000f;
public Transform groundCheck;
public LayerMask whatIsGround;



public bool grounded = false;
private Animator anim;
private Rigidbody2D rb2d;

// Use this for initialization
void Awake()
{
    anim = GetComponent<Animator>();
    rb2d = GetComponent<Rigidbody2D>();
}

// Update is called once per frame
void Update() {
    if (Input.GetKey(KeyCode.Space) && grounded == true) {
        jump = true;
    }
}

void FixedUpdate() {
    float h = Input.GetAxis("Horizontal");

    anim.SetFloat("Speed", Mathf.Abs(h));

    if (h * rb2d.velocity.x < maxSpeed)         //vai adicionar velociade ao jogador e manter no limite
        rb2d.AddForce(Vector2.right * h * moveForce);

    if (Mathf.Abs(rb2d.velocity.x) > maxSpeed)          //se o jogador passar do limite de velocidade ira baixar até o limite
        rb2d.velocity = new Vector2(Mathf.Sign(rb2d.velocity.x) * maxSpeed, rb2d.velocity.y);

    if (h > 0 && !facingRight)              //ira fazer o flip no sprite junto com a animação 
        Flip();
    else if (h < 0 && facingRight)
        Flip();

    if (jump) {
        // anim.SetTrigger("Jump"); 
        rb2d.AddForce(new Vector2(0f, jumpForce));
        jump = false;
    }
}

void Flip(){             //função de virar o script 
        facingRight = !facingRight;
    Vector3 theScale = transform.localScale;
    theScale.x *= -1;
    transform.localScale = theScale;
}

void onGroundCollision(Collision coll) {
    
/if(Physics2D.OverlapCircle( , 5)){
        grounded = true;
    
			
    }

}

do you mean to keep checking constnatly or do you mean you dont know the rest of the script? if you want to continously check you need to place it in the fixed update loop by calling the function from inside it. a simple script is bool IsGrounded() { if(Physics2d.overlapcircle(,5)) return true; return false; } bool _IsGrounded; fixedupdate() { _IsGrounded = IsGrounded(); } now every fixed update frame the variable _IsGrounded will be updated to reflect if the player is grounded.

This method: void onGroundCollision(Collision coll), is yours or from unity?, if it is from unity, you need to check the syntax about it, at contrary, you need to check which contact point was detected, check the documentation about it, cheers.

3 Answers

3

I find raycasting works better for checking if you are grounded or not

    public float groundedHeight = 0.5f; // the height above ground to determine if the player is grounded
    public float checkRate = 1.0f; // how often in seconds we check to see if we are grounded
    public bool grounded = false;// is grounded or not
    public LayerMask groundLayer;//the layer on which we can be grounded
    public float heightOffset = 0.25f; // we dont want to cast from the players feet (may cast underground sometimes), so we offset it a bit

    void Start()
    {
        InvokeRepeating("GroundCheck", 0, checkRate);
    }

    void GroundCheck()
    {
        if (Physics.Raycast(new Vector3(transform.position.x, transform.position.y + heightOffset, transform.position.z), Vector3.down, groundedHeight + heightOffset, groundLayer))
        {
            grounded = true;
        }
        else {
            grounded = false;
        }
    }

It's a 2D game, but i get the idea thanks

It's probably faster but not that precise. It depends on situation. When you need to check whole width of the player or another object, you'd need to cast more raycasts / linecasts, not only one. Otherwise when staying on some edge, raycast/linecast wouldn't detect the desired collider. If you need a precise check, you need to use spherecast / boxcast or something similar appropriate to the object shape.

77575-screenshot-2.jpgpublic bool grounded = false;

float groundcheckRadius = 0.1f;

public LayerMask groundLayer;

public Transform groundcheck;

grounded = Physics2D.OverlapCircle(groundcheck.position, groundcheckRadius, groundLayer);

make an empty gameobject named “groundcheck” and put it right under your player.77576-screenshot-3.jpg

drag the “groundcheck” gameobject to groundcheck field and make sure ground layer is selected for ground layer

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

public class playermovement : MonoBehaviour
{
public float JumpHeight;
Rigidbody2D rb;
float move;
public float speed;
// Start is called before the first frame update
void Start()
{
rb = GetComponent();
}

// Update is called once per frame
void Update()
{
    // Right left movement
    move = Input.GetAxis("Horizontal");
    rb.velocity = new Vector2(move * speed, rb.velocity.y);

     
    
    if (Input.GetButtonDown("Jump"))
    {
        rb.velocity = new Vector2(rb.velocity.x, JumpHeight);
    }
   

    
    
       
    
}

}

same i also want help

...I don't know try with FixedUpdate instead of Update, I had a similiar problem, that for a some milleseconds the character was trapassing the walls, I used FixedUpdate, and I have decereased the FixedDeltatime calls in a second to 0.01 (project settings --> time -->Fixed timestep, but this will make your game heavyer)