ContentProvider

顯示已棄用項目

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

無法建立
服務
未複製

載入遊戲中的內容 (資產) 。

Roblox 服務器在執行時將所有資產傳送至客戶端:在工作區中的對象、網格資產、材質資產等。 像網格視圖資料、材質資產、裝飾資產等,在需要時會流入客戶端。 如果啟用「流媒體」,則會發生流媒體。

在某些情況下,此行為不是所需的,因為它可能會導致內容載入到體驗前發生延遲。

ContentProvider 可以將資產預加載到體驗使用 ContentProvider:PreloadAsync() 方法。你可能想要顯示載入屏幕、預加載重要資產,然後才能允許玩家進入體驗。

最佳預加載方法

  • 只有預加載必要資產, 是整個 Workspace。你可能會時常出現 pop-in,但這會減少載入時間,並且一般不會影響玩家體驗。預加載資產包括載入屏幕、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 下載資產。

這個網址指向一個 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.AssetFetchStatus 的當前 contentId。使用 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