แพคเกจบันเดิล

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

แพคเกจคุณสมบัติ บันเดิล เสนอฟังก์ชันนอกกล่องเพื่อขายคอลเลกชันของไอเทมให้กับผู้เล่นในราคาส่วนลดคุณสามารถเลือกว่าจะอนุญาตให้ผู้เล่นซื้อแพ็คเกจโดยใช้สกุลเงินในประสบการณ์ที่กําหนดเองหรือ Robux แพ็คเกจประเภทใดที่คุณต้องการใช้ รายการชิ้นใดที่คุณต้องการขาย และวิธีที่คุณต้องการเรียกร้องผู้เล่นในระหว่างการเล่นเกม

โดยใช้ตัวเลือกการปรับแต่งแพคเกจคุณสามารถปรับแต่งชุดของคุณให้สอดคล้องกับเป้าหมายการออกแบบและการระดมทุนของประสบการณ์ของคุณ เช่น:

  • เล็งไปที่อัตราการแปลงต่ำ โดยเสนอแพ็คเริ่มต้นราคาถูก ที่ให้คุณค่าแก่ผู้เล่นใหม่และส่งเสริมการใช้จ่ายล่วงหน้า
  • เพิ่ม ความลึกในการใช้จ่าย โดยผูกรวมรายการในราคาต่างๆ เพื่อดึงดูผู้เล่นหลายราย
  • การสร้างรายได้จากการดำเนินการสด (LiveOps) กิจกรรม โดยเสนอบันเดิลเวลาจํากัดของไอเทมสุดพิเศษ

รับแพคเกจ

ร้านค้าผู้สร้าง คือแท็บของกล่องเครื่องมือที่คุณสามารถใช้เพื่อค้นหาทรัพยากรทั้งหมดที่สร้างโดย Roblox และชุมชน Roblox เพื่อใช้ภายในโครงการของคุณ รวมถึงโมเดล ภาพ เมช เสียง ปลั๊กอิน วิดีโอ และแบบอักษร คุณสามารถใช้ร้านค้าผู้สร้างเพื่อเพิ่มสินทรัพย์หนึ่งหรือมากกว่าโดยตรงในประสบการณ์ที่เปิดกว้างรวมถึงแพคเกจคุณสมบัติ!

แต่ละแพคเกจคุณสมบัติต้องใช้แพคเกจคุณสมบัติหลัก Core เพื่อให้ทำงานได้อย่างถูกต้องเมื่อแพคเกจคุณสมบัติ แกนกลาง และ บันเดิล อยู่ภายในสินค้าคงคลังของคุณแล้ว คุณสามารถนำมาใช้ใหม่ในโครงการใดๆ คลังไอเท็ม

เพื่อรับแพคเกจจากคลังสินค้าของคุณเข้าสู่ประสบการณ์ของคุณ:

  1. เพิ่มแพคเกจคุณสมบัติ แกนกลาง และ บันเดิล ในสินค้าคงคลังของคุณภายใน Studio โดยคลิกที่ลิงก์ เพิ่มในสินค้าคงคลัง ในชุดส่วนประกอบต่อไปนี้

  2. ในแถบเครื่องมือ เลือกแท็บ ดู

  3. คลิก กล่องเครื่องมือ . หน้าต่าง กล่องเครื่องมือ จะปรากฏ

    Studio's View tab with the Toolbox tool highlighted.
  4. ในหน้าต่าง กล่องเครื่องมือ คลิกที่แท็บ สินค้าคงคลัง แสดงรายการ โมเดลของฉัน

    Studio's Toolbox window with the Inventory tab highlighted.
  5. คลิกที่ แพคเกจคุณสมบัติหลัก แล้วที่ แพคเกจคุณสมบัติบันเดิล ตามลำดับทั้งสองโฟลเดอร์แพคเกจจะแสดงในหน้าต่าง สํารวจ

  6. ลากไฟล์โฟลเดอร์แพคเกจเข้าไปใน ReplicatedStorage

  7. อนุญาตให้เรียกการเก็บข้อมูลเพื่อติดตามการซื้อผู้เล่นด้วยแพคเกจ

    1. ในแท็บ บ้าน ของแถบเครื่องมือ เลือก การตั้งค่าเกม 2. ไปที่แท็บ ความปลอดภัย จากนั้นเปิดใช้งาน เปิดใช้งานการเข้าถึงสตูดิโอไปยังบริการ API

