在尝试制作游戏时,我试图向其中添加游戏加载时播放的音乐。不幸的是,由于某种原因,在实际游戏中它经常拒绝加载,当我使用
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 年左右以来,自动重试根本就不存在了。
还应该说,这不是通常会出现的标准“无法下载资源”错误;游戏没有提供任何实际错误,如果不是上面的代码,我不会知道它无法加载,因为它永远不会玩。我不知道为什么这无法预加载,或者如何我可以加载它(或在没有此类循环的情况下重试加载),因此无法在我的游戏中播放音乐。 其他注意事项;
ReplicatedStorage
,但被:Clone()
取出并放入Workspace
中的文件夹中。我进行了多次检查以确保它不会返回 nil
,并且该实例确实存在。LocalScript
放入
StarterPlayerScripts
。即使我将脚本移动到像ReplicatedFirst
这样的地方,这种情况仍然会发生。提到一个潜在的解决方案,但事实证明这总体上是徒劳的,因为它只是继续失败。 我已经尝试了我能想到的一切,包括:
以编程方式创建、克隆和更改 Sound 实例的 ID 以加载资源;
ReplicatedStorage
Workspace
;尝试迭代ContentProvider:PreloadAsync()
理想情况下,这应该包含在
LocalScript
中,因为我希望这是针对每个玩家的,而不是整个服务器。
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