Полезное

Мы Вконтакте

Discord канал

#
Аватара пользователя
Пользователь
Сообщения: 589
Привет всем.

Вопрос такой. Предположим я решил написать плагин или что в этом духе для движка Unreal.
Мне нужно добавить вибрацию USB джойстиков.
Куда мне нужно копать? Да и возможно ли такое ?

Готового решения я ещё не встречал нигде.
Аватара пользователя
Пользователь
Сообщения: 589
Что бы разобраться в этом пришлось пуд соли съесть.

Существуют два вида устройств Xinput и DirectInput. У них вибрация делается по разному.
Сперва наткнулся на плагины для Unity3d, которые оказалось можно подключить к UE4.
Для Xinput тут отписывался:
viewtopic.php?f=2&t=13893
Для DirectInput тоже есть плагин. Но проблема в том что DirectInput не работает с несколькими джойстиками. Т.е нельзя выбирать какой джойстик будет вибрировать. Работать будет только первый.

Попробовал порыть в исходниках плагинов эмуляторов для PS2. Но код их почему то не работает. Переносил нужные элементы кода себе в проект. Компилятор понимает, но выполнять отказывается.

Пробовал подключать Logitech plugin для Unity3d и UE4. Он тоже не работает с джойстиками.

Единственный рабочий вариант оказался - это использовать SDL2:
http://wiki.libsdl.org/CategoryForceFeedback

Подключил библиотеку используя этот урок:
https://wiki.unrealengine.com/How_to_Li ... t_And_Easy

Правда есть некоторые нюансы.
Первый пример SDL_HapticRumblePlay - это для Xinput.
А второй SDL_HapticRunEffect - это для DirectInput.
По другому не получится.
И это надо учитывать.

Что бы работать с несколькими джойстиками нужно сделать массив.

У второго варианта после проигрывания эффекта нужно обязательно его удалить (SDL_HapticDestroyEffect). Иначе программа зависнет.

И почему то в редакторе Unreal вибрация после первого запуска начинает умирать. Не знаю как от этого избавится. Тестировать трудно. В запакованном проекте такого нет.

И что бы надежно работало. Лучше не использовать команду SDL_HapticOpen.
Нужно использовать SDL_GameControllerGetJoystick, потом SDL_HapticOpenFromJoystick, затем SDL_HapticRumbleInit для Xinput.
Ну а для DirectInput как в примере. Иначе две системы вместе не подружатся.

P.S. Странно что UEJoystickPlugin который использует тоже SDL2 не работает с Xinput вообще. Когда я разобрался во всём этом я сразу решил отказался от этого плагина. К тому же он ещё и обновляется не регулярно( не на каждую версию движка он есть). А как самому его обновить я понятия не имею.
Аватара пользователя
Пользователь
Сообщения: 589
Решил ещё добавить по SDL2.

Думал как будет работать всё с разными джойстиками, у которых виброэффект есть и у которых нет. Да и плюс управление ещё написал на SDL2. Хотел купить несколько разных джойстиков в магазине для теста. Долго думал и не решался этого сделать. Думал куплю, потом валятся будут. Я в игры редко играю. Но потом наконец решился.

Пошел купил. И оказалось что не зря это сделал.
Выяснилась одна штука. В этой библиотеке SDL_gamecontroller рассчитан на работу с Xinput, а SDL_joystick с DirectInput. Оказывается DirectInput джойстики у которых отсутствуют аналоговые стики определяются как SDL_gamecontroller. А это большой минус, потому что у Xinput количество кнопок ограничено и поэтому некоторые кнопки не будут работать.

Пришлось изворачиваться и адаптировать-переписывать код. Благо что там все предусмотрено. Есть команда SDL_GameControllerGetJoystick.
Аватара пользователя
Пользователь
Сообщения: 589
Вот мой код:





Создаем новый C++ class Blueprint Function Library. У меня называется Fight.

Изображение

Писал его под себя. Мне нужно было что бы любой джойстик можно было подключить.
Максимальное количество кнопок у PS4 джойстика (их 14), у остальных обычно меньше. Поэтому управление больше 14 кнопок пока смысла не вижу делать. Управление от SDL_JoystickGetHat работает только у PS4 джойстика.
Для эффекта вибрации в DirectInput режиме при попадании пуль или ударов в игре лучше всего использовать на мой взгляд SDL_HAPTIC_SAWTOOTHDOWN. Длительность эффекта 0.30 .
Воспроизведение эффекта в разных режимах отличается. У меня есть джойстик с переключением режимов X-D. Я подобрал амплитуду что бы в обоих случаях была одинаковой( в X - 0.7, в D - 10000).
HapticRumble проигрывается пока подаешь на него Tick. Поэтому через TimeLine. Настроено тоже на 0.30 .

Использовался UE4.18 или UE4.19, VS2015 , SDL2 версия 2.0.8.0.
Аватара пользователя
Пользователь
Сообщения: 589
Начиная с версии UE4.20 код не работал.
Выдавало ошибку. Не мог найти решение этой проблемы.

Но недавно скачал вот этот плагин:
https://github.com/tsky1971/UEJoystickPlugin

Там есть редактированные Include файлы SDL2 версии 2.0.8.0.
Закинул их в свой проект с заменой.

И всё заработало. Пробовал на версии UE4.22.

Оставлю здесь этот пост для информации. Может кому пригодится.


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница