使用管理定價,您可以為您的物品提供 地區特定價格,並構建一個更具包容性和可及性的全球經濟。在確定物品的默認全球價格後,Roblox利用多種信號,如區域的購買力、貨幣匯率和當地消費行為,按地區為該物品設置最合適的價格。
您可以選擇要進行地區定價的物品。當您為遊戲中的物品啟用管理定價時,Roblox會根據用戶的經濟位置自動調整該物品的價格。
經濟位置不一定與帳戶位置相同。為確定用戶的經濟位置,Roblox會查看信號,包括VPN使用、帳單歷史和帳戶歷史。如果無法確定其經濟位置,則用戶將看到該物品的默認全球價格。
為了防止在用戶贈送或交易價格不同的物品時出現價格套利,您可以 使用 GetUsersPriceLevelsAsync API管理遊戲內轉移。
啟用地區定價
對於通行證
管理定價默認情況下對所有新創建和現有通行證啟用,通過 Managed pricing。
要禁用通行證的管理定價:
- 前往 Creations 並選擇一個遊戲。
- 進入 Monetization ⟩ Passes。
- 選擇一個或多個現有通行證。
- 點擊 Disable Managed Pricing。
- OPTIONAL要按國家或地區查看管理價格,選擇一個通行證並轉到其 Sales 頁面。Top Countries/Regions 列表會更新,以顯示基於通行證的默認價格的調整價格。要查看所有國家和地區的價格,請點擊 View all countries。
對於開發者產品
要為開發者產品啟用管理定價:
- 確保您的開發者產品具有 動態腳本價格。
- 實施 GetUsersPriceLevelsAsync 方法,根據用戶的價格水平調整物品轉移。
- 前往 Creations 並選擇一個遊戲。
- 進入 Monetization ⟩ Developer Products。
- 選擇一個或多個現有產品,或創建一個新產品。
- 點擊 Enable Managed Pricing。
- OPTIONAL要按國家或地區查看管理定價,選擇一個產品並轉到其 Basic Settings 頁面。Top Countries/Regions 列表會更新,以顯示基於產品的默認價格的調整價格。要查看所有國家和地區的管理定價,請點擊 View all countries。
對於訂閱
管理定價默認情況下對於以羅布幣定價的訂閱啟用,無法關閉。欲了解更多信息,請參見 Create subscriptions。
對於以本地貨幣定價的訂閱,不提供管理定價。
對於角色物品
要為角色物品啟用管理定價,請參閱 Pricing 在發布到市場頁面。
檢查動態定價
當您啟用管理定價時,物品的價格會根據不同地區的用戶調整,無論是遊戲內出售還是外部出售。然而,如果您在遊戲的UI中硬編碼了價格,該數字不會更新,因為它並不是動態的或可由Roblox訪問的。因此,用戶會按照正確的地區特定價格進行收費,但UI仍然顯示硬編碼的值。
動態價格檢查工具會使用假羅布幣價格或假經濟位置更新您遊戲內所有出售的物品,幫助您識別哪些價格在遊戲的UI中是硬編碼的,哪些是以 MarketplaceService 動態編碼的,並且是由客戶端腳本調用的。在識別出硬編碼的通行證後,您可以更新它們以使用 MarketplaceService 函數。
使用動態價格檢查工具的方法:
- 進入 Monetization。
- 對於通行證,進入 Passes。
- 對於開發者產品,進入 Developer Products。
- 點擊 … 並選擇 Dynamic Price Check。
- 在 Add test accounts 下,輸入最多五個Roblox用戶以檢查硬編碼價格。
- 選擇測試類型。
- Price pinned 會使用設置的假羅布幣金額更新所有動態編碼的價格。
- Location pinned 會使用假經濟位置的地區特定價格更新所有動態編碼的價格。
- 點擊 Enable。幾分鐘後,進入您的遊戲以識別硬編碼的價格。
要禁用動態價格檢查工具,請進入 Dynamic Price Check 頁面並點擊 Disable。
有關硬編碼與動態編碼產品價格的更多信息,請參見 Check for dynamic pricing 在價格優化頁面上。關於使用 MarketplaceService 函數售賣通行證和開發者產品的更多信息,請參見 Sell a pass inside your game 和 Sell a developer product inside your game。
在遊戲中顯示地區價格
使用管理定價,用戶所見的價格可能會根據其位置而有所不同。如果您在自定義的遊戲內UI中顯示價格,例如 TextLabel,則可以在運行時檢索產品信息,以確保顯示的價格與購買提示中顯示的價格相符。
要顯示單個開發者產品或通行證的地區價格,請使用 GetProductInfoAsync。
要顯示所有開發者產品的地區價格,請使用 GetDeveloperProductsAsync。
保護您的交易和禮物
管理定價會影響遊戲內轉移,例如交易和贈送。由於地區之間的價格差異,可能會發生價格套利(利用相同產品之間的價格差異以獲取利潤)。為了管理套利的潛力,您可以使用 GetUsersPriceLevelsAsync API,該API使您可以確定用戶的相對價格水平,以便您可以實施邏輯根據這些水平調整物品轉移。
GetUsersPriceLevelsAsync 提供了一個從 1 到 1000 的數值,表示用戶的定價水平。這個值旨在表示用戶期望支付的全價的百分比。價格水平 1000 代表全全球價格,而較低的價格水平則表示用戶通常因其經濟位置支付較低價格。
較低的價格水平差異意味著全全球價格與用戶的管理價格之間的價格差距較小。較高的價格水平差異則意味著兩者之間的價格差距較大。例如:
- 用戶 A 的價格水平為 1000,代表全全球價格。此用戶為物品支付100%的基礎價格。
- 用戶 B 的價格水平為 500,代表全全球價格的50%。此用戶為物品支付基礎價格的50%。
- 一旦您了解每個用戶的價格水平,您可以根據他們的價格水平差異500選擇批准或阻止用戶 A 和用戶 B 之間的贈送或交易。
實施 GetUsersPriceLevelsAsync
要獲取參與物品轉移的用戶的價格水平,請在 MarketplaceService 中調用 GetUsersPriceLevelsAsync 函數。此函數以用戶ID數組作為其參數,並返回一個包含以下字段的 PriceLevelInfo 對象數組:
type PriceLevelInfo = {
UserId: number,
PriceLevel: number
}在實現該函數後,使用返回的價格水平來選擇是否允許物品轉移發生。例如,您可以允許具有較高價格水平的用戶向價格水平較低的用戶贈送物品,但僅允許具有相同價格水平的用戶之間進行交易。有關更多信息,請參見 可用示例。
有關 GetUsersPriceLevelsAsync API 的更多信息,請參見 MarketplaceService。
示例
示例展示如何在地區定價中使用 GetUsersPriceLevelsAsync。
示例 1:檢查用戶列表的價格水平
此示例顯示了如何檢索用戶列表的價格水平,這可以幫助您選擇是否要允許物品轉移發生。
-- 獲取 MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- 定義一個函數來檢索用戶列表的價格水平並創建一個 UserId 到 PriceLevel 的查找表
local function getPriceLevelsLookup(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- 將每個 PriceLevelInfo 映射到 UserId -> PriceLevel 查找表
local lookup = {}
for _, userData in ipairs(result) do
lookup[userData.UserId] = userData.PriceLevel
end
return lookup
else
warn("獲取價格水平時出錯:", result)
return nil
end
end
-- 使用佔位符 ID 的示例
local user1Id = 123456789
local user2Id = 987654321
-- 調用該函數並存儲結果
local priceLevels = getPriceLevelsLookup({user1Id, user2Id})
-- 如果成功,則打印每個用戶的級別
if priceLevels then
print("用戶 1 的價格水平:", priceLevels[user1Id])
print("用戶 2 的價格水平:", priceLevels[user2Id])
else
print("獲取價格水平失敗。")
end示例 2:比較發送者的價格水平與接收者的價格水平
此示例顯示了如何將發送者的價格水平與接收者的價格水平進行比較的 示例實現。這可以幫助您管理來自價格較高地區的用戶對來自價格較低地區的用戶的贈送。
-- 獲取 MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- 定義一個函數來檢索用戶列表的價格水平並創建一個 UserId 到 PriceLevel 的查找表
local function getPriceLevelsLookup(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- 將每個 PriceLevelInfo 映射到 UserId -> PriceLevel 查找表
local lookup = {}
for _, userData in ipairs(result) do
lookup[userData.UserId] = userData.PriceLevel
end
return lookup
else
warn("獲取價格水平時出錯:", result)
return nil
end
end
-- 定義一個函數,檢查發送者的價格水平是否高於或等於接收者的價格水平
-- 參數是發送物品的玩家和接收物品的玩家
-- 如果發送者的價格水平大於或等於接收者的價格水平,則函數返回 true
function isSenderPriceLevelHigherOrEqualforGifting(sender, recipient)
local priceLevelsLookup = getPriceLevelsLookup({ sender.UserId, recipient.UserId })
if not priceLevelsLookup then
error("MarketplaceService:GetUsersPriceLevelsAsync 失敗。無法獲取用戶價格水平。")
end
local senderPriceLevel = priceLevelsLookup[sender.UserId]
local recipientPriceLevel = priceLevelsLookup[recipient.UserId]
return senderPriceLevel >= recipientPriceLevel
end示例 3:檢查兩個用戶是否具有相同的價格水平
此示例展示了如何檢查兩個用戶是否具有相同的價格水平的 示例實現。這可以幫助您管理交易,確保來自不同地區的用戶之間的公平交換。
-- 獲取 MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- 定義一個函數來檢索用戶列表的價格水平並創建一個 UserId 到 PriceLevel 的查找表
local function getPriceLevelsLookup(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- 將每個 PriceLevelInfo 映射到 UserId -> PriceLevel 查找表
local lookup = {}
for _, userData in ipairs(result) do
lookup[userData.UserId] = userData.PriceLevel
end
return lookup
else
warn("獲取價格水平時出錯:", result)
return nil
end
end
-- 定義一個函數,用於檢查兩個用戶是否具有相同的價格水平
-- 參數是您想比較價格水平的兩個用戶
-- 如果兩個用戶的價格水平相同,則函數返回 true
function haveSamePriceLevelForTrading(userA, userB)
local priceLevelsLookup = getPriceLevelsLookup({ userA.UserId, userB.UserId })
if not priceLevelsLookup then
error("MarketplaceService:GetUsersPriceLevelsAsync 失敗。無法獲取用戶價格水平。")
end
local userAPriceLevel = priceLevelsLookup[userA.UserId]
local userBPriceLevel = priceLevelsLookup[userB.UserId]
return userAPriceLevel == userBPriceLevel
end