company_banner

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

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

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


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


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



    Код плагина можно использовать тот же, в нашем случае даже не придется делать какие-то conditional условия компиляции, исходные файлы для обеих сборок будут одинаковыми и их можно просто залинковать:

    Вариант сборки для Windows Store должен размещаться в каталоге Assets/Plugins/Metro:


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


    Если все сделано корректно, то тогда 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:

    Обычно работа с геймпадами осуществляется в режиме запросов (polling) перед отрисовкой каждого кадра. В Unity у каждого объекта есть метод void Update() в котором можно будет опрашивать состояние кнопок и осей и в зависимости от них вносить изменения в поведение игровых объектов.
    В качестве примера можно посмотреть на готовый проект Unity который работает как в десктоп-режиме, так и может создать приложение для Windows Store. Это вертолет который летает среди гор. Скорее конечно не летает, а «плавает» так как полная реализация физики вертолета выходит за рамки этой статьи.

    При этом он реагирует на ввод с геймпада с всех осей, 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 если же вам нужен только враппер, то вы можете скачать архив только с сборками по адресу http://aka.ms/xinputwrapper. Их кстати можно использовать не только в проектах Unity но и для десктоп-приложений и приложений магазина Windows, в том числе написанных на языке HTML5/Javascript.

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


    Microsoft 315,73
    Microsoft — мировой лидер в области ПО и ИТ-услуг
    Поделиться публикацией
    Комментарии 3
      0
      Можете сказать насколько охото принимают инди игры xbox store? Я нашел конечно информацию про Independent Developers Publishing Program for Xbox One но так и не понял, какие в действительности требования.
        0
        Как таковых требований нет, есть несколько ключевых тезисов, которыми стоит руководствоваться при номинации игры.
        1) Крутая игра, ценная для платформы
        2) Профессионализм команды разработки
        3) Наличие юридического лица

        Ну а так как требований нет, то и гарантий тоже нет. =)
        0
        Может и не по теме, но где бы почитать про алгоритм тестирования Unity-приложения на Xbox360? Что нашёл, так то, что нужна специальная консоль, стоимостью в десятки тысяч долларов.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое