Игра Unreal Engine 3 вылетает из-за ввода Steam

Я не особо разбираюсь в программировании на C ++, и мне нужна помощь с внедрением Steam Input в мою игру Unreal Engine 3 (да, это 3, а не 4). У меня есть соглашения о неразглашении как с Epic (для Unreal 3), так и с Valve (для Steamworks), поэтому я не думаю, что смогу скопировать какой-либо их код, но я сделаю все возможное, чтобы описать, что продолжается. И если вы знаете, где я могу задать эти вопросы получше, пожалуйста, дайте мне знать. И если вы считаете, что я нарушаю соглашение о неразглашении, сообщите мне и об этом, чтобы я мог удалить оскорбительные части.

У меня есть игра UE3, которая работает с мышью и клавиатурой. Steam Input, который является частью Steamworks SDK, позволяет получать данные с любого контроллера. В основном, ваш контроллер, ваши действия (например, «стрелять» или «идти вперед») и наборы действий (схемы управления, которые могут меняться в зависимости от состояния игры, например «в меню», «ходьба» или «вождение»). всем назначаются уникальные дескрипторы UINT64. Я нахожусь на стадии, когда я использую предоставленные функции для назначения дескрипторов, и это приводит к сбою моей игры.

У меня есть класс, содержащий эти переменные ...

    // typedef uint64 InputActionSetHandle_t;
    InputActionSetHandle_t IsometricSetHandle;
    InputActionSetHandle_t WorldMapSetHandle;
    InputActionSetHandle_t SquadMenuSetHandle;
    InputActionSetHandle_t BattleSetupSetHandle;
    InputActionSetHandle_t InBattleSetHandle;
    InputActionSetHandle_t MenuSetHandle;

Я создаю объект, а затем пытаюсь установить его переменные, вызывая эту функцию.

void URPGTacSteamInput::SetActionSetHandles()
{
    IsometricSetHandle = SteamInput()->GetActionSetHandle( "Isometric" );
    WorldMapSetHandle = SteamInput()->GetActionSetHandle( "WorldMap" );
    SquadMenuSetHandle = SteamInput()->GetActionSetHandle( "SquadMenu" );
    BattleSetupSetHandle = SteamInput()->GetActionSetHandle( "BattleSetup" );
    InBattleSetHandle = SteamInput()->GetActionSetHandle( "InBattle" );
    MenuSetHandle = SteamInput()->GetActionSetHandle( "Menu" );
}

Функция завершается, но позже игра вылетает с ошибкой «Необработанное исключение ... Местоположение чтения нарушения доступа ...» Местоположение стека вызовов - FArchiveRealtimeGC :: PerformReachabilityAnalysis (), который, как я понимаю, является частью системы сборки мусора Unreal 3.

Я не знаю, как решить эту проблему, и я просто пробовал разные вещи. Я зарегистрировал назначенные дескрипторы и попытался установить эти дескрипторы вручную:

void URPGTacSteamInput::SetActionSetHandles()
{
    IsometricSetHandle = 1;
    WorldMapSetHandle = 2;
    SquadMenuSetHandle = 3;
    BattleSetupSetHandle = 4;
    InBattleSetHandle = 5;
    MenuSetHandle = 6;
}

Но игра все равно вылетает после запуска этой функции. Поэтому я попытался удалить из него больше.

void URPGTacSteamInput::SetActionSetHandles()
{
}

И я могу запустить эту функцию, и игра продвигается нормально, за исключением того, что у меня нет никаких наборов действий Steam Input, на которые я мог бы переключиться.

Итак, что я могу проверить, чтобы узнать, почему моя игра вылетает? Что еще мне нужно выяснить, чтобы отследить это? Могу ли я еще где-нибудь спросить об этой проблеме?

Спасибо за любые советы, которые вы можете мне дать по этому поводу.


person Nathaniel    schedule 28.11.2019    source источник
comment
Я никогда не работал со Steam или UE, но ваше исключение говорит, что вы обращаетесь к той части памяти, где у вас нет разрешений (переполнение буфера, повреждение памяти). Мой общий намек заключается в том, что если бы у меня была эта проблема, я бы установил версию отладки (не знаю, возможно ли это с UE / SteamAPI), нажал бы точки останова и сузил бы точную строку, которая вызывает это исключение - это было бы возможно, какой-то указатель, который имеет значение nullptr, а не что-то значимое. Тогда вы сможете отследить проблему, почему ее nullptr.   -  person borievka    schedule 28.11.2019


Ответы (1)


Я нашел проблему. Я объявлял все свои переменные InputActionSetHandle_t в области cpptext моих классов UnrealScript. Я не должен этого делать. Вместо этого я объявил все эти переменные как qwords UnrealScript, и они отлично подходят для хранения дескрипторов uint64 C ++, которые отправляются обратно через Steam API. И больше никаких сбоев.

person Nathaniel    schedule 02.12.2019
comment
Спасибо за ответы, я решаю вопросы, связанные с Steam API - person Tài Lê; 11.01.2021