- Home /
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.
the problem I'm having is that I can not do detect this crashing into the ground, I am using overlap circle but I am lost on how to place to detect which came into collision with the ground
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.
it's his, unity defined definitions are generally highlighted in some way. You'll notice Update and FixedUpdate are in purple.
Answer by b1gry4n · Sep 01, 2016 at 11:01 PM
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 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.
Answer by Dream_in_code · Sep 04, 2016 at 03:23 PM
public 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.
drag the "groundcheck" gameobject to groundcheck field and make sure ground layer is selected for ground layer
Answer by biswasarnav2180 · Sep 14, 2021 at 05:08 AM
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);
}
}
}