RandomGFGoStop/Assets/Scripts/SingletonManagers/Managers/IAPManager.cs

171 lines
5.6 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Xml.Linq;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Purchasing;
using UnityEngine.Purchasing.Extension;
public class IAPManager : MonoBehaviour, IDetailedStoreListener
{
private IStoreController storeController; //구매 과정을 제어하는 함수 제공자
private IExtensionProvider storeExtensionProvider; //여러 플랫폼을 위한 확장 처리 제공자
private StringBuilder sb = new StringBuilder();
public UnityAction<string> OnProcessPurchase;
public UnityAction OnProcessPurchaseFailed;
private bool isInitialize = false;
private void Start()
{
if (GameManager.Network != null)
{
if (GameManager.Network.IsOnline)
{
InitUnityIAP(); //Start 문에서 초기화 필수
}
GameManager.Network.OnNetworkOnline += OnNetworkOnline;
}
}
/* Unity IAP를 초기화하는 함수 */
private void InitUnityIAP()
{
ConfigurationBuilder builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
/* 구글 플레이 상품들 추가 */
builder.AddProduct("ads_remove", ProductType.Consumable, new IDs() { { "ads_remove", GooglePlay.Name } });
builder.AddProduct("heart_10", ProductType.Consumable, new IDs() { { "heart_10", GooglePlay.Name } });
builder.AddProduct("heart_60", ProductType.Consumable, new IDs() { { "heart_60", GooglePlay.Name } });
builder.AddProduct("heart_130", ProductType.Consumable, new IDs() { { "heart_130", GooglePlay.Name } });
builder.AddProduct("key_20", ProductType.Consumable, new IDs() { { "key_20", GooglePlay.Name } });
builder.AddProduct("key_45", ProductType.Consumable, new IDs() { { "key_45", GooglePlay.Name } });
builder.AddProduct("key_75", ProductType.Consumable, new IDs() { { "key_75", GooglePlay.Name } });
UnityPurchasing.Initialize(this, builder);
isInitialize = true;
}
/* 구매하는 함수 */
public void Purchase(string productId)
{
Product product = storeController.products.WithID(productId); //상품 정의
if (product != null && product.availableToPurchase) //상품이 존재하면서 구매 가능하면
{
storeController.InitiatePurchase(product); //구매가 가능하면 진행
}
else //상품이 존재하지 않거나 구매 불가능하면
{
Debug.Log("상품이 없거나 현재 구매가 불가능합니다");
}
}
/* 초기화 성공 시 실행되는 함수 */
public void OnInitialized(IStoreController controller, IExtensionProvider extension)
{
Debug.Log("초기화에 성공했습니다");
storeController = controller;
storeExtensionProvider = extension;
}
/* 초기화 실패 시 실행되는 함수 */
public void OnInitializeFailed(InitializationFailureReason error)
{
sb.Clear();
sb.Append("IAPManager: OnInitializeFailed: ").Append(error.ToString());
Debug.LogError(sb.ToString());
}
public void OnInitializeFailed(InitializationFailureReason error, string message)
{
sb.Clear();
sb.Append("IAPManager: OnInitializeFailed: ").Append(error.ToString()).Append(": ").Append(message);
Debug.LogError(sb.ToString());
}
/* 구매에 실패했을 때 실행되는 함수 */
public void OnPurchaseFailed(Product product, PurchaseFailureDescription failureDescription)
{
sb.Clear();
sb.Append("IAPManager: OnPurchaseFailed: ").Append(product.ToString()).Append(failureDescription.reason.ToString());
Debug.LogError(sb.ToString());
OnProcessPurchase?.Invoke("FailPurchase");
}
public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
{
sb.Clear();
sb.Append("IAPManager: OnPurchaseFailed: ").Append(product.ToString()).Append(failureReason.ToString());
Debug.LogError(sb.ToString());
OnProcessPurchase?.Invoke("FailPurchase");
}
/* 구매를 처리하는 함수 */
public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs args)
{
Debug.Log("IAPManager: SuccessPurchase");
AddProductItem(args.purchasedProduct.definition.id);
OnProcessPurchase?.Invoke(args.purchasedProduct.definition.id);
return PurchaseProcessingResult.Complete;
}
private void OnNetworkOnline(bool isOnline)
{
if(isOnline == true && isInitialize == false)
{
InitUnityIAP();
}
}
public void AddProductItem(string id)
{
switch (id)
{
case "ads_remove":
GameManager.DB.RemoveADS();
GameManager.ADS.HideBanner();
GameManager.UI.ShowNStackPopup(EPopupType.ADSRemovePopup);
break;
case "heart_10":
GameManager.DB.AddHeart(10, this.name);
break;
case "heart_60":
GameManager.DB.AddHeart(60, this.name);
break;
case "heart_130":
GameManager.DB.AddHeart(130, this.name);
break;
case "key_20":
GameManager.DB.AddKey(20, this.name);
break;
case "key_45":
GameManager.DB.AddKey(45, this.name);
break;
case "key_75":
GameManager.DB.AddKey(75, this.name);
break;
}
}
}