Действия ввода
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 47 из 60.
Проверка клавиш по одной привязывает скрипт к клавиатуре. Вместо этого действие обозначает то, что делает игрок, а проект задаёт, какие клавиши, стики и кнопки его вызывают. Новый проект Unity 6 поставляется с набором таких действий (ресурс InputSystem_Actions, назначенный действиями для всего проекта). В карте Player есть Move (WASD, стрелки и левый стик геймпада), Look (мышь или правый стик), Attack (левая кнопка мыши и Enter), Interact (E, пока клавиша удерживается), Crouch (C), Jump (пробел и нижняя кнопка геймпада), 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.
Задание
СреднеПеремещай геодезиста и устанавливай флаги с помощью действий проекта.
- В
Start()настройmoveAction,jumpActionиattackActionс помощьюInputSystem.actions.FindAction("Move"),"Jump"и"Attack". - В
Update()перемещайся, умножаяmoveAction.ReadValue<Vector2>()наspeed; компонент y направляй вдоль оси z. - Вызывай
Plant(), когдаjumpAction.WasPressedThisFrame(), аPullUp()— при нажатии Attack.
Нажми «Играть», установи три флага и щёлкни, чтобы вытащить один из них. Затем нажми «Проверить».
Попробуйте сами
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 InputAction moveAction;
private InputAction jumpAction;
private InputAction attackAction;
private List<GameObject> planted = new List<GameObject>();
void Start()
{
// найти действия Move, Jump и Attack
}
void Update()
{
// перемещаться с помощью Move, вызывать Plant() при нажатии Jump, а PullUp() — при нажатии Attack
}
void Plant()
{
if (flags == 0) return;
Vector3 spot = new Vector3(transform.position.x, 0.75f, transform.position.z);
planted.Add(Instantiate(flagPrefab, spot, Quaternion.identity));
flags--;
Debug.Log("Flags left: " + flags);
}
void PullUp()
{
if (planted.Count == 0) return;
GameObject last = planted[planted.Count - 1];
planted.RemoveAt(planted.Count - 1);
Destroy(last);
flags++;
Debug.Log("Flags left: " + flags);
}
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке3Менеджер игры
Один скрипт управляет игройОдиночкаСостояния игрыПереключение состоянияПовторение: менеджер раундов6Проект: Бесконечный раннер
Три полосыПрепятствия впереди9Новая система ввода
Две системы вводаКлавиатура и мышьНажатие в текущем кадреДействия вводаПовторение: смена системы вводаПотренируйтесь самостоятельно: Песочница Unity