-
Notifications
You must be signed in to change notification settings - Fork 0
Custom purchasing integration
유니티는 사용자가 Unity IAP를 구현하지 않고도 최적화된 수익화 기능을 활용할 수 있도록 지원합니다. 다음의 기초적인 단계들을 따라 자체적인 인앱 구매 솔루션을 유지하면서 동시에 Unity Ads 3.0+으로 IAP Promo를 생성하고 개인화 플레이스먼트를 활용해 보세요.
- 프로젝트에 Unity Ads SDK 3.0+을 설치합니다.
- Developer Dashboard에서 수동으로 제품 카탈로그를 구성합니다.
- 대시보드에서 IAP Promo를 구성합니다.
-
UnityPurchasing
API를 사용하여 게임 코드에서 구매 어댑터를 구현합니다. - 구매 어댑터 내에서 게임 로직 및 구매 이벤트를 구현합니다.
- 구매 어댑터와 수익화 SDK를 초기화합니다.
다음은 C#을 사용하는 Unity 개발자를 위한 지침입니다.
에셋 스토어에서 Unity Ads 최신 버전을 다운로드하여 사용하시기 바랍니다. 구매 통합을 위해 Monetization
API에 액세스하려면 SDK 3.0 또는 이상 버전이 필요합니다.
구매 어댑터를 구현하기 전에 Operate 탭(Developer Dashboard)으로 이동한 다음 제품 카탈로그 완성을 위한 수동 구성 지침을 따르십시오.
Operate 탭(Developer Dashboard)에서, IAP Promo 구성 지침을 따르십시오.
구매 어댑터는 Monetization
API의 후크로서 기능하여 커스텀 IAP 구현부에서 필요한 정보를 가져옵니다.
게임 스크립트에서 UnityEngine.Monetization
네임스페이스를 포함한 뒤에 구매 어댑터를 구현하는 클래스를 생성할 수 있습니다. 두 가지 함수인 RetrieveProducts
및 OnPurchase
를 사용하여 구매 어댑터에서 사용할 게임 로직을 정의할 수 있습니다. 이들 메서드는 IPurchasingAdapter
를 사용하는 클래스가 필요합니다. SDK가 제품 거래를 관리할 때 필요에 맞게 호출하려면 이를 반드시 구현해야 합니다.
using UnityEngine.Monetization;
public class IAPManager: MonoBehaviour, IPurchasingAdapter {
// Implement RetrieveProducts and OnPurchase functions here
}
SDK는 RetrieveProducts
를 호출하여 이용할 수 있는 제품의 목록을 가져옵니다. 함수는 IAP 제품을 Monetization.Product
오브젝트로 반드시 전환해야 합니다. 각 제품마다 최소 productID
, localizedPriceString
, productType
, isoCurrencyCode
및 localizedTitle
문자열이 필요합니다.
이 함수는 IRetrieveProductsListener
리스너를 받습니다. 리스너의 OnProductsRetrieved
함수를 호출하여 가져온 제품 목록을 SDK로 전송합니다.
사용자가 프로모션 에셋의 구매하기 버튼을 클릭하면 SDK는 OnPurchase
를 호출합니다. 구매 성공 또는 실패 핸들링은 인앱 구매 구현 방식에 따라 달라집니다.
거래가 성공하면 TransactionDetails
오브젝트를 사용하여 리스너의 onTransactionComplete 함수를 호출합니다.
거래가 실패하면 TransactionErrorDetails
오브젝트를 사용하여 리스너의 OnTransactionError
함수를 호출합니다.
using UnityEngine.Monetization;
public class IAPAdapter: MonoBehaviour, IPurchasingAdapter {
// Retrieve and provide your Product Catalog for the SDK:
public void RetrieveProducts (IRetrieveProductsListener listener) {
// Query your Products here, convert them to Monetization.Products, then populate the Product list with them:
List<Product> products = new List<Product> ();
products.Add (new Product) {
productId = "100bronzeCoins",
localizedTitle = "100 Bronze Coins",
localizedDescription = "Awesome Bronze Coins for a new low price!",
localizedPriceString = "$1.99",
isoCurrencyCode = "USD",
productType = "Consumable",
localizedPrice = 1.99m
});
// provide the retrieved Products list:
listener.OnProductsRetrieved (products);
}
// Define game logic for handling purchases:
public void OnPurchase (string productId, ITransactionListener listener, IDictionary<string, object> dict) {
// Example third-party purchasing function:
ThirdPartyPurchasing.purchaseProduct (productId);
// When ThirdPartyPurchasing succeeds:
listener.OnTransactionComplete (new TransactionDetails {
currency = "USD",
price = 1.99m,
productId = "100bronzeCoins",
transactionId = ThirdPartyPurchasing.transactionId,
receipt =
"{\n\"data\": \"{\\\"Store\\\":\\\"fake\\\",\\\"TransactionID\\\":\\\"ce7bb1ca-bd34-4ffb-bdee-83d2784336d8\\\",\\\"Payload\\\":\\\"{ \\\\\\\"this\\\\\\\": \\\\\\\"is a fake receipt\\\\\\\" }\\\"}\"\n}"
});
// When ThirdPartyPurchasing fails:
listener.OnTransactionError (new TransactionErrorDetails {
transactionError = TransactionError.NetworkCancelled,
exceptionMessage = "Test exception message",
store = Store.GooglePlay,
storeSpecificErrorCode = "Example: Google Play lost connection",
});
}
구매 어댑터를 구현했다면 SetPurchasingAdapter
를 사용하여 레퍼런스를 제공해야 합니다. 마지막으로, 해당 플랫폼에서 프로젝트의 게임 ID를 이용하여 SDK를 초기화해야 합니다. ID는 Developer Dashboard의 Operate 탭에서 프로젝트를 선택한 다음, 왼쪽 내비게이션에서 Monetization > Platforms를 선택하여 찾을 수 있습니다.
오류를 방지하려면 게임 런타임 수명주기에서 최대한 이른 시점에 이 호출을 구현하는 것이 좋습니다. 예:
Start () {
Monetization.SetPurchasingAdapter (GameObject.Find ("IAPManager").GetComponent<IAPAdapter> ());
Monetization.Initialize ("1234567", false);
}
이 예제에서, ‘IAPManager
’는 구매 어댑터를 확장하는 스크립트 컴포넌트 ‘IAPAdapter
’를 포함하는 GameObject입니다.
구현하여 SDK에 다시 전달하는 어댑터입니다.
public interface IPurchasingAdapter {
void RetrieveProducts (IRetrieveProductsListener listener);
void Purchase (string productID, ITransactionListener listener, IDictionary<string, object> extras);
}
SDK는 이를 호출하여 이용할 수 있는 제품의 목록을 가져옵니다.
void RetrieveProducts (IRetrieveProductsListener listener);
IRetrieveProductsListener
를 사용하여 제품 목록을 등록할 수 있습니다.
IPurchasingAdapter
를 통해서 SDK가 다시 전달하는 오브젝트의 인터페이스입니다.
public interface IRetrieveProductsListener {
void OnProductsRetrieved (List<Product> availableProducts);
}
함수는 IAP 제품을 Monetization.Product
오브젝트로 반드시 전환해야 합니다. 각 제품마다 최소 productID
, localizedPriceString
, productType
, isoCurrencyCode
및 localizedTitle
문자열이 필요합니다.
retrieveProducts
함수를 구현한 아래 예제를 참조하시기 바랍니다.
public void RetrieveProducts (IRetrieveProductsListener listener) {
// Query your Products here, convert them to Monetization.Products, then populate the Product list with them:
List<Product> products = new List<Product> ();
products.Add (new Product) {
productId = "100bronzeCoins",
localizedTitle = "100 Bronze Coins",
localizedDescription = "Awesome Bronze Coins for a new low price!",
localizedPriceString = "$1.99",
isoCurrencyCode = "USD",
productType = "Consumable",
localizedPrice = 1.99m
});
// provide the retrieved Products list:
listener.OnProductsRetrieved (products);
}
SDK가 수익화를 최적화하는 데 사용하는 오브젝트로 전환된 IAP 제품입니다.
프로퍼티 | 설명 |
---|---|
string productId |
제품의 내부 레퍼런스 ID입니다. |
string localizedTitle |
소비자가 스토어 UI에서 보는 제품 이름입니다. |
string localizedPriceString |
소비자가 스토어 UI에서 보는 가격 문자열이며 화폐 기호가 포함됩니다. |
double localizedPrice |
제품 가격의 내부 시스템 값입니다. |
string isoCurrencyCode |
제품의 현지 화폐의 ISO 코드입니다. |
string localizedDescription |
소비자가 스토어 UI에서 보는 제품 설명입니다. |
string productType |
Unity는 “Consumable(소모품)”과 “Non-Consumable(비소모품)”, 그리고 “Subscription(구독)” 제품 유형을 지원합니다. |
제품 속성에 대한 자세한 내용은 제품 정의 참고 문서를 참조하세요.
사용자가 프로모션 에셋의 구매하기 버튼을 클릭하면 SDK는 이 함수를 호출합니다. Unity는 구매된 제품의 ID를 인앱 구매 시스템에 전달합니다. 구매 성공 또는 실패 핸들링은 인앱 구매 구현 방식에 따라 달라집니다.
public void Purchase (String productID, ITransactionListener listener, Map<String, Object> extras)
IPurchasingAdapter
를 통해서 SDK가 다시 전달하는 오브젝트의 인터페이스입니다.
public interface ITransactionListener {
void onTransactionComplete (TransactionDetails details);
void onTransactionError (TransactionError error, String message);
}
성공적으로 완료되는 거래를 핸들링하는 커스텀 게임 로직입니다. 함수는 거래의 세부 내용을 설명하는 TransactionDetails
오브젝트를 받습니다.
실패한 거래를 핸들링하는 커스텀 게임 로직입니다. 함수는 거래 실패의 소스를 식별하는 TransactionErrorDetails
오브젝트를 받습니다.
public void OnPurchase (string productId, ITransactionListener listener, IDictionary<string, object> dict) {
// Example third-party purchasing function:
ThirdPartyPurchasing.purchaseProduct (productId);
// When ThirdPartyPurchasing succeeds:
listener.OnTransactionComplete (new TransactionDetails {
currency = "USD",
price = 1.99m,
productId = "100bronzeCoins",
transactionId = ThirdPartyPurchasing.transactionId,
receipt = "{\n\"data\": \"{\\\"Store\\\": \\\"fake\\\", \\\"TransactionID\\\": \\\"ce7bb1ca-bd34-4ffb-bdee-83d2784336d8\\\", \\\"Payload\\\": \\\"{ \\\\\\\"this\\\\\\\": \\\\\\\ "is a fake receipt\\\\\\\" }\\\"}\"\n}"
});
// When ThirdPartyPurchasing fails:
listener.OnTransactionError (new TransactionErrorDetails {
transactionError = TransactionError.NetworkCancelled,
exceptionMessage = "Test exception message",
store = Store.GooglePlay,
storeSpecificErrorCode = "Example: Google Play lost connection",
});
}
SDK가 수익화를 최적화하는 데 사용하는 오브젝트로 전환된 IAP 거래 영수기록입니다.
프로퍼티 | 설명 |
---|---|
string productId |
제품의 내부 레퍼런스 ID입니다. |
string transactionId |
거래에 대한 내부 레퍼런스 ID입니다. |
string receipt |
거래의 세부 내용을 다루는 INAPP_PURCHASE_DATA 의 JSON 필드입니다. Store, TransactionID 및 Payload를 포함하는 JSON 오브젝트로 영수기록을 인코딩합니다. |
decimal price |
제품 가격의 내부 시스템 값입니다. |
string currency |
제품의 현지 화폐의 ISO 코드입니다. |
거래 실패 사유 정보를 포함하는 오브젝트입니다.
public struct TransactionErrorDetails {
public TransactionError transactionError;
public string exceptionMessage;
public Store store;
public string storeSpecificErrorCode;
public IDictionary<string, object> extras;
}