กำหนดสกุลเงิน

หากประสบการณ์ของคุณมีระบบเงินของตัวเองคุณสามารถลงทะเบียนได้โดยใช้แพคเกจคุณสมบัติ หลัก โดยการกำหนดพวกเขาใน ReplicatedStorage.FeaturePackagesCore.Configs.Currenciesมีตัวอย่างที่แสดงความคิดเห็นของสกุลเงินอัญมณีที่อยู่ในไฟล์นี้แล้ว; เป็นเจ้าของ

สกุลเงิน

Gems = {
displayName = "Gems",
symbol = "💎",
icon = nil,
},

สคริปต์ Currencies บอกแพคเกจคุณสมบัติ หลัก เกี่ยวกับเมทาดาต้าเกี่ยวกับสกุลเงินของคุณ:

  • (จำเป็น) displayName - ชื่อสกุลเงินของคุณ หากคุณไม่ระบุสัญลักษณ์หรือไอคอน ชื่อนี้จะถูกใช้ในปุ่มซื้อ (เช่น "100 อัญมณี")
  • (ตัวเลือก) 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/ชื่อโดยเฉพาะ ซึ่งจะถูกดึงผ่านข้อมูลผลิตภัณฑ์:

อ่าน README

{
itemType = ItemTypes.ItemType.DevProduct,
devProductId = <DEV_PRODUCT_ID>,
metadata = {
caption = {
text = "x1",
color = Color3.fromRGB(236, 201, 74),
} -- คําอธิบายเป็นตัวเลือก! คุณยังสามารถข้ามฟิลด์นี้ได้
}
},

มิฉะนั้นคุณสามารถกำหนดค่ารายละเอียดของรายการดังกล่าวได้ด้วยตนเอง:

อ่าน README

{
itemType = ItemTypes.ItemType.Robux,
priceInRobux = 49,
icon = <IMAGE_ASSET_ID>,
metadata = {
caption = {
text = "x1",
color = Color3.fromRGB(236, 201, 74),
} -- คําอธิบายเป็นตัวเลือก! คุณยังสามารถปล่อยให้สนามนี้ว่างเปล่าได้
}
},

ตัวอย่างเช่น แพคเกจทั้งหมดของคุณอาจมีลักษณะดังนี้:

อ่าน README

