Codeless IAP는 인앱 구매를 Unity 앱에 통합하는 가장 쉬운 방법입니다. Unity 에디터를 통해 최소한의 스크립트만으로 기본적인 IAP 기능을 이용할 수 있습니다.
Codeless IAP의 “codeless”는 실제 IAP 트랜잭션을 수행하기 위해 코드를 작성할 필요가 없음을 의미합니다. IAP 처리 과정이 완료된 후에는 스크립팅을 통해 새로 구매한 상품에 대한 액세스 권한을 사용자에게 부여하는 방법을 정의해야 합니다. 하지만 예를 들어, 게임에서 사용자 재산 축적을 가능하게 하는 메시지를 수신하기 위해 적합한 스크립트를 통해 에셋 스토어의 게임 오브젝트를 사용하는 경우 스크립팅 작업을 수행하지 않아도 될 수 있습니다.
스크립팅을 통해 확장 기능에 접근할 수 있습니다. 자세한 내용은 아래의 Unity IAP의 확장 기능 액세스를 참조하십시오.
자세한 내용을 확인하고 피드백을 전달하거나 문의하려면 Unity IAP 포럼을 방문하십시오.
IAP 버튼을 앱에 추가하고 IAP 카탈로그에서 상품을 정의할 수 있습니다. 그런 다음 플레이어가 게임을 실행하면 카탈로그에 입력한 상품에 따라 Unity 구매 시스템이 설정됩니다. 플레이어가 IAP 버튼을 누르거나 클릭하면 관련 상품 구매가 시작됩니다.
참고: 아래 가이드를 따르기 전에 Unity IAP 플러그인이 설치되어 있는지 확인합니다. 자세한 내용은 Unity IAP 설정 문서를 참조하십시오.
씬에 IAP 버튼을 추가하려면 Unity 에디터 메뉴에서 Window > Unity IAP > Create IAP Button 을 선택합니다.
씬 뷰에서 새로운 IAP 버튼 게임 오브젝트를 선택하고 인스펙터에서 IAP Button(Script) 컴포넌트를 찾습니다(위의 그림 A 참조). IAP Catalog… 버튼을 클릭하여 IAP 카탈로그 창을 엽니다(아래 그림 B 참조). 또는 Unity 에디터에서 Window > Unity IAP > IAP Catalog 를 선택합니다.
IAP 상품의 상품 ID 를 정의합니다. 이 ID는 상품을 앱 스토어에서 식별합니다. Advanced 옵션을 통해 이 ID를 고유 스토어별 ID로 치환할 수 있습니다.
상품 Type 을 선택합니다. 상품은 Consumable, Non-consumable, 또는 Subscription 일 수 있습니다.
씬 뷰에서 IAP 버튼 게임 오브젝트를 다시 선택하고 인스펙터(위의 그림 A 참조)에서 IAP Button(Script) 컴포넌트를 다시 찾습니다.
Product ID 팝업창에서 상품을 선택합니다.
스크립팅을 사용하여 구매 이행을 제공하는 함수를 직접 만들거나, 에셋을 임포트하여 작업을 수행합니다. 예를 들어, 사용자가 게임에서 재산을 축적하는 결과로 이어지는 메시지를 수신하는 데 적합한 IAP 함수(스크립트)를 사용하여 에셋 스토어에서 에셋을 임포트할 수 있습니다.
작업을 수행하는 방법은 다음과 같습니다.
구매 이행 함수(스크립트)를 게임 오브젝트에 컴포넌트로 적용합니다.
함수를 컴포넌트의 인스펙터에 있는 On Purchase Complete(Product) 이벤트 필드에 연결합니다(위의 그림 A 참조).
인스펙터에서 + 를 선택하고 그림 A와 같이 구매 이행 게임 오브젝트를 끌어서 이벤트 필드 안에 놓습니다.
다음은 간단한 구매 시 성공 함수(스크립트)의 예제입니다. 시연에서는 성공 시 “You Got Money!”라는 텍스트가 Unity 에디터의 콘솔 창에 표시됩니다. 게임에서는 사용자의 지갑에 화폐를 적립하거나 사용자의 인벤토리에 아이템을 추가합니다.
using UnityEngine;
using UnityEngine.Purchasing;
public class DemoInventory : MonoBehaviour{
public void Fulfill (Product product){
if (product != null) {
switch (product.definition.id){
case "100.gold.coins":
Debug.Log ("You Got Money!");
Break;
Default:
Debug.Log (
string.Format ("Unrecognized productId \"{0}\"",product.definition.id)
);
Break;
}
}
}
}
마지막으로, 게임을 실행하여 IAP 버튼을 테스트합니다.
IAP 카달로그 창의 런타임 및 익스포트 관련 설정에 대한 자세한 내용은 아래의 고급 섹션을 참조하십시오.
IAP 카달로그 창에서 Advanced 옆의 화살표 아이콘을 클릭하여 고급 섹션에 액세스합니다.
고급 필드는 스토어별 세부 정보로 상품을 커스터마이즈합니다. 고급 필드를 작성하여 IAP 상품의 제목과 설명을 입력하고 특정 스토어에서 사용되는 상품 ID를 치환하고 가격 정보를 제공할 수 있습니다. 이 정보를 제공한 후 카탈로그를 익스포트할 수 있습니다.
런타임 관련 함수
IAP를 정의하려면 IAP의 일반 식별자를 입력해야 합니다.
Unity 에디터와 앱 스토어에서는 기본적으로 이 일반 식별자를 사용합니다. 하지만 특정 스토어에 대해 고유 식별자를 지정해야 하는 경우 Store ID Override 섹션을 사용할 수 있습니다.
익스포트 관련 함수
IAP 식별자의 텍스트 리스트를 앱 스토어를 통해 선언하거나 퍼블리시하려면 해당 스토어의 웹사이트로 가서 스토어별 ID, 제목, 설명, 가격 또는 가격대, 그리고 미국 외 지역에서 판매할 현지화된 배리언트 등 모든 IAP 세부 정보를 입력해야 합니다.
Google Play 및 Apple 앱 스토어의 경우 Unity 에디터에서 Google Configuration 또는 Apple Configuration 섹션을 각각 사용하여 이 작업을 수행할 수 있습니다.
Translations 섹션은 Google 설정 현지화 기능을 제공합니다.
스토어별 세부 정보로 상품을 커스터마이즈한 후 전체 카탈로그를 .csv 파일로 Google Play에 업로드하거나 Apple의 Application Loader를 통해 iTunes Store로 텍스트 파일을 임포트할 수 있습니다.
Google Play로 업로드하는 방법에 대한 설명은 Android 개발자 웹사이트에서 Google 인앱 결제 문서를 참조하십시오. Apple의 Application Loader를 통해 임포트하는 방법에 대한 설명은 iTunes Connect 웹사이트에서 Application Loader 문서를 참조하십시오.
Unity IAP의 확장 기능은 Codeless IAP 기능을 통해 노출되지 않습니다. 여기에는 Apple 앱 스토어의 비소모품 구매 복원이 포함됩니다(아래의 샘플 클래스 참조).
하지만 Unity의 API 스크립팅을 통해 IAPButton.cs의 원본을 편집할 수 있습니다. IStoreListener.OnInitialize에서 반환되는 Unity IAP IStoreController 및 IExtensionProvider 인스턴스에 액세스하여 Unity IAP의 확장 기능을 사용할 수 있습니다. Codeless IAP는 기존 스크립팅 API 위에 구현되며, 여기서 대부분의 Codeless IAP 기능을 보강하여 원하는 작업을 수행하도록 할 수 있습니다.
아래의 샘플 클래스에서는 구매 복원 기능을 사용하기 위해 IAppleExtensions
에 액세스하는 방법을 확인할 수 있습니다.
using UnityEngine;
using UnityEngine.Purchasing;
public class AppleRestoreTransactions : MonoBehaviour {
public void RestoreTransactions() {
if (Application.platform == RuntimePlatform.OSXPlayer
|| Application.platform == RuntimePlatform.IPhonePlayer
|| Application.platform == RuntimePlatform.tvOS) {
IAppleExtensions extensions = IAPButton.IAPButtonStoreManager.Instance.ExtensionProvider.GetExtension<IAppleExtensions>();
extensions.RestoreTransactions(OnTransactionsRestored);
}
}
private void OnTransactionsRestored(bool success) {
Debug.Log("Transactions restored " + success.ToString());
}
}