[Unity] IAP(In App Purchasing) 모듈을 사용하여 Google Play 인앱 결제 기능 구현
Unity에서는 IAP모듈로 간단하게 인앱 결제 기능을 구현 할 수 있다.
1. Unity 내부의 IAP 패키지를 설치한다.
Window - Package Manager - Packages: Unity Registry - In App Purchasing - Install
2. 설치가 완료되면 결제 정보를 설정한다.
1) Project Settings 를 눌러 설정 창으로 이동 한다.
창을 종료 했을 경우 Services - In-App Purchasing - Configure... 이동
2) 13세 미만 대상에게 결제를 허용할 거면 'Yes', 아니면 'No'를 선택한다.
3) 패키지를 설정을 활성화 시켜주고 License Key를 입력한다.
4) License Key는 Google Play Console 사이트에서 가져 올 수 있다.
Google Play Console - 수익 창출 설정 - 라이선스
3. 스크립트 작성
InitUnityIAP() : 결제 모듈 초기화, UnityPruchasing.Initialize() : 초기화 프로세스를 시작, 리스너 구현 및 구성 정보 제공
OnInitializeFailed() : 초기화 실패 시 호출
OnInitialized() : 초기화 성공 시 호출
Purchase() : 구매 시도, storeController.InitiatePurchase() : 구매 진행
OnPurchaseFailed() : 구매 실패 시 호출
ProcessPurchase() : 구매 성공 시 호출
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Purchasing;
public class IAPManager : MonoBehaviour, IStoreListener
{
private IStoreController storeController;
private IExtensionProvider storeExtensionProvider;
private static IAPManager instance;
private string[] itemList = {"item-01", "item-02", "item-03", "item-04", "item-05"};
private void InitUnityIAP()
{
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
builder.AddProduct(itemRemoveAdsId, ProductType.NonConsumable, new IDs(){{itemRemoveAdsId, GooglePlay.Name}});
foreach (string id in itemList)
{
builder.AddProduct(id, ProductType.NonConsumable, new IDs(){{id, GooglePlay.Name}});
}
UnityPurchasing.Initialize(this, builder);
}
public void OnInitialized(IStoreController controller, IExtensionProvider extension)
{
Debug.Log("유니티 IAP 초기화 성공");
storeController = controller;
storeExtensionProvider = extension;
}
public void OnInitializeFailed(InitializationFailureReason error)
{
Debug.LogError($"유니티 IAP 초기화 실패 {error}");
}
public void OnInitializeFailed(InitializationFailureReason error, string message)
{
Debug.LogError($"유니티 IAP 초기화 실패 {error} {message}");
}
public void OnPurchaseFailed(Product product, PurchaseFailureReason reason)
{
Debug.LogWarning($"구매 실패 - {product.definition.id}, {reason}");
}
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
var product = args.purchasedProduct;
string productId = product.definition.id;
Debug.Log($"구매 성공 - ID : {product.definition.id}");
return PurchaseProcessingResult.Complete;
}
public void Purchase(string productId)
{
var product = storeController.products.WithID(productId);
if (product != null && product.availableToPurchase) {
Debug.Log($"구매 시도 - {product.definition.id}");
storeController.InitiatePurchase(product);
} else {
Debug.Log($"구매 시도 불가 - {productId}");
}
}
public static IAPManager Instance {
get {
if (instance != null) {
return instance;
}
instance = FindObjectOfType<IAPManager>();
if (instance == null) {
instance = new GameObject("IAP Manager").AddComponent<IAPManager>();
}
return instance;
}
}
private void Awake()
{
if (instance != null && instance != this) {
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
InitUnityIAP();
}
}
4. 구매 버튼 연동
ex)
void OnClick() {
IAPManager.instance.Purchase("item-01");
}
댓글
댓글 쓰기