【问题标题】:Unreal Engine 3 game crashes with Steam Input虚幻引擎 3 游戏因 Steam 输入而崩溃
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 感谢您的回答,我正在解决与 Steam API 相关的问题
猜你喜欢
  • 2020-07-24
  • 2017-09-20
  • 2015-06-25
  • 2020-09-01
  • 1970-01-01
  • 2017-09-10
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多