관리된 가격 책정을 사용하면 지역에 따라 특정 가격을 제공하여 보다 포괄적이고 접근 가능한 글로벌 경제를 구축할 수 있습니다. 아이템의 기본 글로벌 가격을 결정하면, Roblox는 지역의 구매력, 환율, 지역 지출 행동과 같은 다양한 신호를 사용하여 각 지역에 맞는 가장 적절한 가격을 설정합니다.
지역적으로 가격을 책정할 아이템을 선택할 수 있습니다. 게임의 아이템에 대해 관리된 가격 책정을 활성화하면, Roblox는 사용자의 경제 위치에 따라 해당 아이템의 가격을 자동으로 조정합니다.
경제 위치는 항상 계정 위치와 같지 않을 수 있습니다. 사용자의 경제 위치를 결정하기 위해, Roblox는 VPN 사용, 청구 내역, 계정 내역을 포함한 신호를 살펴봅니다. 사용자의 경제 위치를 확인할 수 없는 경우, 사용자는 아이템에 대한 기본 글로벌 가격을 보게 됩니다.
사용자들이 서로 다른 관리된 가격을 가진 아이템을 선물하거나 교환할 때 가격 차익 거래를 방지하기 위해, GetUsersPriceLevelsAsync API로 인게임 전송을 관리할 수 있습니다.
지역 가격 책정 활성화
패스를 위한
모든 신규 및 기존 패스에 대해 기본적으로 지역 가격 책정이 관리된 가격 책정으로 활성화되어 있습니다.
패스에 대해 관리된 가격 책정을 비활성화하려면:
- Creations로 이동하여 게임을 선택합니다.
- Monetization ⟩ Passes로 이동합니다.
- 하나 이상의 기존 패스를 선택합니다.
- Disable Managed Pricing를 클릭합니다.
- OPTIONAL각 국가나 지역별로 관리된 가격을 보려면 패스를 선택하고 Sales 페이지로 이동합니다. Top Countries/Regions 목록은 패스의 기본 가격에 따라 조정된 가격을 표시하도록 업데이트됩니다. 모든 국가 및 지역의 가격을 보려면 View all countries를 클릭합니다.
개발자 제품을 위한
개발자 제품에 대해 관리된 가격 책정을 활성화하려면:
- 개발자 제품에 동적으로 스크립트된 가격이 있는지 확인합니다.
- Creations로 이동하여 게임을 선택합니다.
- Monetization ⟩ Developer Products로 이동합니다.
- 하나 이상의 기존 제품을 선택하거나 새 제품을 만들습니다.
- Enable Managed Pricing를 클릭합니다.
- OPTIONAL각 국가 또는 지역별로 관리된 가격을 보려면 제품을 선택하고 Basic Settings 페이지로 이동합니다. Top Countries/Regions 목록은 제품의 기본 가격에 따라 조정된 가격을 표시하도록 업데이트됩니다. 모든 국가 및 지역의 관리된 가격을 보려면 View all countries를 클릭합니다.
구독을 위한
관리된 가격은 Robux로 가격이 책정된 구독에 대해 기본적으로 활성화되어 있으며, 비활성화할 수 없습니다. 자세한 내용은 구독 만들기를 참조하십시오.
로컬 통화로 가격이 책정된 구독에 대해서는 관리된 가격이 제공되지 않습니다.
아바타 아이템을 위한
아바타 아이템에 대해 관리된 가격 책정을 활성화하려면 가격 책정 항목을 참조하십시오.
동적 가격 체크
관리된 가격 책정을 활성화하면 아이템의 가격이 게임 내부 또는 외부에서 판매 중인 경우 각 지역의 사용자에 맞게 조정됩니다. 그러나 게임 UI에 가격을 하드코딩한 경우, 해당 숫자는 동적이지 않거나 Roblox에서 접근할 수 없기 때문에 업데이트되지 않습니다. 결과적으로, 사용자는 올바른 지역별 가격을 지불하지만 UI에는 여전히 하드코딩된 값이 표시됩니다.
동적 가격 체크 도구는 가짜 Robux 가격 또는 가짜 경제 위치를 사용하여 게임 내에서 판매되는 모든 아이템을 업데이트하여 가격이 하드코딩되었는지 동적으로 스크립트되었는지를 확인하는 데 도움이 됩니다. 하드코딩된 패스를 확인한 후에 MarketplaceService 기능을 사용하도록 업데이트할 수 있습니다.
동적 가격 체크 도구를 사용하려면:
- Monetization으로 이동합니다.
- 패스의 경우, Passes로 이동합니다.
- 개발자 제품의 경우, Developer Products로 이동합니다.
- **…**를 클릭하고 Dynamic Price Check를 선택합니다.
- Add test accounts 아래에 하드코딩된 가격을 확인할 Roblox 사용자 최대 5명을 입력합니다.
- 테스트 유형을 선택합니다.
- Price pinned는 모든 동적으로 스크립트된 가격을 설정된 가짜 Robux 금액으로 업데이트합니다.
- Location pinned는 모든 동적으로 스크립트된 가격을 가짜 경제 위치의 지역별 가격으로 업데이트합니다.
- Enable를 클릭합니다. 몇 분 후에 게임에 들어가 하드코딩된 가격을 확인합니다.
동적 가격 체크 도구를 비활성화하려면 Dynamic Price Check 페이지로 이동하여 Disable을 클릭합니다.
하드코딩된 가격과 동적으로 스크립트된 제품 가격에 대한 자세한 내용은 가격 최적화 페이지의 동적 가격 확인을 참조하십시오. MarketplaceService 기능을 사용하여 패스 및 개발자 제품 판매에 대한 자세한 내용은 게임 내에서 패스 판매 및 게임 내에서 개발자 제품 판매를 참조하십시오.
게임에서 지역 가격 표시
관리된 가격 책정을 사용하면 사용자가 보는 가격이 위치에 따라 달라질 수 있습니다. 커스텀 인게임 UI(예: TextLabel)에서 가격을 표시하는 경우, 제품 정보를 런타임에 검색하여 표시된 가격이 구매 프롬프트에 표시된 가격과 일치하도록 할 수 있습니다.
단일 개발자 제품이나 패스에 대한 지역 가격을 표시하려면 GetProductInfoAsync를 사용합니다.
모든 개발자 제품에 대한 지역 가격을 표시하려면 GetDeveloperProductsAsync를 사용합니다.
거래 및 선물 보호
관리된 가격은 거래 및 선물과 같은 인게임 전송에 영향을 미칠 수 있습니다. 지역별 가격 차이로 인해 가격 차익 거래가 발생할 수 있습니다(동일한 제품 간의 가격 차이를 이용해 이익을 발생시키는 것). 가격 차익 거래의 가능성을 관리하기 위해, 사용자의 상대 가격 수준을 결정할 수 있는 GetUsersPriceLevelsAsync API를 사용할 수 있으며, 이를 통해 아이템 전송을 가격 수준에 따라 조정하는 로직을 구현할 수 있습니다.
GetUsersPriceLevelsAsync는 사용자의 가격 수준을 나타내는 1에서 1000 사이의 숫자 값을 제공합니다. 이 값은 사용자가 예상하는 전체 가격의 비율을 나타내도록 설계되었습니다. 가격 수준 1000은 전체 글로벌 가격을 나타내며, 낮은 가격 수준은 사용자가 경제 위치 때문에 일반적으로 낮은 가격을 지불함을 나타냅니다.
낮은 가격 수준 차이는 전체 글로벌 가격과 사용자의 관리된 가격 간의 가격 차이가 더 작음을 의미합니다. 높은 가격 수준 차이는 두 가격 간의 차이가 더 크다는 것을 의미합니다. 예를 들어:
- 사용자 A는 가격 수준 1000을 가지고 있으며, 이는 전체 글로벌 가격을 나타냅니다. 이 사용자는 아이템의 기본 가격을 100% 지불합니다.
- 사용자 B는 가격 수준 500을 가지고 있으며, 이는 전체 글로벌 가격의 50%를 나타냅니다. 이 사용자는 아이템의 기본 가격의 50%를 지불합니다.
- 각 사용자의 가격 수준을 알게 되면, 사용자 A와 사용자 B 간의 선물 또는 거래를 허가하거나 차단할 수 있습니다. 이 경우 가격 수준 차이는 500입니다.
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