載入遊戲中的內容 (資產) 。
Roblox 服務器在執行時將所有資產傳送至客戶端:在工作區中的對象、網格資產、材質資產等。 像網格視圖資料、材質資產、裝飾資產等,在需要時會流入客戶端。 如果啟用「流媒體」,則會發生流媒體。
在某些情況下,此行為不是所需的,因為它可能會導致內容載入到體驗前發生延遲。
ContentProvider 可以將資產預加載到體驗使用 ContentProvider:PreloadAsync() 方法。你可能想要顯示載入屏幕、預加載重要資產,然後才能允許玩家進入體驗。
最佳預加載方法
- 只有預加載必要資產, 不 是整個 Workspace。你可能會時常出現 pop-in,但這會減少載入時間,並且一般不會影響玩家體驗。預加載資產包括載入屏幕、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 的當前 Empty.AssetFetchStatus。
提供內容的 Enum.AssetFetchStatus 變更時發射的信號。
在所有與指定 Instances 相關的資產載入完畢之前。
屬性
BaseUrl
用於從 ContentProvider 下載資產。
這個網址指向一個 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))