Unreal Engine C++中初始化SteamAPI崩溃问题求助
在Unreal Engine自定义GameInstance中初始化SteamAPI崩溃的解决方法
问题概述
在自定义UCPP_GameInstance_Base类的Init()函数中添加SteamAPI初始化代码后,游戏运行即崩溃,崩溃触发点为SteamAPI_Init()调用。编译正常且可访问所有SteamAPI函数,错误栈指向steam_api64.dll的延迟加载失败:
KERNELBASE UnrealEditor_MyGame!__delayLoadHelper2()
[D:\a_work\1\s\src\vctools\delayimp\delayhlp.cpp:375]
UnrealEditor_MyGame!_tailMerge_steam_api64_dll()
UnrealEditor_Engine UnrealEditor_UnrealEd UnrealEditor_UnrealEd
UnrealEditor_UnrealEd UnrealEditor_UnrealEd UnrealEditor_UnrealEd
UnrealEditor_UnrealEd UnrealEditor_UnrealEd UnrealEditor_UnrealEd
UnrealEditor UnrealEditor UnrealEditor UnrealEditor UnrealEditor
UnrealEditor kernel32 ntdll
使用的初始化代码:
void UCPP_GameInstance_Base::Init() { Super::Init(); SteamAPI_RestartAppIfNecessary(MyAppID); if (SteamAPI_Init()) { SteamUtils()->SetGameLauncherMode(true); } }
解决步骤
1. 确认Steam DLL部署与链接配置
- 崩溃源于延迟加载
steam_api64.dll失败,需确保:- 从Steam SDK的
redistributable_bin/win64目录复制steam_api64.dll,放到项目的Binaries/Win64文件夹下;打包后的游戏根目录也必须包含该文件。 - 检查工程链接器设置,若使用延迟加载,需确保错误处理逻辑正确;更稳妥的方式是将
steam_api64.lib设置为静态链接。
- 从Steam SDK的
2. 调整SteamAPI初始化时机
GameInstance::Init()执行时机过早,引擎环境未完全初始化,易引发冲突。建议将初始化逻辑移至更晚的时机:
- 例如在
UGameModeBase::BeginPlay()中初始化:
void AMyGameMode::BeginPlay() { Super::BeginPlay(); SteamAPI_RestartAppIfNecessary(MyAppID); if (SteamAPI_Init()) { SteamUtils()->SetGameLauncherMode(true); } }
- 同时在游戏退出时补充SteamAPI关闭逻辑,添加到
GameInstance::Shutdown():
void UCPP_GameInstance_Base::Shutdown() { if (SteamAPI_IsSteamRunning()) { SteamAPI_Shutdown(); } Super::Shutdown(); }
3. 验证Steam AppID有效性
- 确保
MyAppID是Steamworks后台注册的有效ID;测试阶段可使用官方测试AppID(如480,对应Steamworks Test App)排查是否为ID错误导致的问题。
4. 检查UE官方Steam插件状态
- 若启用了UE官方Steam插件,插件已封装SteamAPI初始化逻辑,手动重复调用会引发冲突。此时应直接使用插件提供的接口,避免自行调用
SteamAPI_Init()。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

