Roblox Luau - 资源拒绝在游戏中加载,但可以在工作室中使用

问题描述 投票:0回答:1

在尝试制作游戏时,我试图向其中添加游戏加载时播放的音乐。不幸的是,由于某种原因,在实际游戏中它经常拒绝加载,当我使用

ContentProvider:PreloadAsync()
;

时就很明显
local Attempt = true

while Attempt do
    ContentProvider:PreloadAsync({DayTheme},function(assetId,assetFetch)
        print("Got DayTheme with asset ID",assetId)
        if assetFetch == Enum.AssetFetchStatus.None then
            warn("DayTheme returned no valid information, and the engine didn't attempt to load it.")
        elseif assetFetch == Enum.AssetFetchStatus.Failure then
            warn("DayTheme failed to load and was aborted by the engine.")
        elseif assetFetch == Enum.AssetFetchStatus.Loading then return elseif assetFetch == Enum.AssetFetchStatus.TimedOut then
            print("Load timed out, trying again.")
        else
            print("ContentProvider returned OK")
            if not DayTheme.IsLoaded then
                print("Waiting for DayTheme to load")
                local pass = 1
                repeat
                    task.wait(1)
                    pass = pass + 1
                    print(pass)
                until DayTheme.IsLoaded or pass == 10
                if not DayTheme.IsLoaded then warn("DayTheme failed to load") else
                    if not DayTheme.IsPlaying then print("Playing"); DayTheme:Play() end
                end
            else
                if not DayTheme.IsPlaying then print("Playing"); DayTheme:Play() end
            end
            Attempt = false
        end
    end)
    task.wait(3)
end

其中

DayTheme
是声音实例(不是资产 ID),运行此部分要么 1) 打印我为
Enum.AssetFetchStatus.Failure
设置的“DayTheme 加载失败并被引擎中止”警告,要么 2)最终打印出我在
DayTheme.IsLoaded
返回
ContentProvider
后为
Enum.AssetFetchStatus.Success
检查设置的“DayTheme 无法加载”警告。这是在
while
循环中设置的,希望能够重试,因为自 2017 年左右以来,自动重试根本就不存在了。

还应该说,这不是通常会出现的标准“无法下载资源”错误;游戏没有提供任何实际错误,如果不是上面的代码,我不会知道它无法加载,因为它永远不会玩。我不知道为什么这无法预加载,或者如何我可以加载它(或在没有此类循环的情况下重试加载),因此无法在我的游戏中播放音乐。 其他注意事项;

    我正在播放的音频源自
  1. ReplicatedStorage,但被
    :Clone()
    取出并放入
    Workspace
    中的文件夹中。我进行了多次检查以确保它不会返回
    nil
    ,并且该实例确实存在。
  2. 脚本本身是一个
  3. LocalScript
    放入
    StarterPlayerScripts。即使我将脚本移动到像
    ReplicatedFirst
    这样的地方,这种情况仍然会发生。
  4. 在 Studio 中,声音资源加载完美,没有任何问题
  5. 。在极少数情况下(我最常加载 1/20 次),它会在游戏中加载;否则只有在实际游戏中才会加载失败。
  6. 音频资产归我所有,因此游戏确实有使用它的权限。
  7. 这不是权限问题。
  8. 到目前为止,我发送/发布的这篇文章或类似的帖子没有其他人能够帮助我。 [Roblox DevForum 上的一篇文章](
https://devforum.roblox.com/t/failed-to-load-assets-should-automatically-retry/2037387/4?u=ladyterrene\]

提到一个潜在的解决方案,但事实证明这总体上是徒劳的,因为它只是继续失败。 我已经尝试了我能想到的一切,包括:

以编程方式创建、克隆和更改 Sound 实例的 ID 以加载资源;
  • 更改游戏中资产的位置(例如,将其从
  • ReplicatedStorage
  • 移至
    Workspace
    尝试迭代
  • ContentProvider:PreloadAsync()
  • (如上所示);
    
    
  • 但无论我尝试什么,以某种方式、形状或形式,资产都会加载失败,并最终达到我自己的自定义超时限制。

理想情况下,这应该包含在

LocalScript

中,因为我希望这是针对每个玩家的,而不是整个服务器。

    

lua roblox luau lua-5.1 roblox-studio
1个回答
0
投票
https://devforum.roblox.com/t/isloaded-is-intermittently-returning-false-for-successively-loaded-audio/2809379

https://create.roblox.com/docs/reference/engine/classes/ContentProvider#RequestQueueSize 在我链接的最后一个链接中,内容如下:

建议开发者不要使用RequestQueueSize来创建加载条。这是因为随着新资产的添加和下载,队列大小可能会随着时间的推移而增加或减少。希望显示加载进度的开发人员应该一次加载一个资源(请参见下面的示例)。

这意味着如有必要,某些资产可能会重新添加到队列中,这意味着您的回调代码可能会在内部运行两次,这可能是导致错误的可能原因。

第一个链接与一个错误报告相关,该报告标记了 .IsLoaded 的不可靠性,后续该问题尚未修复。

给您一个潜在的解决方案是,不使用回调函数,而是从队列中获取资产并间歇性检查其状态,如下所示:

local retryLimit = 12 local retryCount = 0 repeat task.wait(2) retryCount+= 1 until ContentProvider:GetAssetFetchStatus(DayTheme) == Enum.AssetFetchStatus.Success or retryCount > retryLimit

© www.soinside.com 2019 - 2024. All rights reserved.