- PVSM.RU - https://www.pvsm.ru -

Вибрация геймпада XboxOne для Unity3d

Вибрация геймпада XboxOne для Unity3d В Unity3d есть универсальная поддержка контроллеров через класс Input. После предварительной настройки осей и кнопок, можно добиться сносной работы любого контроллера. К сожалению, при этом будет отсутствовать поддержка вибрации для геймпадов Xbox 360 и Xbox One. Можно исправить эту ситуацию воспользовавшись, например, плагином XInputDotNet [1], но как оказалось, этот плагин не готов для использования в приложениях Windows Store. Поэтому был сделан небольшой враппер XInput который работает в этом варианте.

Создание плагинов для Unity3d достаточно простой процесс. Для этого необходимо создать проект Class Library в Visual Studio 2013, и не забыть переключить в режим использования .NET Framework 3.5
Вибрация геймпада XboxOne для Unity3d

Далее полученную сборку нужно перенести в каталог Assets, и все классы которые вы реализовали станут доступны из Unity. Удобно так же разместить Solution вашего плагина прямо в каталоге в котором находится проект Unity, и указать Output в каталог Assets:
Вибрация геймпада XboxOne для Unity3d

Для того чтобы этот же плагин работал и в режиме приложений Windows Store, в этом же Solution для нашего плагина создаем проект Store Apps/Class Library:

Вибрация геймпада XboxOne для Unity3d

Код плагина можно использовать тот же, в нашем случае даже не придется делать какие-то conditional условия компиляции, исходные файлы для обеих сборок будут одинаковыми и их можно просто залинковать:
Вибрация геймпада XboxOne для Unity3d
Вариант сборки для Windows Store должен размещаться в каталоге Assets/Plugins/Metro:
Вибрация геймпада XboxOne для Unity3d

Само собой разумеется, имя файла плагина для Windows Store должно совпадать с вариантом для Desktop:
Вибрация геймпада XboxOne для Unity3d

Если все сделано корректно, то тогда Unity при создании варианта приложения для Windows Store «подхватит» замену и окончательная сборка приложения в Visual Studio 2013 пройдет корректно.

Сам плагин прост, и по сути является оберткой над функциями XInput:

        [DllImport("xinput1_4.dll")]
        public static extern int XInputGetState
        (
            int dwUserIndex,  
            ref XInputState pState        
        );

        [DllImport("xinput1_4.dll")]
        public static extern int XInputSetState
        (
            int dwUserIndex,  
            ref XInputVibration pVibration    
        );

Все необходимые структуры подготовлены в сопутствующих классах.

Использование плагина для работы с геймпадом

Как уже было сказано, теперь достаточно разместить сборки плагина в соответствующие каталоги /Assets и /Assets/Metro, после чего функции будут доступны при разработке приложения Unity:
Вибрация геймпада XboxOne для Unity3d
Обычно работа с геймпадами осуществляется в режиме запросов (polling) перед отрисовкой каждого кадра. В Unity у каждого объекта есть метод void Update() в котором можно будет опрашивать состояние кнопок и осей и в зависимости от них вносить изменения в поведение игровых объектов.
В качестве примера можно посмотреть на готовый проект Unity который работает как в десктоп-режиме, так и может создать приложение для Windows Store. Это вертолет [2] который летает среди гор. Скорее конечно не летает, а «плавает» так как полная реализация физики вертолета выходит за рамки этой статьи.
Вибрация геймпада XboxOne для Unity3d
При этом он реагирует на ввод с геймпада с всех осей, DPAD и по нажатию на правый курок «газует» разгоняясь вперед и раскручивая основной и хвостовой винты:

void Update () 
{
        XInputWrapper.XInputState st=new XInputWrapper.XInputState();

        XInputWrapper.XInput.XInputGetState(0, ref st);

        if (Mathf.Abs(st.Gamepad.sThumbLY) > XInputWrapper.XInputConstants.XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
        {
            float rotX_norm = (float)((float)st.Gamepad.sThumbLY / 32767.0f);

            transform.RotateAround(transform.position, transform.right, rotX_norm * 20.0f*-1.0f * Time.deltaTime);

        }
}

С объектом вертолета ассоциирован Box Collider и RigidBody. Это дает возможность получать уведомления о коллизиях с другими обьектами, и собственно тут реализуется вибрация. Как только вертолет сталкивается с горой, геймпад начинает вибрировать треть секунды:

    void OnTriggerEnter(Collider other)
    {
        if (!vibrating)
        {

            XInputWrapper.XInputVibration vibr = new XInputWrapper.XInputVibration();

            vibr.LeftMotorSpeed = 65535 / 3;
            vibr.RightMotorSpeed = 65535 / 3;

            XInputWrapper.XInput.XInputSetState(0, ref vibr);

            vibrationStartTime = Time.time;

            vibrating = true;

        }
    }

Готовый проект для Unity и исходные коды враппера XInput вы можете скачать по адресу http://aka.ms/unitygmsmpl [3] если же вам нужен только враппер, то вы можете скачать архив только с сборками по адресу http://aka.ms/xinputwrapper [4]. Их кстати можно использовать не только в проектах Unity но и для десктоп-приложений и приложений магазина Windows, в том числе написанных на языке HTML5/Javascript.

Полезные ссылки

Автор: dmandreev

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/windows-store/74271

Ссылки в тексте:

[1] XInputDotNet: https://github.com/speps/XInputDotNet

[2] вертолет: http://tf3dm.com/3d-model/uh60-helicopter-47194.html

[3] http://aka.ms/unitygmsmpl: http://aka.ms/unitygmsmpl

[4] http://aka.ms/xinputwrapper: http://aka.ms/xinputwrapper

[5] Попробовать Azure: http://l.techdays.ru/go/azuretrial

[6] Центр разработки Microsoft Azure (azurehub.ru): http://www.azurehub.ru/

[7] Twitter.com/windowsazure_ru: http://www.twitter.com/windowsazure_ru

[8] Сообщество Microsoft Azure на Facebook: http://www.facebook.com/groups/azurerus/

[9] Изучить курсы: http://l.techdays.ru/go/mva

[10] Основы построения доменной сети. Часть 2 : http://www.microsoftvirtualacademy.com/training-courses/building-domain-network-fundamentals-part2-rus

[11] Введение в программирование игр на Unity: http://www.microsoftvirtualacademy.com/training-courses/introduction-to-games-programming-on-unity-rus

[12] Бизнес и облако: лучшие практики решений: http://www.microsoftvirtualacademy.com/training-courses/business-and-cloud-best-practices-solutions-rus

[13] Гибридное облако Microsoft: Руководство по типовым решениям: http://www.microsoftvirtualacademy.com/training-courses/the-microsoft-hybrid-cloud-best-practices-guidance-rus

[14] Введение в графическую библиотеку Win2D: http://www.microsoftvirtualacademy.com/training-courses/introduction-to-the-graphics-library-win2d-rus

[15] Загрузить: http://l.techdays.ru/go/getvs

[16] Стать разработчиком: http://l.techdays.ru/go/winstart

[17] Источник: http://habrahabr.ru/post/243021/