Unreal Engine 3 场游戏因 Steam 输入而崩溃

Unreal Engine 3 game crashes with Steam Input

我不是 C++ 程序员,我正在寻求有关在我的 Unreal Engine 3 游戏(是的,是 3 而不是 4)中实施 Steam Input 的帮助。我与 Epic(对于 Unreal 3)和 Valve(对于 Steamworks)都签订了保密协议,所以我认为我无法复制他们的任何代码,但我会在这里尽我所能来描述什么是继续。如果你知道我可以问这些问题的更好的地方,请告诉我。如果您认为我违反了保密协议,也请告诉我,以便我删除违规部分。

我有一款支持鼠标和键盘的 UE3 游戏。 Steam 输入是 Steamworks SDK 的一部分,它提供了一种从任何控制器获取输入的方法。基本上,您的控制器、您的动作(例如 "shoot" 或 "walk forward")和动作集(可以根据游戏状态改变的控制方案,例如 "in menu," "walking," 或"driving") 都被分配了唯一的 UINT64 句柄。我正处于使用提供的函数分配句柄的阶段,这让我的游戏崩溃了。

我有一个包含这些变量的 class...

    // 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" );
}

函数完成,但稍后游戏崩溃,报错"Unhandled exception ... Access violation reading location ..." Call stack location is FArchiveRealtimeGC::PerformReachabilityAnalysis(),据我所知这是Unreal 3垃圾回收系统的一部分。

我不确定如何解决这个问题,我一直在尝试一些东西。我记录了分配的句柄,并尝试手动设置这些句柄:

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

但是在 运行启用该功能后游戏仍然崩溃。所以我尝试从中删除更多内容。

void URPGTacSteamInput::SetActionSetHandles()
{
}

而且我可以 运行 这个功能,游戏进行得很好,只是我没有任何可以切换到的 Steam 输入操作集。

那么我可以检查什么来找出我的游戏崩溃的原因?我还需要找出什么才能追踪到这个?有没有其他地方我可能更幸运地询问这个问题?

感谢您在这方面给我的任何指导。

我发现了问题。我在 UnrealScript 类 的 cpptext 区域中声明了所有 InputActionSetHandle_t 变量。我不应该那样做。我将所有这些变量声明为 UnrealScript qwords,它们可以很好地保存由 Steam API 发回的 C++ uint64 句柄。不再崩溃。