ContentProvider
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
บริการที่โหลดเนื้อหา (สินทรัพย์) เข้าสู่เกม
เซิร์ฟเวอร์ Roblox สตรีมทรัพยากรทั้งหมดไปยังลูกค้าในเวลาทำงาน: วัตถุใน Workspace การ์ดาสน์ สกิน ทรัพยากร เสียง ฯลฯ ทรัพยากรเช่น Mesh วิดีโอ ข้อความ ขอบเส้น และเสียง จะสตรีมในขณ
ในบางกรณี, พฤติกรรมนี้ไม่พึงประสงค์, เนื่องจากสามารถนำไปสู่ความล่าช้าก่อนที่เนื้อหาจะโหลดเข้าสู่ประสบการณ์
ContentProvider ช่วยให้คุณสามารถเตรียมพร้อมสินทรัพย์ในประสบการณ์โดยใช้วิธี ContentProvider:PreloadAsync() คุณอาจต้องการแสดงหน้าต่างการโหลดและเท่านั้นจึงจะสามารถเข้าสู่ประสบการณ์ได้
เทคนิคการปรีโหลด
- เฉพาะการโหลดสินทรัพย์ที่จำเป็นเท่านั้น, ไม่ใช่ พื้นที่ทำงานทั้งหมด คุณอาจได้รับป๊อปอัปบางครั้ง, แต่มันลดเวลาโหลดและทั่วไปไม่ได้รบกวนประสบการณ์ผู้ใช้ สินทร
- ให้ผู้เล่นข้ามหน้าจอการโหลด หรือข้ามอัตโนมัติหลังจากระยะเวลาบางอย่าง
ตัวอย่างโค้ด
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
ลิงค์นี้ชี้ไปที่เว็บไซต์ Roblox ที่โฮสต์จากไซต์ที่มีสินทรัพย์ดาวน์โหลดและดึงจากไฟล์ AppSettings.xml ซึ่งตั้งอยู่ในโฟลเดอร์ version-hash
มีความเป็นไปได้ที่จะเขียนค่านี้โดยใช้คุณสมบัติ 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() เพื่อฟังการเปลี่ยนแปลงของค่านี้
พารามิเตอร์
รหัสของเนื้อหาที่จะดึงสถานะสำหรับ
ส่งค่ากลับ
The 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)
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 จะโหลดเสร็จสิ้น สิ่งนี้สามารถใช้เพื่อหยุดการประมวลผลและไม่ใช้เนื้อหาจนกว่าจะแน่ใจว่าเนื้อหาถูกโหลดเข้าสู่ประสบการณ
Robloxสำหรับใด ๆ ของ Instances
วิธีนี้ยังสามารถรับรายการ 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))