แพ็คเกจฟีเจอร์ Bundles มอบฟังก์ชันการทำงานที่พร้อมใช้งานเพื่อขายชุดของรายการให้กับผู้เล่นในราคาที่ลดลง คุณสามารถเลือกว่าจะอนุญาตให้ผู้เล่นซื้อแพ็คเกจโดยใช้สกุลเงินในเกมที่กำหนดเองหรือ Robux, ประเภทแพ็คเกจที่คุณต้องการใช้, ชุดของรายการที่คุณต้องการขาย, และวิธีที่คุณต้องการกระตุ้นผู้เล่นระหว่างการเล่นเกมของพวกเขา
โดยใช้ตัวเลือกการปรับแต่งของแพ็คเกจ คุณสามารถปรับแต่งแพ็คเกจของคุณให้ตรงตามเป้าหมายการออกแบบและการสร้างรายได้ของเกมของคุณ เช่น:
- มุ่งเป้าไปที่อัตรา การแปลง ที่ต่ำโดยการเสนอแพ็คเกจเริ่มต้นที่ลดราคา ซึ่งให้คุณค่าแก่ผู้เล่นใหม่และกระตุ้นการใช้จ่ายในช่วงต้น
- เพิ่ม ความลึกของการใช้จ่าย โดยการรวมรายการในราคาที่แตกต่างกันเพื่อดึงดูดผู้เล่นที่หลากหลาย
- สร้างรายได้จากการดำเนินงานสด (LiveOps) เหตุการณ์ โดยการเสนอแพ็คเกจที่มีเวลาจำกัดของรายการพิเศษ

รับแพ็คเกจ
Creator Store เป็นแท็บของ Toolbox ที่คุณสามารถใช้เพื่อค้นหาทรัพย์สินทั้งหมดที่สร้างโดย Roblox และชุมชน Roblox สำหรับใช้ในโครงการของคุณ รวมถึงโมเดล, รูปภาพ, เมช, เสียง, ปลั๊กอิน, วิดีโอ, และฟอนต์ คุณสามารถใช้ Creator Store เพื่อเพิ่มทรัพย์สินหนึ่งหรือมากกว่าโดยตรงลงในเกมที่เปิดอยู่ รวมถึงฟีเจอร์แพ็คเกจ!
ทุกฟีเจอร์แพ็คเกจต้องการแพ็คเกจฟีเจอร์ Core เพื่อทำงานอย่างถูกต้อง เมื่อทรัพย์สินของแพ็คเกจฟีเจอร์ Core และ Bundles อยู่ในคลังของคุณแล้ว คุณสามารถนำกลับมาใช้ใหม่ในโครงการใด ๆ บนแพลตฟอร์ม
เพื่อรับแพ็คเกจจากคลังของคุณเข้าสู่เกมของคุณ:
เพิ่มแพ็คเกจฟีเจอร์ Core และ Bundles ลงในคลังของคุณภายใน Studio โดยการคลิกที่ลิงก์ Add to Inventory ในชุดของส่วนประกอบต่อไปนี้
จากเมนู Window ของ Studio หรือแถบเครื่องมือ Home เปิด Toolbox.
ในหน้าต่าง Toolbox คลิกที่แท็บ Inventory แสดงการจัดเรียง My Models.

