И сразу первый вопрос. За-а-а-чем? Я отвечу. При чём приводя очень показательные доказательства.
Ставь минус, если я уже достал.
Вот минусы текущих "кнопок" в Unity:
  • Нет доступа к полям
  • Не совсем логичная привязка (ИМХО)
А теперь конкретнее. Те, кто понимает, что значит строка:
horizontalAxis = Input.GetAxis("Horizontal");
Должны знать, что это всё, что предлагает Unity. Грубо, но правда. Рассмотрим раздел Input:
Я буду приводить пример на одной кнопке. Мы видим, сколько здесь открытых для настройки полей. Тогда вопрос, почему мы не можем
взаимодействовать с этими полями в нашем коде? Да, инкапсуляция это хорошо, но в данном случае мы наблюдаем её бесполезность.
Во-первых благодаря такому ходу конём, мы, разработчики, не можем сделать обычную привязку клавиш. Это означает, что мы не можем,
например, в нашей игре, сменить управление. Единственное, где мы можем сменить управление - в окне конфигурации. Но его уже давно
используют всего 5% разработчиков.
Во-вторых мы не можем динамично менять параметры нажатых клавиш. Даже если вы специалист в Unity, знали ли вы то, что для одной
кнопки с именем "Horizontal" (пример) используется разная чувствительность в зависимости от вводимого устройства (клавиатура/геймпад).
Это значит, что в игре, когда игрок подключает геймпад и продолжает игру, то сталкивается с неудобством, так как это меняет скорость движения управляемого объекта.
Очевидно, что этот параметр можно настроить. Но только внутри Input раздела.
Не логичность привязки состоит в том, что кнопка привязывается по одному имени. Да, это удобно, если в реалтайм режиме игрок меняет устройство ввода. Но это не логично в том, что два разных объекта, имеют одинаковое название. Я бы не отнёс это к минусу, но всё же, для меня
привычнее видеть кнопки "Shoot Mouse" и "Shoot Gamepad", чем "Shoot" и "Shoot".
Обсудив этот вопрос ещё с одним коллегой, вывод стал - сделать собственный ввод. Я собственно и пришёл с этим сюда. Я хочу здесь оставить конкретно "недоработку" архитектуры, использующий паттерн "Команда".
Пример:
Так выглядит недоделка:
Хочу заметить, что переписать под точный аналог вполне легко. В данном случае я просчитался, когда решил настраивать бинд кнопки
через 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);
	}
Остальное выложу в шаблон. А именно паттерн, обработку всех действий. В общем сюда
0
24
7 лет назад
0
Проблема выглядит как-то искуственно. Что мешает трекать ввод для геймпада отдельно от мышки с клавиатурой, а не в одной оси, если от этого возникают проблемы? Да и прямое использование значений с устройств ввода в качестве трансформа выглядит как-то "опасно".
Впрочем, я юнити не пользуюсь, а в анриле свои проблемы с вводом.
0
13
7 лет назад
0
prog, А проблема в том, что трекинг можно осуществить через костыль. Я думал об этом но, увы, если и использовать костыль, то дело ведь не в этом. Дело в полном отсутствии доступа к необходимым данным. Прямое использование - это ведь был грубый пример. В шаблоне же обработка идет с использованием "команды".
0
24
7 лет назад
Отредактирован prog
0
DasBro, а каждый такт искать в Update по отдельности каждую ось в непонятном контейнере это тоже только заготовка или так и должно быть? При том, что эта ось вроде как уже найдена найдена и лежит в переменной. отбой, понял что разные функции. не заметил сразу отличие в два символа. Но это всеравно не ок, имхо.
Ну и отсутствие проверок на фейлы это такое, дело вкуса.
0
13
7 лет назад
Отредактирован DasBro
0
prog, Да, но я и не профессионал, чтобы делать обработку исключений и т.п.
а каждый такт искать в Update по отдельности каждую ось в непонятном контейнере
По другому сделать обработку нажатия клавиши с условием, что одна из переменных одна быть интерполирована в другое значение нельзя.
Функции, согласен, вышли почти одинаковы по названию, думаю исправить.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.