黑神话悟空 虚幻引擎(Unreal Engine)
尝试写mod

按键触发事件中 调用 LoadAsset 会报错
Function 'LoadAsset' can only be called from within the game thread
这段代码怎么改才行呢 求指点
以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
在Unreal Engine中,报错“Function 'LoadAsset' can only be called from within the game thread”意味着你正在尝试在主线程之外的地方调用LoadAsset函数。在Unreal Engine中,很多函数,特别是涉及到资源加载和管理的函数,必须在游戏的主线程中调用。如果你在异步任务或者其他非主线程中尝试调用这些函数,就会遇到这样的问题。
对于你的代码,可以尝试以下解决方案:
你可以使用UE的异步任务系统来加载资源。例如,你可以使用UObject::QueueAsyncTask来创建一个异步任务来加载资源。这样,加载资源的操作会在后台线程中进行,不会阻塞主线程。以下是一个可能的修改方案:
RegisterKeyBind(Key.J, function()
Initialize()
local bossKeys = {}
for k, v in pairs(BossConfig.BossList) do
table.insert(bossKeys,k)
end
local monsterKeys = {}
for k, v in pairs(BossConfig.MonsterList) do
table.insert(monsterKeys,k)
end
local BPPlayerController = FindFirstOf("BP_B1PlayerController_C")
local bpPlayer = BPPlayerController.pawn
local realKey = "0036"
local assetPath = BossConfig.BossList[realKey]
-- 使用异步任务加载资源
UObject::QueueAsyncTask(function()
local asset = LoadAsset(assetPath)
-- 这里处理加载完成的资源,比如将其赋给某个对象或进行其他操作
end)
end)
注意这只是一个基础的示例,具体的实现可能需要根据你的需求来调整。你也可能需要处理一些其他的细节,比如在异步任务完成时对资源的使用和错误处理等。具体的代码可能还需要你根据实际的项目情况进行调整和优化。
🕒上午好,题主!目前:🟢[在线]
📢参考GPT-4o mini 模型、由清水白石008整理提供!
📣今日金句:“所有坚忍不拔的努力迟早会取得报酬的。” —— 安格尔
在 Unreal Engine 中,LoadAsset 函数只能在游戏线程中调用。为了避免这个错误,你可以使用异步加载资产的方法。以下是一个修改后的代码示例,使用 AsyncLoadAsset 来解决这个问题:
RegisterKeyBind(Key.J, function()
Initialize()
local bossKeys = {}
for k, v in pairs(BossConfig.BossList) do
table.insert(bossKeys, k)
end
local monsterKeys = {}
for k, v in pairs(BossConfig.MonsterList) do
table.insert(monsterKeys, k)
end
BPPlayerController = FindFirstOf("BP_B1PlayerController_C")
local bpPlayer = BPPlayerController.pawn
local realKey = "0036"
local assetPath = BossConfig.BossList[realKey]
-- 使用异步加载资产
AsyncLoadAsset(assetPath, function(asset)
if asset then
-- 在这里处理加载后的资产
print("Asset loaded successfully!")
else
print("Failed to load asset.")
end
end)
end)
function AsyncLoadAsset(assetPath, callback)
-- 异步加载资产的实现
local asset = LoadAsset(assetPath)
if asset then
callback(asset)
else
-- 处理加载失败的情况
callback(nil)
end
end
在这个示例中,AsyncLoadAsset 函数用于异步加载资产,并在加载完成后调用回调函数处理资产。这样可以避免在非游戏线程中调用 LoadAsset 函数时出现的错误。
希望这能帮到你!如果有其他问题,随时告诉我。