local starterBundle: Types.RelativeTimeBundle = {
bundleType = Types.BundleType.RelativeTime,
-- หากต้องการใช้ผลิตภัณฑ์สำหรับนักพัฒนา คุณต้องให้ devProductId ชุดรวมซึ่งใช้โดยบันเดิลเดียวเท่านั้น
-- เราจะดึงราคาแพคเกจและไอคอนจากผลิตภัณฑ์ของผู้พัฒนา
pricing = {
priceType = CurrencyTypes.PriceType.Marketplace,
devProductId = <DEV_PRODUCT_ID>,
},
-- มิฉะนั้นหากคุณต้องการใช้เงินในประสบการณ์แทนผลิตภัณฑ์ของผู้พัฒนา คุณสามารถใช้สิ่งต่อไปนี้แทนได้:
-- ราคาที่นี่อยู่ในสกุลเงินในประสบการณ์ไม่ใช่ Robux
-- ราคา = {
-- ราคาประเภท = ประเภทราคา CurrencyTypes.PriceType.InExperience,
-- ราคา = 79,
-- เงินตรา = <CURRENCY_ID>,
-- ไอคอน = <IMAGE_ASSET_ID>,
-- },
includedItems = {
[1] = {
-- ไอเทมเองไม่ได้ขายผ่านผลิตภัณฑ์นักพัฒนาดังนั้นจึงบ่งบอกถึงมูลค่าเท่าใดใน Robux และให้ไอคอน
-- ราคาใน Robux ช่วยให้บันเดิลแสดงมูลค่าเชิงเปรียบเทียบของราคาบันเดิลกับผลบวกของเนื้อหา
itemType = ItemTypes.ItemType.Robux,
priceInRobux = 49,
icon = <IMAGE_ASSET_ID>,
-- อีกทางหนึ่งหากสิ่งนี้มีผลิตภัณฑ์สำหรับนักพัฒนาทิ้งราคาและไอคอนด้านบนและเพียงตั้ง devProductId
-- ราคาและไอคอนจะได้รับจากผลิตภัณฑ์ของผู้พัฒนา
-- ดีเวลอปโปรดักต์ID = <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) คุณสามารถทำให้เป็นเท็จในระหว่างการทดสอบในสตูดิโอ
durationInSeconds = 900, -- 15 นาที
includesOfflineTime = false, -- นับเวลาที่ผ่านไปในประสบการณ์เท่านั้น
metadata = {
displayName = "STARTER BUNDLE",
description = "Save 75% and get a head start!",
},
}

บูรณาการโลจิสติกของเซิร์ฟเวอร์

ดูที่ ReplicatedStorage.Bundles.Server.Examples.BundlesExample ซึ่งแสดงวิธีที่เซิร์ฟเวอร์ของคุณจะโต้ตอบกับแพคเกจคุณสมบัติ บันเดิล และวิธีการด้านบนบน ModuleScriptส่วนตัดตอนด้านล่างมาจากสคริปต์นั้น

คุณต้องเชื่อมโยงสิ่งสี่อย่างหลักเมื่อลากแพคเกจคุณสมบัติ บันเดิล เข้าสู่ประสบการณ์:

  1. เชื่อมต่อตัวจัดการการซื้อผ่าน Bundles.setPurchaseHandler เพื่อระบุฟังก์ชันที่จะโทรเพื่อรับรางวัลไอเทมเมื่อการซื้อกําลังดําเนินการ

    ตัวอย่างบันเดิล

    local function awardMarketplacePurchase(_player: Player, _bundleId: Types.BundleId, _receiptInfo: { [string]: any })
    -- อัปเดตข้อมูลผู้เล่น, ให้ไอเทมเป็นต้น
    -- ... ชุดรวมrecordInfo.PurchaseId เพื่อให้เราสามารถตรวจสอบได้ว่าผู้ใช้มีแพคเกจนี้แล้วหรือยัง
    task.wait(2)
    return Enum.ProductPurchaseDecision.PurchaseGranted
    end
    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
  2. เชื่อมโยงโลจิกของคุณสำหรับ MarketplaceService.ProcessReceipt แต่อาจทำได้ที่อื่นหากประสบการณ์ของคุณมีผลิตภัณฑ์นักพัฒนาสำหรับขายแล้วโดยพื้นฐานแล้วเมื่อใบรับรองผลิตภัณฑ์ของนักพัฒนาถูกประมวลผลแล้วพวกเขาจะโทร Bundles.getBundleByDevProduct ชุดรวมสคริปต์จะเรียก Bundles.processReceipt

    ตัวอย่างบันเดิล

    -- ประมวลผลใบเสร็จจากตลาดเพื่อตรวจสอบว่าผู้เล่นต้องการเรียกเก็บเงินหรือไม่
    local function processReceipt(receiptInfo): Enum.ProductPurchaseDecision
    local userId, productId = receiptInfo.PlayerId, receiptInfo.ProductId
    local player = Players:GetPlayerByUserId(userId)
    if not player then
    return Enum.ProductPurchaseDecision.NotProcessedYet
    end
    local handler = receiptHandlers[productId] -- รับตัวจัดการสำหรับผลิตภัณฑ์
    local success, result = pcall(handler, receiptInfo, player) -- โทรหาตัวจัดการเพื่อตรวจสอบว่าโลจิสติกการซื้อประสบความสำเร็จหรือไม่
    if not success or not result then
    warn("Failed to process receipt:", receiptInfo, result)
    return Enum.ProductPurchaseDecision.NotProcessedYet
    end
    return Enum.ProductPurchaseDecision.PurchaseGranted
    end
    local function receiptHandler(receiptInfo: { [string]: any }, player: Player)
    local bundleId, _bundle = Bundles.getBundleByProductId(receiptInfo.ProductId)
    if bundleId then
    -- ชุดรวม
    local purchaseDecision = Bundles.processReceiptAsync(player, bundleId, receiptInfo)
    return purchaseDecision == Enum.ProductPurchaseDecision.PurchaseGranted
    end
    -- ชุดรวม
    -- ... จัดการโลจิสติกทั้งหมดที่มีอยู่ของคุณที่นี่หากคุณมีใดๆ
    return false
    end
  3. เชื่อมต่อ Players.PlayerAdded:Connect(Bundles.OnPlayerAdded) เพื่อให้แพคเกจคุณลักษณะบันเดิล **** รีเรียกบันเดิลที่ใช้งานอยู่ที่ยังไม่หมดอายุสําหรับผู้เล่น

    อ่าน README

    local function onPlayerAdded(player: Player)
    -- บอกแพคเกจเมื่อผู้เล่นเข้าร่วมเพื่อให้สามารถรีโหลดข้อมูลของพวกเขาได้
    Bundles.onPlayerAdded(player)
    -- หากคุณมีแพคเกจเริ่มต้นที่คุณต้องการเสนอให้กับผู้ใช้ใหม่ทั้งหมด คุณสามารถระบุได้ที่นี่
    -- ... บันเดิลจะจัดการหากผู้เล่นซื้อมันแล้วหรือหากหมดอายุแล้วเนื่องจากไม่สามารถทำซ้ำได้
    -- Bundles.promptIfValidAsync(ผู้เล่น, "StarterBundle")
    -- เรียกนี้ที่นี่เพียงเป็นตัวอย่าง คุณสามารถเรียกนี้ได้ทุกเมื่อหรือทุกที่ที่คุณต้องการ
    onPromptBundleXYZEvent(player)
    end
  4. ชุดคำแนะนำ ขณะที่สิ่งนี้ขึ้นอยู่กับการเล่นเกมแต่ตัวอย่างจะแจ้งผู้เล่นด้วยชุดคำแนะนำเริ่มต้น onPlayerAdded

    • ล็อกิกของแพคเกจคุณสมบัติ บันเดิล มั่นใจว่าแต่ละผู้เล่นจะไม่ได้รับข้อเสนอซ้ำหากพวกเขาซื้อบันเดิลแล้ว หรือหากพวกเขาปล่อยให้ข้อเสนอหมดอายุแล้ว (ขึ้นอยู่กับการกำหนดค่าบันเดิล)

    • ทุกครั้งที่คุณต้องการส่งบันทึกไปยังผู้เล่น โทร Bundles.promptIfValidAsync(player, bundleId)

    อ่าน README

    local function onPromptBundleXYZEvent(player: Player)
    -- เชื่อมต่อประสบการณ์ใดๆ ชุดรวม
    -- ... ชุดรวม
    -- ... ตัวอย่างเช่น หากคุณต้องการส่งคำเตือนเกี่ยวกับแพคเกจเมื่อผู้เล่นเข้าร่วมหรือเมื่อผู้เล่นเลเวลอัพ
    task.spawn(Bundles.promptIfValidAsync, player, <Some_Bundle_Id>)
    -- ... หากสร้างหลายชุดโดยใช้การเรียกฟังก์ชันข้างต้นโดยใช้ task.spawn() จะลดความแตกต่างระหว่างการนับถอยหลัง
    end

พิจารณาคำแนะนำแนวทางที่ดีที่สุดต่อไปนี้เกี่ยวกับการบันทึกซ้ำของ ReceiptIds:

  • ในขณะที่แพคเกจคุณสมบัติ บันทึกใบเสร็จ จะบันทึกรหัสใบเสร็จเพื่อหลีกเลี่ยงการประมวลผลใบเสร็จเดียวกันสองครั้ง คุณควรบันทึกรหัสใบเสร็จภายในตารางของคุณด้วยเพื่อให้หากการไหลของการซื้อล้มเหลวหลังจากที่ผู้จัดการการซื้อของพวกเขาเสร็จสิ้นแล้ว คุณจะรู้ในการลองอีกครั้งว่าจะไม่มอบรางวัลไอเทมอีกครั้ง

  • แพคเกจคุณสมบัติ บันทึก จะไม่บันทึก ReceiptId หากการซื้อล้มเหลวในขั้นตอนใดก็ตาม ดังนั้นคุณควรตรวจสอบให้แน่ใจว่าคุณกำลังบันทึก ReceiptId ในตารางของคุณก่อนที่จะประมวลผลใบเสร็จเป็นส่วนหนึ่งของผู้จัดการการซื้อของคุณ

  • ความซ้ำซ้อนนี้ช่วยให้แน่ใจว่าการซื้อโลจิกทั้งหมดได้รับการจัดการอย่างเหมาะสมและที่เก็บข้อมูลของคุณและแพคเกจคุณลักษณะ บันเดิล จะได้รับความสอดคล้องในที่สุดด้วยที่เก็บข้อมูลของคุณเป็นแหล่งความจริง

กำหนดคงที่

คงที่สำหรับแพคเกจคุณสมบัติ แกนกลาง อยู่ในสองจุด:

  • คงที่ร่วมอยู่ใน ReplicatedStorage.FeaturePackagesCore.Configs.SharedConstants

  • คงที่เฉพาะแพคเกจในกรณีนี้คือแพคเกจคุณสมบัติ บันเดิล อาศัยอยู่ใน ReplicatedStorage.Bundles.Configs.Constants

สิ่งสำคัญที่คุณอาจต้องปรับเพื่อให้เป็นไปตามข้อกำหนดด้านการออกแบบของประสบการณ์ของคุณ:

  • ID สื่อเสียง
  • ระยะเวลาเอฟเฟกต์การซื้อและสีของอนุภาค
  • แสดงความพังทลายของหัวข้อได้

นอกจากนี้คุณสามารถค้นหาสตริงสําหรับการแปลที่แยกออกเป็นสถานที่เดียว: ReplicatedStorage.FeaturePackagesCore.Configs.TranslationStrings

ปรับแต่งส่วนประกอบ UI

โดยการแก้ไขวัตถุแพคเกจ เช่น สี ฟอนต์ และความโปร่งใส คุณสามารถปรับการนำเสนอภาพการ์ดของคุณได้อย่างไรก็ตาม โปรดจำไว้ว่าหากคุณย้ายวัตถุใดๆ ไปรอบๆ ตามลําดับชั้น รหัสจะไม่สามารถหาพวกเขาได้ และคุณจะต้องทำการปรับเปลี่ยนรหัสของคุณ

คำเตือนประกอบด้วยสองส่วนสูงระดับ:

  • PromptItem – ส่วนประกอบแต่ละส่วนที่ทำซ้ำสำหรับแต่ละรายการภายในบันทึก (รูปภาพรายการคําอธิบายชื่อราคา)
  • Prompt – หน้าต่างแจ้งเตือนเอง

หน้าจอแสดงข้อมูลล่วงหน้าประกอบด้วยสองส่วน:

  • HudItem – ส่วนประกอบแต่ละอย่างที่แทนที่ตัวเลือกเมนูในการแสดงผลบนหน้าจอด้านบน
  • Hud – จะถูกเติมด้วยโปรแกรมอย่างมีประสิทธิภาพด้วย HudItems

หากคุณต้องการมีการควบคุมมากขึ้นเหนือการแสดงผลบนหัว แทนที่จะใช้ HUD UI ที่มีอยู่ภายใน ReplicatedStorage.Bundles.Objects.BundlesGui คุณสามารถย้ายสิ่งต่างๆ ไปตามความต้องการในการออกแบบของคุณเองเพียงตรวจสอบให้แน่ใจว่าจะอัปเดตพฤติกรรมของสคริปต์ไคลเอนต์ในสคริปต์ ReplicatedStorage.Bundles.Client.UIController

การอ้างอิง API

ประเภท

เวลาที่เกี่ยวข้อง

เมื่อแพ็คเกจ RelativeTime ถูกเสนอให้กับผู้เล่นแล้ว มันจะยังคงมีอยู่จนกว่าระยะเวลาจะหมดลงประเภทนี้จะแสดงบนหน้าจอแสดงข้อมูลของผู้เล่นและจะแจ้งเตือนอัตโนมัติในเซสชั่นต่อไปจนกว่าบันทึกจะหมดอายุหรือผู้เล่นจะซื้อมัน

ตัวอย่างทั่วไปของประเภทบันเดิลนี้คือข้อเสนอแพ็คเริ่มต้นใช้ครั้งเดียวที่แสดงให้กับผู้เล่นใหม่ทั้งหมดเป็นเวลา 24 ชั่วโมงสำหรับการปฏิบัติที่ดีที่สุดในอุตสาหกรรมเกี่ยวกับวิธีการใช้แพ็คเริ่มต้นบนบันทึกแพ็ค ดู การออกแบบแพ็คเริ่มต้น

ชื่อประเภทคําอธิบาย
includeOfflineTimebool (เลือกได้) หากไม่ได้ตั้งค่า เวลาที่ใช้ในประสบการณ์เท่านั้นจะนับเป็นระยะเวลาข้อเสนอที่เหลือ
singleUsebool (เลือกได้) หากไม่ได้ตั้งค่า การซื้อสามารถถูกเปิดใช้งานใหม่ได้หลังจากซื้อหรือหมดอายุ หากตั้งค่าแล้ว เมื่อซื้อหรือหมดอายุครั้งแรก จะไม่ถูกร้องขออีกครั้ง แม้ว่าคุณจะโทร Bundles.promptIfValidAsync ด้วย bundleId

เวลาที่แก้ไขแล้ว

เมื่อแพ็คเกจ FixedTime ถูกเสนอให้กับผู้เล่นแล้ว มันจะยังคงมีอยู่จนถึงสิ้นเวลาที่ประสานกันทั่วถึง (UTC)ประเภทนี้จะแสดงบนหน้าจอแสดงข้อมูลของผู้เล่นและจะแจ้งเตือนอัตโนมัติในเซสชั่นต่อไปจนกว่าบันทึกจะหมดอายุหรือผู้เล่นจะซื้อมัน

ตัวอย่างทั่วไปของประเภทบันเดิลนี้คือข้อเสนอในวันหยุดที่มีให้เฉพาะในเดือนที่กำหนดเท่านั้น

ครั้งเดียว

แพคเกจ OneTime มีให้เฉพาะในช่วงเวลาที่มันถูกเสนอให้กับผู้เล่นมันจะไม่แสดงบนหน้าจอแสดงข้อมูลของผู้เล่นและเมื่อผู้เล่นปิดการแจ้งเตือน มันจะไม่สามารถเปิดใหม่ได้จนกว่าจะถูกระบุโดยเซิร์ฟเวอร์อีกครั้ง

ตัวอย่างทั่วไปของประเภทบันเดิลนี้คือข้อเสนอในการซื้อเพิ่มในสกุลเงินในประสบการณ์เมื่อผู้เล่นหมด