Как проверить касания объекта до пола unity

Объект (персонаж) может делать прыжки в воздухе при нажатии пробела, а мне надо чтобы он мог это делать только находясь на земле. Мне нужна помощь. Там, где нужно сделать эту проверку я пометил восклицательными знаками.

     void FixedUpdate()
    {
        rb.AddForce(0, 0, runSpeed * Time.deltaTime);

        if (strafeLeft)
        {
            rb.AddForce(-strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        }

        if (strafeRight)
        {
            rb.AddForce(strafeSpeed * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
        }

        if (doJump)
        {
            if () // !!!!!
            {
                doJump = false; //Не делать прыжок
            } else
            {
                rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse); //Если персонаж касается пола, сделать прыжок

                doJump = false;
            }
       
        }

        if (rb.velocity.magnitude > runSpeed)   //Если скорость объекта превышает максимальную скорость
        {
            rb.velocity = rb.velocity.normalized * runSpeed;  //Задать скорость на уровне максимальной
        }
    }

Ответы (1 шт):

Автор решения: Максим Фисман

Сразу дам две ссылки:


Вам нужно реализовать простейшую систему:

  1. Земля имеет коллайдер и тег "Ground"
  2. Игрок имеет коллайдер
  3. Скрипт игрока имеет переменную isGrounded
  4. При начале коллизии с землей игрок становиться "приземленным": isGrounded=true
  5. При окончании коллизии с землей игрок становиться "летающим": isGrounded=false
  6. Игрок может прыгать, только если isGrounded==true

В класс игрока стоит добавить:

private bool isGrounded;

private void OnCollisionEnter (Collision collision) {
if (collision.gameObject.tag == "Ground") {
isGrounded = true;
}

private void OnCollisionExit (Collision collision) {
if (collision.gameObject.tag == "Ground") {
isGrounded = false;
}
}

На том месте, где у вас восклицательные знаки:

...
if (isGrounded) {
...

Однако, как уже сказал Andrew в комментариях у вас очень много ошибок. Например, вы реализовываете движение в FixedUpdate (подразумевая, что оно физическое), но при этом используете Time.deltaTime, хотя есть Time.fixedDeltaTime специально для FixedUpdate. Два условия (strafeRight), (strafeLeft) тоже выглядят как-то странно, к тому же у них в теле находится вызов одной и той же функции, только с противоположными параметрами strafeSpeed и -strafeSpeed. Да и вообще Time.deltaTime в AddForce выглядит странно (и еще странней, когда все это в FixedUpdate). В общем, читайте ссылочку, особенно первую.

→ Ссылка