ContentProvider
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
บริการที่โหลดเนื้อหา (สินทรัพย์) เข้าสู่เกม
เซิร์ฟเวอร์ Roblox สตรีมทรัพยากรทั้งหมดไปยังไคลเอนต์ในระหว่างการทำงาน: วัตถุในพื้นที่ทำงาน, สินทรัพย์เมช, สินทรัพย์เทกเจอร์ ฯลฯสินทรัพย์เช่นข้อมูลภาพเสมือนจริงเทกเจอร์ลายพิมพ์และเสียงถูกสตรีมตามที่จำเป็นไม่ว่าจะเปิดใช้งานการสตรีม สตรีม หรือไม่
ในบางกรณี พฤติกรรมนี้ไม่พึงประสงค์เนื่องจากอาจทำให้เกิดความล่าช้าก่อนที่เนื้อหาจะโหลดลงในประสบการณ์
ContentProvider ช่วยให้คุณสามารถโหลดสินทรัพย์ล่วงหน้าในประสบการณ์โดยใช้วิธี ContentProvider:PreloadAsync()คุณอาจต้องการแสดงหน้าจอโหลด, โหลดสินทรัพย์สําคัญล่วงหน้า, และอนุญาตให้ผู้เล่นเข้าสู่ประสบการณ์เท่านั้น
การปฏิบัติที่ดีที่สุดสำหรับการโหลดล่วงหน้า
- เฉพาะการโหลดล่วงหน้าทรัพยากรที่จำเป็นเท่านั้น, ไม่ ทั้งหมด Workspaceคุณอาจได้รับป๊อปอินบ้าง แต่มันลดเวลาในการโหลดและไม่ทำให้ประสบการณ์ผู้เล่นขัดขวางโดยทั่วไปสินทรัพย์ที่เป็นผู้สมัครที่ดีสำหรับการโหลดล่วงหน้ารวมถึงสิ่งที่จำเป็นสำหรับหน้าจอโหลด อินเทอร์เฟซผู้ใช้ หรือพื้นที่เริ่มต้น
- ให้ผู้เล่นข้ามหน้าจอโหลด หรือข้ามโดยอัตโนมัติหลังจากระยะเวลาหนึ่ง
ตัวอย่างโค้ด
In this example a Decal and Sound are preloaded into a game. Once they have finished loading the script will print a message to the output.
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 เพื่อดาวน์โหลดสินทรัพย์จากเว็บไซต์ Roblox
ให้จำนวนรายการในคิวคำขอ ContentProvider ที่ต้องดาวน์โหลด
วิธีการ
รับปัจจุบัน Enum.AssetFetchStatus ของ contentId ที่ให้ไว้
สัญญาณที่จะยิงเมื่อ Enum.AssetFetchStatus ของเนื้อหาที่ให้มาเปลี่ยนแปลง
ผลผลิตจนกว่าทรัพยากรทั้งหมดที่เกี่ยวข้องกับที่กำหนด Instances จะโหลดเสร็จ
อีเวนต์
คุณสมบัติ
BaseUrl
ใช้โดย ContentProvider เพื่อดาวน์โหลดสินทรัพย์จากเว็บไซต์ Roblox
URL นี้ชี้ไปที่เว็บไซต์โฮสต์ของ Roblox ซึ่งทรัพยากรถูกดาวน์โหลดและดึงมาจากไฟล์ AppSettings.xml ที่ตั้งอยู่ในโฟลเดอร์ version-hash
เป็นไปได้ที่จะเขียนทับคุณสมบัตินี้โดยใช้ฟังก์ชัน ContentProvider:SetBaseUrl() ในแถบคําสั่ง แต่ไม่แนะนําและอาจทําให้เกิดปัญหาการโหลดสินทรัพย์
RequestQueueSize
ให้จำนวนรายการในคิวคำขอ ContentProvider ที่ต้องดาวน์โหลด
รายการจะถูกเพิ่มลงในคิวคำขอของไคลเอนต์เมื่อมีการใช้สินทรัพย์เป็นครั้งแรกหรือเรียก ContentProvider:PreloadAsync()
นักพัฒนาควรหลีกเลี่ยงการใช้ RequestQueueSize เพื่อสร้างแถบโหลดเนื่องจากขนาดคิวสามารถเพิ่มและลดได้ตามเวลาเมื่อมีการเพิ่มและดาวน์โหลดสินทรัพย์ใหม่นักพัฒนาที่ต้องการแสดงความคืบหน้าในการโหลดควรโหลดสินทรัพย์หนึ่งครั้งต่อเวลา (ดูตัวอย่างด้านล่าง)
ตัวอย่างโค้ด
This code sample demonstrates how ContentProvider:PreloadAsync() can be used to create a simple loading bar in a game, by loading the assets one at a time.
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 ของเนื้อหาที่จะดึงสถานะ
ส่งค่ากลับ
เนื้อหา Enum.AssetFetchStatus ของเนื้อหา
ตัวอย่างโค้ด
Retrieves the initial Enum.AssetFetchStatus of an asset and listens for future updates.
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เป็นประโยชน์อย่างยิ่งสำหรับสินทรัพย์ที่อาจอัปเดตโดยอัตโนมัติเช่นภาพนิ่งของผู้ใช้เมื่อเปลี่ยนเสื้อผ้า
พารามิเตอร์
ส่งค่ากลับ
ตัวอย่างโค้ด
Retrieves the initial Enum.AssetFetchStatus of an asset and listens for future updates.
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)
RegisterEncryptedAsset
พารามิเตอร์
ส่งค่ากลับ
RegisterSessionEncryptedAsset
พารามิเตอร์
ส่งค่ากลับ
UnregisterDefaultEncryptionKey
ส่งค่ากลับ
UnregisterEncryptedAsset
พารามิเตอร์
ส่งค่ากลับ
PreloadAsync
ผลผลิตจนกว่าทรัพยากรทั้งหมดที่เกี่ยวข้องกับที่กำหนด Instances จะโหลดเสร็จสิ่งนี้สามารถใช้เพื่อหยุดการทำงานของสคริปต์และไม่ใช้เนื้อหาจนกว่าจะแน่ใจว่าเนื้อหาถูกโหลดลงในประสบการณ์แล้ว
เมื่อเรียก เครื่องยนต์จะระบุลิงก์ไปยังเนื้อหาสำหรับแต่ละรายการในรายการสำหรับใดๆ ของ Instances ซึ่งมีคุณสมบัติที่กำหนดลิงก์ไปยังเนื้อหา เช่น Decal หรือ Sound เครื่องยนต์พยายามโหลดสินทรัพย์เหล่านี้จาก Robloxสำหรับแต่ละสินทรัพย์ที่ร้องขอ, ฟังก์ชันการโทรกลับจะทำงาน, ระบุถึงสินทรัพย์สุดท้าย Enum.AssetFetchStatus
หากสินทรัพย์ใดไม่สามารถโหลดได้ ข้อความข้อผิดพลาดจะปรากฏในออกผลวิธีการด้วยตัวเองจะไม่ผิดพลาดและจะดำเนินการต่อจนกว่าจะประมวลผลแต่ละตัวอย่างที่ร้องขอแล้ว
ข้อจํากัด
SurfaceAppearance และ MaterialVariant ไม่ได้รับการสนับสนุนจาก PreloadAsync() เนื่องจากวัตถุเหล่านี้พึ่งพาทรัพยากรแพ็คเทกเจอร์ที่ประมวลผลมากกว่าการโหลดเทกเจอร์แบบเดี่ยวโดยตรงการเรียกใช้บนตัวอย่าง SurfaceAppearance จะไม่ทำอะไร แต่เทกเจอร์ที่เกี่ยวข้องจะยังคงถูกสตรีมในระหว่างการทำงาน
พารามิเตอร์
ชุดของตัวอย่างที่จะโหลด
ฟังก์ชันที่เรียกเมื่อแต่ละคำขอสินทรัพย์สําเร็จ คืนสตริง content และสินทรัพย์สุดท้าย Enum.AssetFetchStatus
ส่งค่ากลับ
ตัวอย่างโค้ด
In this code sample, a sound and a texture are preloaded using Sound and Decal instances.
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))