Menu
CoddyTech

Проверка земли с помощью луча

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 35 из 63.

Прыжок должен начинаться только с земли. В упражнении «Стояние на земле» это определялось по нормалям контакта, которые обновлялись сообщениями о столкновениях. Луч мгновенно отвечает на вопрос «стою ли я на чём-нибудь?» в любой момент: направь его строго вниз от центра, сделав немного длиннее расстояния от центра до нижней точки. Этот игрок — капсула высотой 2 единицы, поэтому её нижняя точка находится на 1 единицу ниже центра, а длина луча — 1.1:

public float jumpForce = 5f;
private Rigidbody rb;

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

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

Дополнительные 0.1 — это запас. Тело, стоящее на полу, может находиться чуть выше него или чуть погрузиться в него, поэтому луч длиной ровно 1 на некоторых кадрах не обнаружит пол. Слишком большая длина даст противоположный эффект: при длине 3 игрок сможет прыгнуть снова, поднявшись на 2 единицы в воздух, а при нулевой длине луч всегда будет находить пол, поэтому каждое нажатие будет вызывать прыжок.

Луч начинается внутри собственного коллайдера игрока, который лучи пропускают, поэтому игрок никогда не будет обнаружен. Клавиша считывается в Update(), потому что GetKeyDown имеет значение true только в течение одного кадра, а единичный импульс можно добавить прямо здесь, как в упражнении «Прыжок с импульсом».

challenge icon

Задание

Средне

Лягушка прыгает всякий раз, когда нажимают пробел, даже в воздухе, поэтому она может взлететь до небес. Исправь Hopper, чтобы она прыгала только с земли:

  • Добавь метод bool IsGrounded(), который направляет луч строго вниз от центра лягушки. Лягушка — сфера, масштабированная до 1.5, поэтому её радиус равен 0.75: сделай так, чтобы луч проходил на 0.1 ниже её нижней точки.
  • Прыгай только тогда, когда нажата клавиша пробела и IsGrounded() возвращает true.

Нажми Play и попробуй прыгнуть дважды, затем нажми Check.

Попробуйте сами

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float jumpForce = 6f;
    private Rigidbody rb;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс