ContentProvider

显示已弃用

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

无法创建
服务
未复制

加载游戏中的内容(资产)的服务。

Roblox 服务器在运行时将所有资产流向客户端:工作区中的对象、网格资产、材质资产等。 像网格视图数据、材质资产、装计资产等资产都在需要时直接流向客户端。无论是否启用“直播”。

在某些情况下,这种行为不желатель,因为它可能会导致内容在体验中加载的延迟。

ContentProvider 允许您使用 ContentProvider:PreloadAsync() 方法预加资产到体验。 您可能需要显示一个加载屏幕、预加重要资产,然后才能允许玩家进入体验。

预加载最佳实践

  • 仅预加载必要资产, 是整个工作区。你可能会时不时弹出,但它会减少载入时间并一般不会影响玩家体验。预加载好的资产包括那些用于加载屏幕、UI或开始区的。
  • 允许玩家跳过加载屏幕,或者在一定时间后自动跳过它。

代码示例

ContentProvider

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.")

概要

属性

方法

属性

BaseUrl

只读
未复制
读取并联

用于从 ContentProvider 下载资源。

此 URL 指向 Roblox 的网站,从该网站下载并从 AppSettings.xml 文件中拖出,位于版本匹配文件夹中。

您可以使用 ContentProvider:SetBaseUrl() 函数在命令栏中覆盖此属性;然而,这不是推荐的,可能会导致资产加载问题。

RequestQueueSize

只读
未复制
读取并联

给出需要下载的 ContentProvider 请求队列的物品数。

当资产首次使用时,客户端的请求队列中添加项目,或 ContentProvider:PreloadAsync() 调用。

开发人员建议不要使用 RequestQueueSize 来创建加载条。这是因为队列大小可以增加和减少随着新资产添加和下载。要显示加载进度的开发人员应该一次加载资产 (见下面的示例)。

代码示例

ContentProvider Loading Bar

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.AssetFetchStatuscontentId。使用 GetAssetFetchStatusChangedSignal() 来听取此值的更改。

参数

contentId: ContentId

获取状态的内容的 ID。


返回

代码示例

Monitoring 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)

GetAssetFetchStatusChangedSignal

一旦提供的内容的 Enum.AssetFetchStatus 发生变更,就会触发此信号。使用类型为 Enum.AssetFetchStatus 的回调连接到此信号。这对于可能自动更新的资产非常有用。

参数

contentId: ContentId

返回

代码示例

Monitoring 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)

ListEncryptedAssets


返回

RegisterDefaultEncryptionKey

void

参数

encryptionKey: string

返回

void

RegisterDefaultSessionKey

void

参数

sessionKey: string

返回

void

RegisterEncryptedAsset

void

参数

assetId: ContentId
encryptionKey: string

返回

void

RegisterSessionEncryptedAsset

void

参数

contentId: ContentId
sessionKey: string

返回

void

UnregisterDefaultEncryptionKey

void

返回

void

UnregisterEncryptedAsset

void

参数

assetId: ContentId

返回

void

PreloadAsync

void
暂停

在给定的 Instances 中加载的所有资产之前暂停脚本,而不使用内容。这可以用来暂停脚本,不使用内容直到确定内容已加载到体验。

调用时,引擎为列表中的每个项素材找到链接到内容的相应链接。 对于任何具有 Instances 的资产,其中包含属性定义链接到内容的素材接,例如 DecalSound

此方法还可以接受一个列表的内容 ID 字符串,但这些字符串必须与 图像 资产对应。尝试通过使用其内容 ID 字符串尝试加载非图像资产将会导致失败。

如果任何资产无法加载,错误消息会出现在输出中。方法本身不会发生错误,它将继续执行直到它已处理每个请求实例或资产ID。

参数

contentIdList: Array

一个阵列或内容 ID 字符串(对于图像) 的实例或内加载。

callbackFunction: function

每个资产请求完成时调用的函数。返回 content 字符串和素材的最终 Enum.AssetFetchStatus

默认值:"nil"

返回

void

代码示例

Preloading Assets

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))

活动

AssetFetchFailed

参数

assetId: ContentId