Menu
CoddyTech

Действия ввода

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

Проверка клавиш по одной привязывает скрипт к клавиатуре. Вместо этого действие описывает, что делает игрок, а в проекте перечислены клавиши, стики и кнопки, которые его запускают. В новом проекте Unity 6 уже есть набор таких действий (ресурс InputSystem_Actions, заданный как действия для всего проекта); карта Player в нём содержит Move (WASD, стрелки и левый стик геймпада), Look (мышь или правый стик), Attack (левая кнопка мыши и Enter), Interact (E, удерживаемая), Crouch (C), Jump (Space и южная кнопка геймпада), Previous и Next (1 и 2), а также Sprint (Left Shift). Они включены с самого начала, а InputSystem.actions.FindAction("Jump") находит действие по имени. Этот боковой кран с клешнёй перемещается по x и y и хватает предметы при нажатии Jump:

using UnityEngine;
using UnityEngine.InputSystem;

public class ClawCrane : MonoBehaviour
{
    public float speed = 3f;

    private InputAction moveAction;
    private InputAction jumpAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        jumpAction = InputSystem.actions.FindAction("Jump");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, input.y, 0f) * speed * Time.deltaTime;

        if (jumpAction.WasPressedThisFrame())
            Debug.Log("Grab!");
    }
}

Действия находятся один раз, в Start, и хранятся в полях типа InputAction. Move возвращает Vector2: x отвечает за движение вправо и влево, y — вверх и вниз при нажатии клавиш; вектор нормализован, поэтому одновременное нажатие W и D даёт (0.71, 0.71), а не (1, 1). Это вид сбоку, поэтому кран использует y для высоты; в игре с видом сверху он использовал бы эту координату для z. Действия-кнопки работают как клавиши: WasPressedThisFrame(), WasReleasedThisFrame() и IsPressed(). Две ошибки приводят к сбою: если неправильно написать имя, FindAction вернёт null (при первом чтении возникнет NullReferenceException), а вызов ReadValue<Vector3>() для Move приведёт к InvalidOperationException, как только будет нажата какая-либо клавиша, поскольку Move содержит значение типа Vector2.

challenge icon

Задание

Средне

Картограф исследует снежное поле, видимое сверху, и несёт flags (3), чтобы расставлять их по пути. В скрипте есть speed (4), flags, flagPrefab и список planted. Используй действия проекта:

  • Move перемещает картографа по снегу со скоростью speed единиц в секунду: вправо и влево вдоль оси x, вверх и вниз вдоль оси z.
  • Каждое нажатие Jump устанавливает флаг: копию flagPrefab в точке с координатами x и z картографа и координатой y, равной 0.75, и добавляет её в planted. При этом расходуется один из flags, и в журнал выводится оставшееся количество, например Flags left: 2. Если флагов не осталось, Jump ничего не устанавливает.
  • Каждое нажатие Attack (щелчок левой кнопкой мыши) поднимает последний установленный флаг: он уничтожается и удаляется из списка, значение flags увеличивается на единицу, и в журнал выводится та же строка.

Нажми Play, установи три флага и подними один, затем нажми Check.

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

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Surveyor : MonoBehaviour
{
    public float speed = 4f;
    public int flags = 3;
    public GameObject flagPrefab;

    private List<GameObject> planted = new List<GameObject>();

    void Start()
    {
        // найди действия Move, Jump и Attack
    }

    void Update()
    {
        // перемещайся с помощью Move, устанавливай флаг при нажатии Jump и убирай один при нажатии Attack
    }
}
quiz iconПроверьте себя

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

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