คลิกที่ไทล์ Feature Package Core จากนั้นไทล์ Bundle Feature Package โฟลเดอร์แพ็คเกจทั้งสองจะแสดงในหน้าต่าง Explorer.
ลากโฟลเดอร์แพ็คเกจไปยัง ReplicatedStorage.
อนุญาตให้การเรียกข้อมูลจัดเก็บข้อมูลติดตามการซื้อของผู้เล่นด้วยแพ็คเกจ
- เปิดหน้าต่าง File ⟩ Experience Settings ของ Studio.
- ไปที่แท็บ Security จากนั้นเปิดใช้งาน Enable Studio Access to API Services.
กำหนดสกุลเงิน
หากเกมของคุณมีระบบสกุลเงินของตัวเอง คุณสามารถลงทะเบียนสกุลเงินเหล่านั้นกับแพ็คเกจฟีเจอร์ Core โดยการกำหนดใน ReplicatedStorage.FeaturePackagesCore.Configs.Currencies มีตัวอย่างสกุลเงิน Gems ที่ถูกคอมเมนต์ออกอยู่ในไฟล์นี้แล้ว; แทนที่ด้วยของคุณเอง
Gems = {
displayName = "Gems",
symbol = "💎",
icon = nil,
},สคริปต์ Currencies บอกแพ็คเกจฟีเจอร์ Core เกี่ยวกับข้อมูลเมตาของสกุลเงินของคุณ:
- (จำเป็น) displayName - ชื่อของสกุลเงินของคุณ หากคุณไม่ระบุสัญลักษณ์หรือไอคอน ชื่อนี้จะถูกใช้ในปุ่มซื้อ (เช่น "100 Gems").
- (ไม่จำเป็น) symbol - หากคุณมีตัวอักษรข้อความที่จะใช้เป็นไอคอนสำหรับสกุลเงินของคุณ จะถูกใช้แทน displayName ในปุ่มซื้อ (เช่น "💎100").
- (ไม่จำเป็น) icon - หากคุณมีไอคอนภาพ AssetId สำหรับสกุลเงินของคุณ จะถูกใช้แทน displayName ในปุ่มซื้อ (เช่น ภาพจะถูกวางทางซ้ายของราคา "🖼️100")
เมื่อสกุลเงินของคุณถูกตั้งค่าแล้ว คุณต้องระบุราคาของแพ็คเกจ, สกุลเงิน, และไอคอนสำหรับการแสดงผลแทนที่จะให้ข้อมูลนั้นถูกดึงจากผลิตภัณฑ์นักพัฒนาที่เกี่ยวข้องกับแพ็คเกจ
-- หากคุณต้องการใช้ผลิตภัณฑ์นักพัฒนา คุณต้องให้ devProductId ที่ไม่ซ้ำกัน ซึ่งใช้โดยแพ็คเกจเดียวเท่านั้น
-- เราจะดึงราคาและไอคอนของแพ็คเกจจากผลิตภัณฑ์นักพัฒนา
pricing = {
priceType = CurrencyTypes.PriceType.Marketplace,
devProductId = 1795621566,
},
-- มิฉะนั้น หากคุณต้องการใช้สกุลเงินในเกมแทนผลิตภัณฑ์นักพัฒนา คุณสามารถใช้สิ่งต่อไปนี้แทน:
-- ราคาในที่นี้คือในสกุลเงินในเกม ไม่ใช่ Robux
pricing = {
priceType = CurrencyTypes.PriceType.InExperience,
price = 79,
currencyId = "Gems",
icon = 18712203759,
},คุณยังต้องอ้างอิงสคริปต์ BundlesExample เพื่อเรียก setInExperiencePurchaseHandler.
local function awardInExperiencePurchase(
_player: Player,
_bundleId: Types.BundleId,
_currencyId: CurrencyTypes.CurrencyId,
_price: number
)
-- ตรวจสอบว่าผู้เล่นมีสกุลเงินเพียงพอในการซื้อแพ็คเกจหรือไม่
-- อัปเดตข้อมูลผู้เล่น, มอบรายการ, ฯลฯ
-- หักสกุลเงินจากผู้เล่น
task.wait(2)
return true
end
local function initializePurchaseHandlers()
local bundles = Bundles.getBundles()
for bundleId, bundle in bundles do
-- แพ็คเกจไม่ได้เชื่อมโยงกับผลิตภัณฑ์นักพัฒนาหากไม่มีประเภทราคาในตลาด
if not bundle or bundle.pricing.priceType ~= "Marketplace" then
continue
end
Bundles.setPurchaseHandler(bundleId, awardMarketplacePurchase)
receiptHandlers[bundle.pricing.devProductId] = receiptHandler
end
-- หากคุณมีสกุลเงินในเกมใด ๆ ที่คุณใช้สำหรับแพ็คเกจ ให้ตั้งค่าตัวจัดการที่นี่
for currencyId, _ in Currencies do
Bundles.setInExperiencePurchaseHandler(currencyId, awardInExperiencePurchase)
end
endโดยเฉพาะ คุณต้องกรอก awardInExperiencePurchase ซึ่งถูกเรียกโดยลูปผ่าน Currencies ภายใน initializePurchaseHandlers ตัวอย่าง (เช่น currencyId แต่ละตัวเชื่อมต่อกับตัวจัดการผ่าน Bundles.setInExperiencePurchaseHandler(currencyId, awardInExperiencePurchase)).
กำหนดแพ็คเกจ
แพ็คเกจทั้งหมดที่เสนอในเกมของคุณสามารถกำหนดได้ภายใน ReplicatedStorage.Bundles.Configs.Bundles โดยมีประเภทที่ส่งออกจากสคริปต์ Types ในโฟลเดอร์เดียวกัน
หากคุณใช้ devProductId คุณต้องอัปเดต devProductId หลักของแพ็คเกจให้ตรงกับที่อยู่ในเกมของคุณ นี่คือสิ่งที่จะถูกกระตุ้นผ่าน MarketplaceService เพื่อซื้อแพ็คเกจเอง แนะนำอย่างยิ่งให้ใช้ผลิตภัณฑ์นักพัฒนาที่ใหม่สำหรับแพ็คเกจเพื่อทำให้การติดตามการขายแยกต่างหากง่ายขึ้น
หากคุณต้องการแพ็คเกจที่มีหลายรายการ และหากรายการเหล่านี้ถูกแทนที่โดยผลิตภัณฑ์นักพัฒนาในเกมของคุณแล้ว คุณไม่จำเป็นต้องตั้งค่าราคา/assetId/name ของรายการอย่างชัดเจน ซึ่งจะถูกดึงข้อมูลผ่านข้อมูลผลิตภัณฑ์:
{
itemType = ItemTypes.ItemType.DevProduct,
devProductId = <DEV_PRODUCT_ID>,
metadata = {
caption = {
text = "x1",
color = Color3.fromRGB(236, 201, 74),
} -- คำบรรยายเป็นทางเลือก! คุณยังสามารถละเว้นฟิลด์นี้ได้
}
},มิฉะนั้น คุณสามารถกำหนดรายละเอียดของรายการเหล่านั้นด้วยตนเอง:
{
itemType = ItemTypes.ItemType.Robux,
priceInRobux = 49,
icon = <IMAGE_ASSET_ID>,
metadata = {
caption = {
text = "x1",
color = Color3.fromRGB(236, 201, 74),
} -- คำบรรยายเป็นทางเลือก! คุณยังสามารถละเว้นฟิลด์นี้ได้
}
},ตัวอย่างเช่น แพ็คเกจทั้งหมดของคุณอาจมีลักษณะดังนี้:
local starterBundle: Types.RelativeTimeBundle = {
bundleType = Types.BundleType.RelativeTime,
-- หากคุณต้องการใช้ผลิตภัณฑ์นักพัฒนา คุณต้องให้ devProductId ที่ไม่ซ้ำกัน ซึ่งใช้โดยแพ็คเกจเดียวเท่านั้น
-- เราจะดึงราคาและไอคอนของแพ็คเกจจากผลิตภัณฑ์นักพัฒนา
pricing = {
priceType = CurrencyTypes.PriceType.Marketplace,
devProductId = <DEV_PRODUCT_ID>,
},
-- มิฉะนั้น หากคุณต้องการใช้สกุลเงินในเกมแทนผลิตภัณฑ์นักพัฒนา คุณสามารถใช้สิ่งต่อไปนี้แทน:
-- ราคาในที่นี้คือในสกุลเงินในเกม ไม่ใช่ Robux
-- pricing = {
-- priceType = CurrencyTypes.PriceType.InExperience,
-- price = 79,
-- currencyId = <CURRENCY_ID>,
-- icon = <IMAGE_ASSET_ID>,
-- },
includedItems = {
[1] = {
-- รายการเองไม่ได้ขายผ่านผลิตภัณฑ์นักพัฒนา ดังนั้นให้ระบุว่ามีมูลค่าเท่าใดใน Robux และให้ไอคอน
-- priceInRobux ช่วยให้ Bundles แสดงมูลสัมพัทธ์ของราคาแพ็คเกจเทียบกับผลรวมของเนื้อหา
itemType = ItemTypes.ItemType.Robux,
priceInRobux = 49,
icon = <IMAGE_ASSET_ID>,
-- หรือหากมีผลิตภัณฑ์นักพัฒนาให้ละเว้นราคาและไอคอนด้านบนและเพียงแค่ตั้งค่า devProductId
-- ราคาและไอคอนจะถูกดึงจากผลิตภัณฑ์นักพัฒนา
-- devProductId = <ITEM_DEV_PRODUCT_ID>
-- มีฟิลด์ข้อมูลเมตาที่เป็นทางเลือกมากมายที่เฉพาะเจาะจงกับ UI หากจำเป็น
metadata = {
caption = {
text = "x1",
color = Color3.fromRGB(236, 201, 74),
},
},
},
[2] = {
itemType = ItemTypes.ItemType.Robux,
priceInRobux = 99,
icon = <IMAGE_ASSET_ID>,
metadata = {
caption = {
text = "x1",
color = Color3.fromRGB(236, 201, 74),
},
},
},
[3] = {
itemType = ItemTypes.ItemType.Robux,
priceInRobux = 149,
icon = <IMAGE_ASSET_ID>,
metadata = {
caption = {
text = "x1",
color = Color3.fromRGB(236, 201, 74),
},
},
},
},
singleUse = true, -- เมื่อซื้อหรือหมดอายุ จะไม่ถูกต้องอีกต่อไปแม้ว่าคุณจะพยายามกระตุ้น (onPlayerAdded) เกมของคุณ คุณสามารถทำให้เป็น false ขณะทดสอบในสตูดิโอ
durationInSeconds = 900, -- 15 นาที
includesOfflineTime = false, -- นับเฉพาะเวลาที่ผ่านไปในเกม
metadata = {
displayName = "STARTER BUNDLE",
description = "ประหยัด 75% และเริ่มต้นได้ดี!",
},
}รวมตรรกะเซิร์ฟเวอร์
ดูที่ ReplicatedStorage.Bundles.Server.Examples.BundlesExample ซึ่งแสดงให้เห็นว่าเซิร์ฟเวอร์ของคุณจะโต้ตอบกับแพ็คเกจฟีเจอร์ Bundles และวิธีการข้างต้นใน ModuleScript อย่างไร ตัวอย่างด้านล่างมาจากสคริปต์นั้น
คุณจำเป็นต้องเชื่อมต่อสี่สิ่งเมื่อดึงแพ็คเกจฟีเจอร์ Bundles เข้าสู่เกมของคุณ:
เชื่อมต่อผู้จัดการการซื้อผ่าน Bundles.setPurchaseHandler เพื่อระบุฟังก์ชันที่จะเรียกเพื่อมอบรายการเมื่อมีการประมวลผลการซื้อ
BundlesExamplelocal function awardMarketplacePurchase(_player: Player, _bundleId: Types.BundleId, _receiptInfo: { [string]: any })-- อัปเดตข้อมูลผู้เล่น, มอบรายการ, ฯลฯ-- ... และบันทึก receiptInfo.PurchaseId เพื่อให้เราสามารถตรวจสอบได้ว่าผู้ใช้มีแพ็คเกจนี้แล้วหรือไม่task.wait(2)return Enum.ProductPurchaseDecision.PurchaseGrantedendlocal function awardInExperiencePurchase(_player: Player,_bundleId: Types.BundleId,_currencyId: CurrencyTypes.CurrencyId,_price: number)-- ตรวจสอบว่าผู้เล่นมีสกุลเงินเพียงพอในการซื้อแพ็คเกจหรือไม่-- อัปเดตข้อมูลผู้เล่น, มอบรายการ, ฯลฯ-- หักสกุลเงินจากผู้เล่นtask.wait(2)return trueendlocal function initializePurchaseHandlers()local bundles = Bundles.getBundles()for bundleId, bundle in bundles do-- แพ็คเกจไม่ได้เชื่อมโยงกับผลิตภัณฑ์นักพัฒนาหากไม่มีประเภทราคาในตลาดif not bundle or bundle.pricing.priceType ~= "Marketplace" thencontinueendBundles.setPurchaseHandler(bundleId, awardMarketplacePurchase)receiptHandlers[bundle.pricing.devProductId] = receiptHandlerend-- หากคุณมีสกุลเงินในเกมใด ๆ ที่คุณใช้สำหรับแพ็คเกจ ให้ตั้งค่าตัวจัดการที่นี่for currencyId, _ in Currencies doBundles.setInExperiencePurchaseHandler(currencyId, awardInExperiencePurchase)endendเชื่อมต่อตรรกะของคุณสำหรับ MarketplaceService.ProcessReceipt แต่สิ่งนี้อาจทำที่อื่นหากเกมของคุณมีผลิตภัณฑ์นักพัฒนาที่ขายอยู่แล้ว โดยพื้นฐานแล้ว เมื่อมีการประมวลผลใบเสร็จของผลิตภัณฑ์นักพัฒนา พวกเขาจะเรียก Bundles.getBundleByDevProduct เพื่อตรวจสอบว่าผลิตภัณฑ์นั้นเป็นของแพ็คเกจหรือไม่ หากเป็นเช่นนั้น สคริปต์จะเรียก Bundles.processReceipt.
BundlesExample-- ประมวลผลใบเสร็จจากตลาดเพื่อตัดสินใจว่าผู้เล่นต้องถูกเรียกเก็บเงินหรือไม่local function processReceipt(receiptInfo): Enum.ProductPurchaseDecisionlocal userId, productId = receiptInfo.PlayerId, receiptInfo.ProductIdlocal player = Players:GetPlayerByUserId(userId)if not player thenreturn Enum.ProductPurchaseDecision.NotProcessedYetendlocal handler = receiptHandlers[productId] -- รับตัวจัดการสำหรับผลิตภัณฑ์local success, result = pcall(handler, receiptInfo, player) -- เรียกตัวจัดการเพื่อตรวจสอบว่าตรรกะการซื้อสำเร็จหรือไม่if not success or not result thenwarn("ไม่สามารถประมวลผลใบเสร็จ:", receiptInfo, result)return Enum.ProductPurchaseDecision.NotProcessedYetendreturn Enum.ProductPurchaseDecision.PurchaseGrantedendlocal function receiptHandler(receiptInfo: { [string]: any }, player: Player)local bundleId, _bundle = Bundles.getBundleByProductId(receiptInfo.ProductId)if bundleId then-- การซื้อครั้งนี้เป็นของแพ็คเกจ ให้ Bundles จัดการlocal purchaseDecision = Bundles.processReceiptAsync(player, bundleId, receiptInfo)return purchaseDecision == Enum.ProductPurchaseDecision.PurchaseGrantedend-- การซื้อนี้ไม่เป็นของแพ็คเกจ,-- ... จัดการตรรกะที่มีอยู่ทั้งหมดที่นี่หากคุณมีreturn falseendเชื่อมต่อ Players.PlayerAdded:Connect(Bundles.OnPlayerAdded) เพื่อให้แพ็คเกจฟีเจอร์ Bundles กระตุ้นแพ็คเกจที่ใช้งานอยู่ซ้ำอีกครั้งซึ่งยังไม่หมดอายุสำหรับผู้เล่น
READMElocal function onPlayerAdded(player: Player)-- บอก Bundles เมื่อผู้เล่นเข้าร่วมเพื่อให้สามารถโหลดข้อมูลของพวกเขาใหม่ได้Bundles.onPlayerAdded(player)-- หากคุณมีแพ็คเกจเริ่มต้นที่คุณต้องการเสนอให้กับผู้ใช้ใหม่ทั้งหมด คุณสามารถกระตุ้นที่นี่-- ... Bundles จะจัดการหากผู้เล่นมีการซื้อแล้วหรือถ้ามันหมดอายุเนื่องจากไม่สามารถทำซ้ำได้-- Bundles.promptIfValidAsync(player, "StarterBundle")-- การเรียกนี้ที่นี่เพียงเพื่อเป็นตัวอย่าง คุณสามารถเรียกนี้เมื่อใดก็ได้หรือที่ใดก็ได้ที่คุณต้องการonPromptBundleXYZEvent(player)endกระตุ้นแพ็คเกจ ขึ้นอยู่กับการเล่นเกม ตัวอย่างกระตุ้นผู้เล่นด้วย StarterBundle onPlayerAdded.
ตรรกะของแพ็คเกจฟีเจอร์ Bundles รับประกันว่าผู้เล่นแต่ละคนจะไม่ได้รับข้อเสนอซ้ำหากพวกเขาได้ซื้อแพ็คเกจแล้ว หรือหากพวกเขาปล่อยให้ข้อเสนอหมดอายุแล้ว (ตามการกำหนดค่าแพ็คเกจ)
เมื่อใดก็ตามที่คุณต้องการกระตุ้นแพ็คเกจให้กับผู้เล่น ให้เรียก Bundles.promptIfValidAsync(player, bundleId).
READMElocal function onPromptBundleXYZEvent(player: Player)-- เชื่อมต่อกับเหตุการณ์เกมใด ๆ ที่คุณต้องการใช้เพื่อตัดสินใจเมื่อผู้เล่นได้รับการกระตุ้นแพ็คเกจ-- ... นี่จะเป็นเมื่อคุณได้พบเกณฑ์ความเหมาะสมของคุณในการกระตุ้นผู้เล่นแพ็คเกจ-- ... ตัวอย่างเช่น หากคุณต้องการกระตุ้นแพ็คเกจเมื่อผู้เล่นเข้าร่วม หรือเมื่อผู้เล่นเลเวลอัพtask.spawn(Bundles.promptIfValidAsync, player, <Some_Bundle_Id>)-- ... หากสร้างแพ็คเกจหลาย ๆ แพ็คเกจ การใช้ task.spawn() เพื่อห่อหุ้มการเรียกฟังก์ชันข้างต้นจะช่วยลดความไม่ตรงกันระหว่างการนับถอยหลังend
พิจารณาคำแนะนำแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับการบันทึก ReceiptIds ที่ซ้ำซ้อน:
ในขณะที่แพ็คเกจฟีเจอร์ Bundles จะบันทึก ReceiptIds เพื่อหลีกเลี่ยงการประมวลผลใบเสร็จเดียวกันสองครั้ง คุณควรบันทึก ReceiptIds ในตารางของคุณด้วย เพื่อให้หากการไหลของการซื้อเกิดข้อผิดพลาดหลังจากที่ตัวจัดการการซื้อของพวกเขาเสร็จสิ้นแล้ว คุณจะรู้ในครั้งถัดไปที่ลองใหม่ว่าไม่ต้องมอบรายการอีกครั้ง
แพ็คเกจฟีเจอร์ Bundles จะไม่บันทึก ReceiptId หากการซื้อเกิดข้อผิดพลาดในขั้นตอนใด ๆ ดังนั้นคุณควรตรวจสอบว่าคุณกำลังบันทึก ReceiptId ในตารางของคุณก่อนที่จะประมวลผลใบเสร็จเป็นส่วนหนึ่งของ purchaseHandler ของคุณ
ความซ้ำซ้อนนี้ช่วยให้แน่ใจว่าตรรกะการซื้อทั้งหมดได้รับการจัดการอย่างเหมาะสมและว่าฐานข้อมูลของคุณและฐานข้อมูลของแพ็คเกจฟีเจอร์ Bundles จะถึงความสอดคล้องในที่สุด โดยที่ฐานข้อมูลของคุณเป็นแหล่งข้อมูลที่เชื่อถือได้
กำหนดค่าค่าคงที่
ค่าคงที่สำหรับแพ็คเกจฟีเจอร์ Core จะอยู่ในสองจุด:
ค่าคงที่ที่ใช้ร่วมกันจะอยู่ใน ReplicatedStorage.FeaturePackagesCore.Configs.SharedConstants.
ค่าคงที่เฉพาะแพ็คเกจ ในกรณีนี้คือแพ็คเกจฟีเจอร์ Bundles จะอยู่ใน ReplicatedStorage.Bundles.Configs.Constants.
สิ่งหลักที่คุณอาจต้องการปรับเพื่อให้ตรงตามข้อกำหนดการออกแบบของเกมของคุณ:
- รหัสทรัพย์สินเสียง
- ระยะเวลาของเอฟเฟกต์การซื้อและสีของอนุภาค
- ความสามารถในการยุบของการแสดงผล
นอกจากนี้ คุณยังสามารถค้นหาสตริงสำหรับการแปลที่แยกออกมาในที่เดียว: ReplicatedStorage.FeaturePackagesCore.Configs.TranslationStrings.
ปรับแต่งส่วนประกอบ UI
โดยการปรับเปลี่ยนวัตถุของแพ็คเกจ เช่น สี, ฟอนต์, และความโปร่งใส คุณสามารถปรับแต่งการนำเสนอภาพของการกระตุ้นแพ็คเกจของคุณ อย่างไรก็ตาม โปรดทราบว่าหากคุณย้ายวัตถุใด ๆ รอบ ๆ ตามลำดับชั้น โค้ดจะไม่สามารถค้นหาพวกเขาได้ และคุณจะต้องทำการปรับเปลี่ยนโค้ดของคุณ
การกระตุ้นประกอบด้วยสองส่วนประกอบระดับสูง:
- PromptItem – ส่วนประกอบแต่ละรายการที่ทำซ้ำสำหรับแต่ละรายการภายในแพ็คเกจ (ภาพรายการ, คำบรรยาย, ชื่อ, ราคา).
- Prompt – หน้าต่างการกระตุ้นเอง.
การแสดงผลยังประกอบด้วยสองส่วนประกอบ:
- HudItem – ส่วนประกอบแต่ละรายการที่แสดงตัวเลือกเมนูแต่ละรายการในการแสดงผล.
- Hud – จะถูกเติมด้วยโปรแกรมด้วย HudItems.
หากคุณต้องการควบคุมการแสดงผลได้มากขึ้น แทนที่จะใช้ UI HUD ที่มีอยู่ภายใน ReplicatedStorage.Bundles.Objects.BundlesGui คุณสามารถย้ายสิ่งต่าง ๆ รอบ ๆ เพื่อให้ตรงตามข้อกำหนดการออกแบบของคุณ เพียงแค่ตรวจสอบให้แน่ใจว่าได้อัปเดตพฤติกรรมสคริปต์ไคลเอ็นต์ในสคริปต์ ReplicatedStorage.Bundles.Client.UIController.
เอกสารอ้างอิง API
ประเภท
RelativeTime
เมื่อเสนอแพ็คเกจ RelativeTime ให้กับผู้เล่น มันจะยังคงมีให้จนกว่าระยะเวลาจะหมดลง ประเภทนี้จะแสดงในการแสดงผลของผู้เล่น และจะกระตุ้นโดยอัตโนมัติในเซสชันในอนาคตจนกว่าแพ็คเกจจะหมดอายุหรือผู้เล่นจะซื้อมัน
ตัวอย่างทั่วไปของประเภทแพ็คเกจนี้คือข้อเสนอแพ็คเกจเริ่มต้นแบบใช้ครั้งเดียวที่แสดงให้ผู้เล่นใหม่ทุกคนเป็นเวลา 24 ชั่วโมง
| ชื่อ | ประเภท | คำอธิบาย |
|---|---|---|
| includeOfflineTime | bool | (ไม่จำเป็น) หากไม่ได้ตั้งค่า จะนับเฉพาะเวลาที่ใช้ในเกมเท่านั้นที่จะนับไปยังระยะเวลาที่เหลือของข้อเสนอ. |
| singleUse | bool | (ไม่จำเป็น) หากไม่ได้ตั้งค่า การซื้อสามารถเปิดใช้งานใหม่ได้หลังจากที่ซื้อหรือหมดอายุ. หากตั้งค่า เมื่อซื้อหรือหมดอายุครั้งแรก จะไม่สามารถกระตุ้นได้อีกเลย แม้ว่าคุณจะเรียก Bundles.promptIfValidAsync ด้วย bundleId. |
FixedTime
เมื่อเสนอแพ็คเกจ FixedTime ให้กับผู้เล่น มันจะยังคงมีให้จนกว่าจะสิ้นสุดเวลาสากลที่ตั้งไว้ (UTC) ประเภทนี้จะแสดงในการแสดงผลของผู้เล่น และจะกระตุ้นโดยอัตโนมัติในเซสชันในอนาคตจนกว่าแพ็คเกจจะหมดอายุหรือผู้เล่นจะซื้อมัน
ตัวอย่างทั่วไปของประเภทแพ็คเกจนี้คือข้อเสนอวันหยุดที่มีให้เฉพาะในเดือนที่กำหนด
OneTime
แพ็คเกจ OneTime จะมีให้เฉพาะในช่วงเวลาที่เสนอให้กับผู้เล่น มันจะไม่แสดงในการแสดงผลของผู้เล่น และเมื่อผู้เล่นปิดการกระตุ้น มันจะไม่สามารถเปิดใหม่ได้จนกว่าจะถูกกระตุ้นโดยเซิร์ฟเวอร์อีกครั้ง
ตัวอย่างทั่วไปของประเภทแพ็คเกจนี้คือข้อเสนอในการซื้อสกุลเงินในเกมเพิ่มเติมในขณะที่ผู้เล่นหมด.