加载游戏中的内容(资产)的服务。
Roblox 服务器在运行时将所有资产流向客户端:工作区中的对象、网格资产、材质资产等。 像网格视图数据、材质资产、装计资产等资产都在需要时直接流向客户端。无论是否启用“直播”。
在某些情况下,这种行为不желатель,因为它可能会导致内容在体验中加载的延迟。
ContentProvider 允许您使用 ContentProvider:PreloadAsync() 方法预加资产到体验。 您可能需要显示一个加载屏幕、预加重要资产,然后才能允许玩家进入体验。
预加载最佳实践
- 仅预加载必要资产, 不 是整个工作区。你可能会时不时弹出,但它会减少载入时间并一般不会影响玩家体验。预加载好的资产包括那些用于加载屏幕、UI或开始区的。
- 允许玩家跳过加载屏幕,或者在一定时间后自动跳过它。
代码示例
local ContentProvider = game:GetService("ContentProvider")
local LOGO_ID = "rbxassetid://658743164"
local PAGE_TURN_ID = "rbxassetid://12222076"
local decal = Instance.new("Decal")
decal.Texture = LOGO_ID
local sound = Instance.new("Sound")
sound.SoundId = PAGE_TURN_ID
local assets = { decal, sound }
ContentProvider:PreloadAsync(assets)
print("All assets loaded.")
概要
属性
用于从 ContentProvider 下载资源。
给出需要下载的 ContentProvider 请求队列的物品数。
方法
获取提供的 ContentId 的当前 AssetFetchStatus。
当提供的内容的 Enum.AssetFetchStatus 发生变更时触发的信号。
在所有与给定 Instances 相关的资产加载完毕后。
属性
BaseUrl
用于从 ContentProvider 下载资源。
此 URL 指向 Roblox 的网站,从该网站下载并从 AppSettings.xml 文件中拖出,位于版本匹配文件夹中。
您可以使用 ContentProvider:SetBaseUrl() 函数在命令栏中覆盖此属性;然而,这不是推荐的,可能会导致资产加载问题。
RequestQueueSize
给出需要下载的 ContentProvider 请求队列的物品数。
当资产首次使用时,客户端的请求队列中添加项目,或 ContentProvider:PreloadAsync() 调用。
开发人员建议不要使用 RequestQueueSize 来创建加载条。这是因为队列大小可以增加和减少随着新资产添加和下载。要显示加载进度的开发人员应该一次加载资产 (见下面的示例)。
代码示例
local ContentProvider = game:GetService("ContentProvider")
local Players = game:GetService("Players")
local localPlayer = Players.LocalPlayer
local playerGui = localPlayer:WaitForChild("PlayerGui")
local screenGui = Instance.new("ScreenGui")
screenGui.Parent = playerGui
-- create a basic loading bar
local frame = Instance.new("Frame")
frame.Size = UDim2.new(0.5, 0, 0.1, 0)
frame.Position = UDim2.new(0.5, 0, 0.5, 0)
frame.AnchorPoint = Vector2.new(0.5, 0.5)
frame.Parent = screenGui
local bar = Instance.new("Frame")
bar.Size = UDim2.new(0, 0, 1, 0)
bar.Position = UDim2.new(0, 0, 0, 0)
bar.BackgroundColor3 = Color3.new(0, 0, 1)
bar.Parent = frame
local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://9120386436"
local sound2 = Instance.new("Sound")
sound2.SoundId = "rbxassetid://9120385974"
local assets = {
sound,
sound2,
}
task.wait(3)
for i = 1, #assets do
local asset = assets[i]
ContentProvider:PreloadAsync({ asset }) -- 1 at a time, yields
local progress = i / #assets
bar.Size = UDim2.new(progress, 0, 1, 0)
end
print("loading done")
方法
GetAssetFetchStatus
获取提供的当前 Enum.AssetFetchStatus 的 contentId。使用 GetAssetFetchStatusChangedSignal() 来听取此值的更改。
参数
获取状态的内容的 ID。
返回
代码示例
local ContentProvider = game:GetService("ContentProvider")
-- An example asset to load
local ASSET_ID = "rbxassetid://9120386436"
local exampleAsset = Instance.new("Sound")
exampleAsset.SoundId = ASSET_ID
-- Output the current AssetFetchStatus of the asset
local initialAssetFetchStatus = ContentProvider:GetAssetFetchStatus(ASSET_ID)
print("Initial AssetFetchStatus:", initialAssetFetchStatus)
-- Listen for updates
local assetFetchStatusChangedSignal = ContentProvider:GetAssetFetchStatusChangedSignal(ASSET_ID)
local function onAssetFetchStatusChanged(newAssetFetchStatus: Enum.AssetFetchStatus)
print(`New AssetFetchStatus: {newAssetFetchStatus}`)
end
assetFetchStatusChangedSignal:Connect(onAssetFetchStatusChanged)
-- Trigger the asset to preload
local function onAssetRequestComplete(contentId: string, assetFetchStatus: Enum.AssetFetchStatus)
print(`Preload status {contentId}: {assetFetchStatus.Name}`)
end
ContentProvider:PreloadAsync({ exampleAsset }, onAssetRequestComplete)
GetAssetFetchStatusChangedSignal
一旦提供的内容的 Enum.AssetFetchStatus 发生变更,就会触发此信号。使用类型为 Enum.AssetFetchStatus 的回调连接到此信号。这对于可能自动更新的资产非常有用。
参数
返回
代码示例
local ContentProvider = game:GetService("ContentProvider")
-- An example asset to load
local ASSET_ID = "rbxassetid://9120386436"
local exampleAsset = Instance.new("Sound")
exampleAsset.SoundId = ASSET_ID
-- Output the current AssetFetchStatus of the asset
local initialAssetFetchStatus = ContentProvider:GetAssetFetchStatus(ASSET_ID)
print("Initial AssetFetchStatus:", initialAssetFetchStatus)
-- Listen for updates
local assetFetchStatusChangedSignal = ContentProvider:GetAssetFetchStatusChangedSignal(ASSET_ID)
local function onAssetFetchStatusChanged(newAssetFetchStatus: Enum.AssetFetchStatus)
print(`New AssetFetchStatus: {newAssetFetchStatus}`)
end
assetFetchStatusChangedSignal:Connect(onAssetFetchStatusChanged)
-- Trigger the asset to preload
local function onAssetRequestComplete(contentId: string, assetFetchStatus: Enum.AssetFetchStatus)
print(`Preload status {contentId}: {assetFetchStatus.Name}`)
end
ContentProvider:PreloadAsync({ exampleAsset }, onAssetRequestComplete)
UnregisterDefaultEncryptionKey
返回
UnregisterEncryptedAsset
参数
返回
PreloadAsync
在给定的 Instances 中加载的所有资产之前暂停脚本,而不使用内容。这可以用来暂停脚本,不使用内容直到确定内容已加载到体验。
调用时,引擎为列表中的每个项素材找到链接到内容的相应链接。 对于任何具有 Instances 的资产,其中包含属性定义链接到内容的素材接,例如 Decal 或 Sound
此方法还可以接受一个列表的内容 ID 字符串,但这些字符串必须与 图像 资产对应。尝试通过使用其内容 ID 字符串尝试加载非图像资产将会导致失败。
如果任何资产无法加载,错误消息会出现在输出中。方法本身不会发生错误,它将继续执行直到它已处理每个请求实例或资产ID。
参数
一个阵列或内容 ID 字符串(对于图像) 的实例或内加载。
每个资产请求完成时调用的函数。返回 content 字符串和素材的最终 Enum.AssetFetchStatus 。
返回
代码示例
local ContentProvider = game:GetService("ContentProvider")
local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://9120386436"
local decal = Instance.new("Decal")
decal.Texture = "rbxassetid://5447528495"
local assets = {
decal,
sound,
}
-- This will be hit as each asset resolves
local callback = function(assetId, assetFetchStatus)
print("PreloadAsync() resolved asset ID:", assetId)
print("PreloadAsync() final AssetFetchStatus:", assetFetchStatus)
end
-- Preload the content and time it
local startTime = os.clock()
ContentProvider:PreloadAsync(assets, callback)
local deltaTime = os.clock() - startTime
print(("Preloading complete, took %.2f seconds"):format(deltaTime))