Menu
CoddyTech

Трасса

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 48 из 56.

В этой главе мы создадим трёхмерный платформер. Ты будешь бегать и прыгать по парящим платформам, кататься на скользящей платформе, активировать контрольные точки, чтобы после падения не возвращаться к началу, собирать отображаемые на экране самоцветы, пересекать финишную линию и переходить на следующий уровень, а также пытаться побить свой лучший результат по времени. В проекте с самого начала есть пять скриптов: Player, MovingPlatform, Checkpoint, Gem и FinishLine. Последние четыре пока пусты, и в каждом уроке мы будем заполнять один из них. Персонаж игрока использует CharacterController, управление которым осуществляется с помощью действий Input System, а камера является его дочерним объектом, поэтому следует за ним без скрипта.

CharacterController перемещается двумя способами. Move(motion) перемещает его на заданное расстояние и ничего не добавляет, поэтому за гравитацию, прыжки и Time.deltaTime отвечает скрипт, как в главе о Character Controller. SimpleMove(speed) принимает скорость в единицах в секунду, сам умножает её на время кадра и добавляет гравитацию; передаваемое значение y игнорируется, поэтому персонаж, перемещаемый с его помощью, падает с выступов, но никогда не может прыгнуть. Этой овчарке в игре о пастушьем псе, видимой сверху, прыгать не нужно, поэтому SimpleMove и действие Move — это всё, что нужно для её скрипта:

using UnityEngine;
using UnityEngine.InputSystem;

public class Sheepdog : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    private CharacterController controller;
    private InputAction moveAction;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
    }
}

Персонаж игрока в платформере должен уметь прыгать, поэтому он хранит собственную вертикальную скорость и перемещается с помощью Move, считывая действия Move и Jump вместо класса Input. Unity рекомендует вызывать Move или SimpleMove один раз за кадр: перемещение при ходьбе и падение выполняются одним вызовом, и тогда isGrounded описывает всё это перемещение.

challenge icon

Задание

Средне

Начни платформер с игрока. Скрипт Player содержит speed (5), jumpHeight (1.5) и gravity (-9.81), controller и velocity для падения. Найди действия Move и Jump один раз, в Start, а в Update:

  • Move перемещает игрока со скоростью speed единиц в секунду: вправо и влево вдоль x, вперёд и назад вдоль z.
  • Гравитация каждый кадр добавляет gravity * Time.deltaTime к velocity.y. Пока контроллер находится на земле и velocity.y меньше 0, сначала установи velocity.y в -2, чтобы игрок оставался прижатым к земле.
  • Каждое нажатие Jump, пока игрок на земле, устанавливает velocity.y в Mathf.Sqrt(jumpHeight * -2f * gravity): высота прыжка составляет jumpHeight единиц. Удерживание Jump приводит к одному прыжку, а прыгать в воздухе нельзя.
  • Вызови controller.Move один раз, передав вместе перемещение и velocity, умноженные на Time.deltaTime.

Нажми Играть и перепрыгни на первые платформы, затем нажми Проверить.

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

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController controller;
    private Vector3 velocity;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // передвигаться с помощью действия Move, прыгать с помощью действия Jump, падать под действием гравитации
    }
}
quiz iconПроверьте себя

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

Все уроки раздела Создание настоящих игр