Với Giá cả được Quản lý, bạn có thể cung cấp giá theo vùng cho các mặt hàng của mình và xây dựng một nền kinh tế toàn cầu toàn diện và dễ tiếp cận hơn. Sau khi bạn xác định một mức giá toàn cầu mặc định cho một mặt hàng, Roblox sử dụng nhiều tín hiệu khác nhau như sức mua của khu vực, tỷ giá hối đoái và hành vi chi tiêu địa phương để thiết lập mức giá phù hợp nhất cho mặt hàng đó theo từng vùng.
Bạn có thể chọn những mặt hàng nào muốn định giá theo vùng. Khi bạn bật tính năng Giá cả được Quản lý cho một mặt hàng trong trò chơi của bạn, Roblox sẽ tự động điều chỉnh giá của mặt hàng đó cho người dùng dựa trên vị trí kinh tế của họ.
Vị trí kinh tế không phải lúc nào cũng giống với vị trí tài khoản. Để xác định vị trí kinh tế của người dùng, Roblox xem xét các tín hiệu, bao gồm việc sử dụng VPN, lịch sử thanh toán và lịch sử tài khoản. Nếu vị trí kinh tế của họ không thể xác định được, người dùng sẽ thấy mức giá toàn cầu mặc định cho mặt hàng đó.
Để ngăn chặn việc chênh lệch giá khi người dùng tặng hoặc trao đổi các mặt hàng có giá được quản lý khác nhau, bạn có thể quản lý các giao dịch trong trò chơi bằng API GetUsersPriceLevelsAsync.
Bật giá cả theo vùng
Đối với thẻ
Giá cả theo vùng được bật theo mặc định cho tất cả các thẻ mới và hiện có thông qua Giá cả được quản lý.
Để tắt tính năng giá được quản lý cho một thẻ:
- Truy cập Tạo và chọn một trò chơi.
- Đi tới Monetization ⟩ Passes.
- Chọn một hoặc nhiều thẻ hiện có.
- Nhấn Tắt giá được quản lý.
- TÙY CHỌNĐể xem giá được quản lý theo quốc gia hoặc khu vực, chọn một thẻ và truy cập trang Sales của nó. Danh sách Top Countries/Regions sẽ cập nhật để hiển thị các mức giá đã điều chỉnh dựa trên giá mặc định của thẻ. Để xem giá cho tất cả các quốc gia và khu vực, nhấn Xem tất cả các quốc gia.
Đối với sản phẩm của nhà phát triển
Để bật giá cả được quản lý cho một sản phẩm của nhà phát triển:
- Kiểm tra rằng sản phẩm của bạn có giá được kịch bản động.
- Triển khai phương thức GetUsersPriceLevelsAsync để điều chỉnh các giao dịch mặt hàng dựa trên mức giá của người dùng.
- Truy cập Tạo và chọn một trò chơi.
- Đi tới Monetization ⟩ Sản phẩm của nhà phát triển.
- Chọn một hoặc nhiều sản phẩm hiện có, hoặc tạo một sản phẩm mới.
- Nhấn Bật giá được quản lý.
- TÙY CHỌNĐể xem Giá cả được quản lý theo quốc gia hoặc khu vực, chọn một sản phẩm và truy cập trang Basic Settings của nó. Danh sách Top Countries/Regions sẽ cập nhật để hiển thị các mức giá đã điều chỉnh dựa trên giá mặc định của sản phẩm. Để xem Giá cả được quản lý cho tất cả các quốc gia và khu vực, nhấn Xem tất cả các quốc gia.
Đối với các gói đăng ký
Giá cả được quản lý được bật theo mặc định cho các gói đăng ký có giá bằng Robux và không thể tắt được. Để biết thêm thông tin, xem Tạo gói đăng ký.
Giá cả được quản lý không có sẵn cho các gói đăng ký có giá bằng tiền tệ địa phương.
Đối với mặt hàng Avatar
Để bật Giá cả được quản lý cho một mặt hàng Avatar, xem Giá cả trong trang Xuất bản lên Marketplace.
Kiểm tra giá kịch bản động
Khi bạn bật Giá cả được quản lý, giá của mặt hàng sẽ điều chỉnh cho người dùng ở các vùng khác nhau cho dù nó được bán trong hay ngoài trò chơi của bạn. Tuy nhiên, nếu bạn đã cố định giá trong giao diện người dùng của trò chơi, con số đó sẽ không được cập nhật vì nó không động hoặc không thể truy cập được bởi Roblox. Do đó, người dùng sẽ bị tính phí giá cụ thể cho khu vực nhưng giao diện người dùng vẫn hiển thị giá cố định.
Công cụ kiểm tra giá động sẽ cập nhật tất cả các mặt hàng được bán trong trò chơi của bạn với một mức giá Robux giả hoặc một vị trí kinh tế giả để giúp bạn xác định những mức giá nào bị cố định trong giao diện người dùng của trò chơi và những mức giá nào được kịch bản động với MarketplaceService và được gọi từ một kịch bản khách hàng. Sau khi bạn đã xác định các thẻ bị cố định, bạn có thể cập nhật chúng để sử dụng các hàm của MarketplaceService.
Để sử dụng công cụ kiểm tra giá động:
- Truy cập Monetization.
- Đối với các thẻ, đi tới Thẻ.
- Đối với sản phẩm của nhà phát triển, đi tới Sản phẩm của nhà phát triển.
- Nhấn … và chọn Kiểm tra giá động.
- Dưới Thêm tài khoản thử nghiệm, nhập tối đa năm người dùng Roblox để kiểm tra các giá cố định.
- Chọn một loại kiểm tra.
- Giá đã ghim sẽ cập nhật tất cả các giá được kịch bản động với một số Robux giả định.
- Vị trí đã ghim sẽ cập nhật tất cả các giá được kịch bản động với một giá cụ thể cho một vị trí kinh tế giả định.
- Nhấn Bật. Sau vài phút, truy cập trò chơi của bạn để xác định các giá cố định.
Để tắt công cụ kiểm tra giá động, truy cập trang Kiểm tra giá động và nhấn Tắt.
Để biết thêm thông tin về giá cố định so với giá được kịch bản động của sản phẩm, xem Kiểm tra giá kịch bản động trong trang Tối ưu hóa giá. Để biết thêm thông tin về việc bán thẻ và sản phẩm của nhà phát triển với các hàm của MarketplaceService, xem Bán một thẻ trong trò chơi của bạn và Bán một sản phẩm của nhà phát triển trong trò chơi của bạn.
Hiển thị giá cả theo vùng trong trò chơi của bạn
Với Giá cả được quản lý, giá mà người dùng thấy có thể thay đổi dựa trên vị trí của họ. Nếu bạn hiển thị giá trong một giao diện người dùng tùy chỉnh trong trò chơi, như một TextLabel, bạn có thể truy xuất thông tin sản phẩm tại thời gian chạy để đảm bảo rằng giá hiển thị khớp với giá được hiển thị trong thông báo mua.
Để hiển thị giá theo vùng cho một sản phẩm của nhà phát triển hoặc thẻ đơn lẻ, sử dụng GetProductInfoAsync.
Để hiển thị giá theo vùng cho tất cả các sản phẩm của nhà phát triển, sử dụng GetDeveloperProductsAsync.
Bảo vệ giao dịch và quà tặng của bạn
Giá cả được quản lý có thể ảnh hưởng đến các giao dịch trong trò chơi như trao đổi và tặng quà. Do sự khác biệt về giá ở các vùng khác nhau, chênh lệch giá (khai thác sự khác biệt giá giữa các sản phẩm giống nhau để tạo lợi nhuận) có thể xảy ra. Để quản lý khả năng xảy ra chênh lệch giá, bạn có thể sử dụng API GetUsersPriceLevelsAsync, cho phép bạn xác định các mức giá tương đối của người dùng để từ đó bạn có thể triển khai logic điều phối các giao dịch mặt hàng dựa trên các mức giá này.
GetUsersPriceLevelsAsync cung cấp một giá trị số giữa 1 và 1000 cho biết mức giá của một người dùng. Giá trị này được thiết kế để đại diện cho tỷ lệ phần trăm của giá đầy đủ mà một người dùng sẽ phải trả. Mức giá 1000 đại diện cho giá toàn cầu đầy đủ, trong khi các mức giá thấp hơn cho thấy người dùng thường trả giá thấp hơn do vị trí kinh tế của họ.
Một sự khác biệt ở mức giá thấp hơn có nghĩa là có mức chênh lệch giá nhỏ hơn giữa giá toàn cầu đầy đủ và giá được quản lý của người dùng. Một sự khác biệt ở mức giá cao hơn có nghĩa là có mức chênh lệch giá lớn hơn giữa hai mức. Ví dụ:
- Người dùng A có mức giá 1000, đại diện cho giá toàn cầu đầy đủ. Người dùng này trả 100% giá cơ sở cho một mặt hàng.
- Người dùng B có mức giá 500, đại diện cho 50% giá toàn cầu đầy đủ. Người dùng này trả 50% giá cơ sở cho một mặt hàng.
- Khi bạn biết mức giá của mỗi người dùng, bạn có thể chọn phê duyệt hoặc chặn việc tặng quà hoặc trao đổi giữa Người dùng A và Người dùng B dựa trên chênh lệch mức giá của họ là 500.
Triển khai GetUsersPriceLevelsAsync
Để có được mức giá của các người dùng tham gia vào một giao dịch mặt hàng, gọi hàm GetUsersPriceLevelsAsync trong MarketplaceService. Hàm này nhận một mảng các ID người dùng làm đối số và trả về một mảng các đối tượng PriceLevelInfo với các trường sau:
type PriceLevelInfo = {
UserId: number,
PriceLevel: number
}Sau khi triển khai hàm, sử dụng các mức giá trả về để lựa chọn xem bạn có muốn cho phép một giao dịch mặt hàng diễn ra hay không. Ví dụ, bạn có thể cho phép người dùng có mức giá cao hơn tặng mặt hàng cho người dùng có mức giá thấp hơn, nhưng chỉ cho phép trao đổi giữa những người dùng có cùng một mức giá với nhau. Xem các ví dụ có sẵn để biết thêm thông tin.
Để biết thêm thông tin về API GetUsersPriceLevelsAsync, xem MarketplaceService.
Ví dụ
Ví dụ về cách bạn có thể sử dụng GetUsersPriceLevelsAsync với giá cả theo vùng.
Ví dụ 1: Kiểm tra mức giá cho một danh sách người dùng
Ví dụ này cho bạn thấy cách truy xuất mức giá cho một danh sách người dùng, điều này có thể giúp bạn chọn liệu bạn có muốn cho phép một giao dịch mặt hàng diễn ra hay không.
-- Lấy MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Định nghĩa một hàm để truy xuất mức giá cho một danh sách người dùng và tạo một bảng tra cứu UserId sang PriceLevel
local function getPriceLevelsLookup(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- Ánh xạ mỗi PriceLevelInfo sang bảng tra cứu UserId -> PriceLevel
local lookup = {}
for _, userData in ipairs(result) do
lookup[userData.UserId] = userData.PriceLevel
end
return lookup
else
warn("Lỗi khi lấy mức giá:", result)
return nil
end
end
-- Ví dụ sử dụng ID tạm placeholder
local user1Id = 123456789
local user2Id = 987654321
-- Gọi hàm và lưu trữ kết quả
local priceLevels = getPriceLevelsLookup({user1Id, user2Id})
-- Nếu thành công, in mức giá của từng người dùng
if priceLevels then
print("Mức giá cho Người dùng 1:", priceLevels[user1Id])
print("Mức giá cho Người dùng 2:", priceLevels[user2Id])
else
print("Không thể lấy mức giá.")
endVí dụ 2: So sánh mức giá của người gửi với mức giá của người nhận
Ví dụ này cho bạn một triển khai mẫu của cách kiểm tra mức giá của người gửi với mức giá của người nhận. Điều này có thể giúp bạn quản lý việc tặng quà từ người dùng ở các khu vực có giá cao hơn cho người dùng ở các khu vực có giá thấp hơn.
-- Lấy MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Định nghĩa một hàm để truy xuất mức giá cho một danh sách người dùng và tạo một bảng tra cứu UserId sang PriceLevel
local function getPriceLevelsLookup(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- Ánh xạ mỗi PriceLevelInfo sang bảng tra cứu UserId -> PriceLevel
local lookup = {}
for _, userData in ipairs(result) do
lookup[userData.UserId] = userData.PriceLevel
end
return lookup
else
warn("Lỗi khi lấy mức giá:", result)
return nil
end
end
-- Định nghĩa một hàm kiểm tra xem người gửi có mức giá cao hơn hoặc bằng của người nhận không
-- Các tham số là Người chơi gửi mặt hàng và Người chơi nhận mặt hàng
-- Hàm trả về true nếu mức giá của người gửi lớn hơn hoặc bằng mức giá của người nhận
function isSenderPriceLevelHigherOrEqualforGifting(sender, recipient)
local priceLevelsLookup = getPriceLevelsLookup({ sender.UserId, recipient.UserId })
if not priceLevelsLookup then
error("MarketplaceService:GetUsersPriceLevelsAsync thất bại. Không thể truy xuất mức giá của người dùng.")
end
local senderPriceLevel = priceLevelsLookup[sender.UserId]
local recipientPriceLevel = priceLevelsLookup[recipient.UserId]
return senderPriceLevel >= recipientPriceLevel
endVí dụ 3: Kiểm tra xem hai người dùng có cùng mức giá không
Ví dụ này cho bạn một triển khai mẫu của cách kiểm tra xem hai người dùng có cùng mức giá không. Điều này có thể giúp bạn quản lý việc trao đổi và đảm bảo một giao dịch công bằng giữa những người dùng từ các khu vực khác nhau.
-- Lấy MarketplaceService
local MarketplaceService = game:GetService("MarketplaceService")
-- Định nghĩa một hàm để truy xuất mức giá cho một danh sách người dùng và tạo một bảng tra cứu UserId sang PriceLevel
local function getPriceLevelsLookup(userIds)
local success, result = pcall(function()
return MarketplaceService:GetUsersPriceLevelsAsync(userIds)
end)
if success then
-- Ánh xạ mỗi PriceLevelInfo sang bảng tra cứu UserId -> PriceLevel
local lookup = {}
for _, userData in ipairs(result) do
lookup[userData.UserId] = userData.PriceLevel
end
return lookup
else
warn("Lỗi khi lấy mức giá:", result)
return nil
end
end
-- Định nghĩa một hàm kiểm tra xem hai người dùng có cùng mức giá không
-- Các tham số là hai người dùng mà bạn muốn so sánh mức giá của họ
-- Hàm trả về true nếu cả hai người dùng có cùng mức giá
function haveSamePriceLevelForTrading(userA, userB)
local priceLevelsLookup = getPriceLevelsLookup({ userA.UserId, userB.UserId })
if not priceLevelsLookup then
error("MarketplaceService:GetUsersPriceLevelsAsync thất bại. Không thể truy xuất mức giá của người dùng.")
end
local userAPriceLevel = priceLevelsLookup[userA.UserId]
local userBPriceLevel = priceLevelsLookup[userB.UserId]
return userAPriceLevel == userBPriceLevel
end