icecub
icecub

Reputation: 8773

Detect collision between player and ground Unity3D

I'm still learning Unity and right now I'm trying to make my player able to jump. Of course I don't want my player to be able to jump on forever, so my idea was to only enable jumping when the player is in contact with a floor object. This is the code I have so far:

public class PlayerController : NetworkBehaviour
{

    public float speed;             // Player movement speed
    private bool grounded = true;   // Contact with floor

    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Show a different color for local player to recognise its character
    public override void OnStartLocalPlayer()
    {
        GetComponent<MeshRenderer>().material.color = Color.red;
    }

    // Detect collision with floor
    void OnCollisionEnter(Collision hit)
    {
        if (hit.gameObject.tag == "Ground")
        {
            grounded = true;
        }
    }

    // Detect collision exit with floor
    void OnCollisionExit(Collision hit)
    {
        if (hit.gameObject.tag == "Ground")
        {
            grounded = false;
        }
    }

    void FixedUpdate()
    {
        // Make sure only local player can control the character
        if (!isLocalPlayer)
            return;

        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement * speed);

        // Detect space key press and allow jump if collision with ground is true
        if (Input.GetKey("space") && grounded == true)
        {
            rb.AddForce(new Vector3(0, 1.0f, 0), ForceMode.Impulse);
        }
    }
}

But it seems OnCollisionEnter and OnCollisionExit never trigger. So the player is still able to jump whenever he wants. Am I doing something wrong?

Edit: It seems OnCollisionEnter and OnCollisionExit are triggered perfectly fine. It's just the if statements returning false. I have no idea why though.

if (GameObject.Find("Ground") != null) returned true.

Edit 2: Strangely enough both of these return Untagged:

Debug.Log(hit.gameObject.tag);
Debug.Log(hit.collider.tag);

Upvotes: 0

Views: 3286

Answers (1)

Syamesh K
Syamesh K

Reputation: 826

Please give us more information

  1. Please tell me which version of unity you are using?
  2. Have you updated the project to some other latest version of unity?
  3. Also give a screen shot of your 'tag' array.

Upvotes: 1

Related Questions