【发布时间】:2020-03-24 04:42:28
【问题描述】:
我不是一个 C++ 程序员,我正在寻求帮助,将 Steam 输入应用到我的虚幻引擎 3 游戏(是的,那是 3 而不是 4)。我对 Epic(对于 Unreal 3)和 Valve(对于 Steamworks)都处于 NDA 之下,所以我认为我无法复制他们的任何代码,但我会尽我所能在这里描述什么是继续。如果你知道更好的地方我可以问这些问题,请告诉我。如果您认为我违反了 NDA,请也告诉我,以便我删除违规部分。
我有一个可以使用鼠标和键盘的 UE3 游戏。 Steam 输入是 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(),据我所知是虚幻3的垃圾的一部分收集系统。
我不知道如何解决这个问题,我只是在尝试一些东西。我记录了分配的句柄,并尝试手动设置这些句柄:
void URPGTacSteamInput::SetActionSetHandles()
{
IsometricSetHandle = 1;
WorldMapSetHandle = 2;
SquadMenuSetHandle = 3;
BattleSetupSetHandle = 4;
InBattleSetHandle = 5;
MenuSetHandle = 6;
}
但运行该功能后游戏仍然崩溃。所以我尝试从中删除更多内容。
void URPGTacSteamInput::SetActionSetHandles()
{
}
我可以运行该功能,游戏运行得很好,只是我没有任何可以切换到的 Steam 输入操作集。
那么我可以通过什么检查来找出我的游戏崩溃的原因?为了追踪这个问题,我还需要找出什么?还有其他地方我可能会更幸运地询问这个问题吗?
感谢您对此提供的任何指导。
【问题讨论】:
-
我从未使用过 Steam 或 UE,但您的例外是,您正在访问您没有权限的部分内存(缓冲区溢出、内存损坏)。我的一般提示是,如果我遇到这个问题,我会设置调试版本(不知道是否可以使用 UE/SteamAPI),点击断点并缩小导致此异常的确切行 - 它会是可能是一些指针,它是 nullptr 而不是有意义的东西。然后你可以追溯问题,为什么它是 nullptr。
标签: c++ unreal-engine4 steam unreal-development-kit steamworks-api