반응형
유니티 플레이팹 아이템 구매 Playfab Shop Purchase Item 간단 사용법
플레이팹 로그인이 되었다는 가정하에 진행
유니티 플레이팹 게스트 로그인 Playfab Sign In with Guest Login 간단 사용법
코드 작성 using PlayFab; using PlayFab.ClientModels; using PlayFab.Json; using PlayFab.ProfilesModels; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using EntityKey = PlayFab.ProfilesMod
parksh3641.tistory.com
코드 작성
using System;
using System.Collections.Generic;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;
public class PlayfabManager : MonoBehaviour
{
// 구매 결과 이벤트
public event Action<PurchaseItemResult> OnPurchaseSuccess;
public event Action<string> OnPurchaseFailed;
// 에러 핸들러
private void DisplayPlayfabError(PlayFabError error)
{
string errorMessage = "PlayFab 오류: " + error.GenerateErrorReport();
Debug.LogError(errorMessage);
OnPurchaseFailed?.Invoke(errorMessage);
}
// 아이템 구매 함수
public void PurchaseItem(string itemId, int price, string virtualCurrency, string catalogVersion = "Main", string storeId = "")
{
// 파라미터 검증
if (string.IsNullOrEmpty(itemId))
{
string errorMsg = "아이템 ID가 비어있습니다.";
Debug.LogError(errorMsg);
OnPurchaseFailed?.Invoke(errorMsg);
return;
}
if (price < 0)
{
string errorMsg = "가격은 0 이상이어야 합니다.";
Debug.LogError(errorMsg);
OnPurchaseFailed?.Invoke(errorMsg);
return;
}
if (string.IsNullOrEmpty(virtualCurrency))
{
string errorMsg = "가상 화폐 타입이 비어있습니다.";
Debug.LogError(errorMsg);
OnPurchaseFailed?.Invoke(errorMsg);
return;
}
Debug.Log($"아이템 구매 시도: {itemId}, 가격: {price} {virtualCurrency}");
var request = new PurchaseItemRequest()
{
CatalogVersion = catalogVersion,
StoreId = storeId,
ItemId = itemId,
Price = price,
VirtualCurrency = virtualCurrency
};
PlayFabClientAPI.PurchaseItem(request,
result => {
Debug.Log($"아이템 구매 성공! {itemId}");
// 구매한 아이템 정보 로깅
if (result.Items != null && result.Items.Count > 0)
{
foreach (var item in result.Items)
{
Debug.Log($"구매한 아이템: {item.DisplayName ?? item.ItemId}, 남은 사용 횟수: {item.RemainingUses}");
}
}
// 이벤트 발생
OnPurchaseSuccess?.Invoke(result);
// 구매 후 인벤토리 자동 갱신
RefreshInventory();
},
error => {
// 특정 에러 처리
if (error.Error == PlayFabErrorCode.InsufficientFunds)
{
string errorMsg = "가상 화폐가 부족합니다.";
Debug.LogError(errorMsg);
OnPurchaseFailed?.Invoke(errorMsg);
}
else if (error.Error == PlayFabErrorCode.ItemNotFound)
{
string errorMsg = "존재하지 않는 아이템입니다.";
Debug.LogError(errorMsg);
OnPurchaseFailed?.Invoke(errorMsg);
}
else
{
DisplayPlayfabError(error);
}
}
);
}
// 인벤토리 새로고침
private void RefreshInventory()
{
PlayFabClientAPI.GetUserInventory(new GetUserInventoryRequest(),
result => {
Debug.Log("인벤토리 갱신 완료");
// 현재 가상 화폐 정보 로깅
if (result.VirtualCurrency != null)
{
foreach (var currency in result.VirtualCurrency)
{
Debug.Log($"가상 화폐: {currency.Key}, 잔액: {currency.Value}");
}
}
},
DisplayPlayfabError
);
}
// 카탈로그에서 아이템 확인
public void GetCatalogItems(string catalogVersion = "Main")
{
PlayFabClientAPI.GetCatalogItems(new GetCatalogItemsRequest
{
CatalogVersion = catalogVersion
},
result => {
Debug.Log($"카탈로그 아이템 로드 성공! 총 {result.Catalog.Count}개의 아이템이 있습니다.");
// 아이템 정보 로깅
foreach (var item in result.Catalog)
{
Debug.Log($"아이템: {item.DisplayName ?? item.ItemId}, 설명: {item.Description ?? "설명 없음"}");
}
},
DisplayPlayfabError);
}
// 특정 상점의 아이템 확인
public void GetStoreItems(string storeId, string catalogVersion = "Main")
{
if (string.IsNullOrEmpty(storeId))
{
Debug.LogError("상점 ID가 비어있습니다.");
return;
}
PlayFabClientAPI.GetStoreItems(new GetStoreItemsRequest
{
StoreId = storeId,
CatalogVersion = catalogVersion
},
result => {
Debug.Log($"상점 아이템 로드 성공! 상점 {storeId}에 총 {result.Store.Count}개의 아이템이 있습니다.");
// 아이템 정보 로깅
foreach (var item in result.Store)
{
Debug.Log($"상점 아이템: {item.ItemId}");
// 가격 정보 로깅
if (item.VirtualCurrencyPrices != null)
{
foreach (var price in item.VirtualCurrencyPrices)
{
Debug.Log($" 가격: {price.Value} {price.Key}");
}
}
}
},
DisplayPlayfabError);
}
}
다른 기능 구현하기
유니티 플레이팹 아이템 주기 Playfab Grant Item ToUser 간단 사용법
플레이팹 로그인이 되었다는 가정하에 진행 유니티 플레이팹 게스트 로그인 Playfab Sign In with Guest Login 간단 사용법 코드 작성 using PlayFab; using PlayFab.ClientModels; using PlayFab.Json; using PlayFab.ProfilesModel
parksh3641.tistory.com
반응형