Menu
CoddyTech

Трасса

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

В этой главе мы создадим 3D-платформер. Ты будешь бегать и прыгать по парящим платформам, кататься на одной из них, которая скользит, касаться контрольных точек, чтобы при падении не возвращаться к началу, собирать самоцветы, количество которых отображается на экране, пересекать финишную черту и переходить на следующий уровень, а также пытаться побить свой лучший результат. Игра состоит из пяти скриптов, которые уже есть в проекте с самого начала: 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

Задание

Средне

Заставь игрока ходить, прыгать и падать.

  1. В Start() найди действия Move и Jump с помощью InputSystem.actions.FindAction.
  2. В Update() перемещайся со скоростью speed: x у Move направь вдоль x, а y — вдоль z.
  3. Прибавляй gravity * Time.deltaTime к velocity.y; когда персонаж на земле и падает, устанавливай значение -2f. Прыжок, когда персонаж на земле, задаёт значение Mathf.Sqrt(jumpHeight * -2f * gravity).
  4. Один раз вызови controller.Move((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 и падайте под действием силы тяжести
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity