И сразу первый вопрос. За-а-а-чем? Я отвечу. При чём приводя очень показательные доказательства.
Ставь минус, если я уже достал.
Вот минусы текущих "кнопок" в Unity:
- Нет доступа к полям
- Не совсем логичная привязка (ИМХО)
А теперь конкретнее. Те, кто понимает, что значит строка:
horizontalAxis = Input.GetAxis("Horizontal");
Должны знать, что это всё, что предлагает Unity. Грубо, но правда. Рассмотрим раздел Input:
Я буду приводить пример на одной кнопке. Мы видим, сколько здесь открытых для настройки полей. Тогда вопрос, почему мы не можем
взаимодействовать с этими полями в нашем коде? Да, инкапсуляция это хорошо, но в данном случае мы наблюдаем её бесполезность.
взаимодействовать с этими полями в нашем коде? Да, инкапсуляция это хорошо, но в данном случае мы наблюдаем её бесполезность.
Во-первых благодаря такому ходу конём, мы, разработчики, не можем сделать обычную привязку клавиш. Это означает, что мы не можем,
например, в нашей игре, сменить управление. Единственное, где мы можем сменить управление - в окне конфигурации. Но его уже давно
используют всего 5% разработчиков.
например, в нашей игре, сменить управление. Единственное, где мы можем сменить управление - в окне конфигурации. Но его уже давно
используют всего 5% разработчиков.
Во-вторых мы не можем динамично менять параметры нажатых клавиш. Даже если вы специалист в Unity, знали ли вы то, что для одной
кнопки с именем "Horizontal" (пример) используется разная чувствительность в зависимости от вводимого устройства (клавиатура/геймпад).
Это значит, что в игре, когда игрок подключает геймпад и продолжает игру, то сталкивается с неудобством, так как это меняет скорость движения управляемого объекта.
Очевидно, что этот параметр можно настроить. Но только внутри Input раздела.
кнопки с именем "Horizontal" (пример) используется разная чувствительность в зависимости от вводимого устройства (клавиатура/геймпад).
Это значит, что в игре, когда игрок подключает геймпад и продолжает игру, то сталкивается с неудобством, так как это меняет скорость движения управляемого объекта.
Очевидно, что этот параметр можно настроить. Но только внутри Input раздела.
Не логичность привязки состоит в том, что кнопка привязывается по одному имени. Да, это удобно, если в реалтайм режиме игрок меняет устройство ввода. Но это не логично в том, что два разных объекта, имеют одинаковое название. Я бы не отнёс это к минусу, но всё же, для меня
привычнее видеть кнопки "Shoot Mouse" и "Shoot Gamepad", чем "Shoot" и "Shoot".
привычнее видеть кнопки "Shoot Mouse" и "Shoot Gamepad", чем "Shoot" и "Shoot".
Обсудив этот вопрос ещё с одним коллегой, вывод стал - сделать собственный ввод. Я собственно и пришёл с этим сюда. Я хочу здесь оставить конкретно "недоработку" архитектуры, использующий паттерн "Команда".
Пример:
Так выглядит недоделка:
Хочу заметить, что переписать под точный аналог вполне легко. В данном случае я просчитался, когда решил настраивать бинд кнопки
через Keycode, а не через string, как в Input. Однако это легко сделать.
через Keycode, а не через string, как в Input. Однако это легко сделать.
Я отнесу абстракцию в свой шаблон, как и паттерн, но а здесь оставлю всё то, что эмулирует Input.GetAxis, но при этом даёт доступ к параметрам.
Но если есть смысл доделать эту систему, то я займусь этим. Либо кто-то другой.
Но если есть смысл доделать эту систему, то я займусь этим. Либо кто-то другой.
Класс кнопки (на момент написания этих строк):
/// <summary>
/// Собственный класс для кнопок (Input's)
/// </summary>
[System.Serializable]
public class IHKey
{
public string nameKey;
public float valueKey, sensivityKey;
public KeyCode key;
}
Класс для обработки кнопок (только нужный фрагмент):
public static IHKey gameKey;
/// <summary>
/// Возвращает класс IHKey по названию кнопки. (keyName)
/// </summary>
/// <param name="name">Название Кнопки</param>
/// <returns>экземпляр класса IHKey</returns>
public IHKey FindIHKey(string name)
{
IHKey key = keys.Find(element => element.nameKey.Contains(name));
return key;
}
private void Start()
{
gameKey = FindIHKey("Horizontal");
}
private void Update()
{
if(Input.GetKey(FindKey("Horizontal")))
gameKey.valueKey = Mathf.Lerp(gameKey.valueKey, 1, gameKey.sensivityKey * Time.deltaTime);
else
gameKey.valueKey = Mathf.Lerp(gameKey.valueKey, 0, gameKey.sensivityKey * Time.deltaTime);
}
Тестовый класс, для управления объектом:
public Transform target;
private float move;
private void LateUpdate()
{
move = IHInputManager.gameKey.valueKey;
target.Translate(new Vector2(0, move) * 2.5f * Time.deltaTime);
}
Остальное выложу в шаблон. А именно паттерн, обработку всех действий. В общем сюда
Впрочем, я юнити не пользуюсь, а в анриле свои проблемы с вводом.
Ред. prog
При том, что эта ось вроде как уже найдена найдена и лежит в переменной.отбой, понял что разные функции. не заметил сразу отличие в два символа. Но это всеравно не ок, имхо.Ред. DasBro
Функции, согласен, вышли почти одинаковы по названию, думаю исправить.