我不是一个很好的C++程序员,我正在寻求帮助在我的虚幻引擎3游戏中实现蒸汽输入(是的,那是3而不是4)。我在Epic (虚幻3)和Valve ( Steamworks)的NDA下,所以我不认为我能够复制他们的任何代码,但我将在这里尽我最大的努力来描述正在发生的事情。如果你知道有更好的地方我可以问这些问题,请让我知道。如果你认为我违反了保密协议,请也让我知道,这样我就可以删除违规的部分。
我有一个可以使用鼠标和键盘的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输入动作集。
那么我可以检查什么来找出我的游戏崩溃的原因呢?为了追踪这件事,我还需要找出什么?有没有别的地方可以让我更幸运地问到这个问题?
感谢您在这方面给我的任何指导。
发布于 2019-12-03 02:01:19
我找到问题了。我在UnrealScript类的cpptext区域中声明了所有的InputActionSetHandle_t变量。我不该这么做的。我将所有这些变量声明为UnrealScript qword,它们可以很好地保存由Steam API返回的C++ uint64句柄。不会再有撞车事故了。
https://stackoverflow.com/questions/59090302
复制相似问题