본문 바로가기
Unity 공부

[Unity] In-App Purchase 테스트

by 개발하는 디토 2023. 2. 19.

안드로이드 구글 플레이 스토어에 서비스할 예정인 게임에 대해 인게임 구매를 활성화하기 위해 In-App Purchase 기능을 사용해보기로 했다.

 

코드리스 IAP - Unity 매뉴얼

코드리스 IAP(Codeless IAP) 를 사용하면 아주 간편하게 Unity 앱에 인앱 결제를 구현할 수 있습니다. Unity 에디터는 최소한의 스크립트 작성을 통해 기본 IAP 통합을 설정하기 위한 인터페이스를 제공

docs.unity3d.com

 

미리 준비

Platform 설정

일단 프로젝트가 모바일 프로젝트여야 한다. Ctrl + B 눌러 본인의 프로젝트 플랫폼이 Android 또는 iOS로 설정되어 있는지 확인 후 아니라면 플랫폼을 변경한다.


조직 만들기

로그인한 상태에서 Unity ID를 클릭하면 조직 생성하는 대시보드로 연결된다.

 

조직 관리 - Unity 매뉴얼

조직을 생성하거나 관리하려면 Unity ID 대시보드에 로그인하고 왼쪽 탐색 표시줄에서 조직(Organizations) 을 선택합니다.

docs.unity3d.com

2022부터 바뀐 건지 2021 기준 영상들은 Organization 연결에 대해 설명하는 부분이 없던데 나의 경우 자꾸 Organization을 연결해달라고 해서 하나 만들었다. 위의 가이드에서 Unity ID 를 클릭하면 본인의 대시보드로 연결된다.

 

Add new
이름 짓고 Create

 

Add new를 눌러 Organization의 이름을 짓고 Industry는 Gaming 등 원하는 것으로 설정한 뒤 Create를 누른다.


In-App Purchasing 활성화

이후 Unity로 돌아와 구름 모양 아이콘을 찾으면 Services 탭을 켤 수 있다. 단축키는 Ctrl + 0이라고 써 있다. 그도 아니면 Windows > General > Services

2021.3.5f1 기준 왼쪽 상단, 그 이전 버전은 아마도 오른쪽에 있을 듯

 

Windows > General > Services

 

In-App Purchasing 클릭

 

In-App Purchasing을 클릭하면 Organization을 하나 고르라고 할 것이다. 아까 만든 Organization을 골라주고 Create Project ID를 누른다. 이후 만 13세 이하의 아동을 대상으로 하는 게임인지 물어보는데 특별히 아동 대상 게임이 아니라면 No를 선택한다. 일단 나는 결제가 들어가는 순간부터 만 13세 이하의 아동 대상이 아니라고 생각했기 때문에 No를 눌렀다...ㅋㅋㅋㅋ

설정을 마치면 아래와 같은 화면이 나오므로 OFF 버튼을 클릭해 ON으로 바꿔주고 Install Latest Version을 눌러 In-App Purchasing 패키지를 설치한다.

In-App Purchasing ON!!!
Package 설치 Yes

 

(나중 출시용 세팅) Keystore

Build Settings (Ctrl + Shift + B) > Player Settings > 안드로이드 하단의 Publishing Settings > Keystore Manager 클릭

위에서부터 5가지를 입력하면 된다. Password, Confirm Password, Alias, Password, Confirm Password. 위와 아래의 비밀번호는 같은 것이면 된다.

 

KeyStore 찾아가기
Create New > In 지정된 장소

 

IAP 사용

미리 알아두면 좋을 것

In-App Purchasing을 적용할 수 있는 재화는 3가지 종류가 있다. 

1) 소모성 재화 (Consumable) : 한 번 쓰면 사라지는 물건들 (코인, 물약, 음식 등등...)

2) 비소모성 재화 (Non-consumable) : 한 번 구매 후 계속해서 내게 남아있는 물건들 (장비 등)

3) 구독형 재화 (Subscription) : 일정 시점마다 서비스를 계속 이용하기 위해 돈을 내야 하는 형태 (광고 제거권 등)

 

IAP를 적용할 재화 ID (Product ID)는 다음과 같은 구성으로 이루어져있다.

com.회사 이름.게임 이름.재화 ID

여기서의 회사 이름과 게임 이름은 Build Setting에 들어가는 Company name, Product name이다.


 

IAP 버튼 생성

Hierarachy 창에서 우클릭 > In-App Purchasing > IAP Buton 클릭

 

Consumable 재화 생성

게임 내 재화인 코인을 구매할 수 있게 만들어보자. 나와 팀원들의 게임에는 코인을 게임 내 재화로 사용하고 있기 때문에 게임을 하지 않고도 많은 돈을 얻을 수 있는 코인 500개 상품을 만들 것이다.

IAP Catalog는 창을 가로 방향으로 늘리면 여러 설명을 적기가 더 수월하다.

IAP 버튼에서 IAP 카탈로그를 클릭하면 아이템에 대해 설정할 수 있는 창이 나온다.

 

  1. 여기의 ID에 위에서 말한 양식으로 ID를 짓는다. com.회사이름.게임이름.아이템이름!
  2. 코인은 소모성 재화이므로 Type을 Consumable로 설정한다.
    • 비소모성 재화를 만들려면 Type을 Non Consumable로 설정하면 될 것!
  3. Locale은 목표로 하는 시장이 어디인가에 따라 설정한다. 일단은 기본인 English에서 특별히 변경하지 않겠다.
  4. 해당 아이템의 Title과 아이템에 대한 설명(Description)을 적당히 적어준다. 이때 Title은 위의 ID에 설정한 재화 id와는 일치하지 않아도 괜찮다.
  5. 아이템의 가격을 설정한다. Google Play Store는 가격을 직접 적는 식이고 Apple Store는 가격의 Tier를 결정하는 식이다. 같은 가격으로 설정하고 싶다면 Apple Tier를 설정한 뒤 Play Store 쪽의 가격에 똑같은 숫자를 적어주면 된다.
  6.  Automatically initialize UnityPurchasing (recommended)를 꼭 체크해준다. (2021.3.1f 기준 기본으로 체크되어 있다.
  7. 마지막으로 Add Product 버튼 누르기!

찾아보면 한국도 있다!
ID, Type, Title, Description, Google, Apple Configuration 설정 -> Add Product!

 

IAP 버튼으로 돌아가 Product ID 부분을 눌러보면 방금 생성한 아이템이 추가되어 있는 것을 볼 수 있을 것이다. 해당 아이템의 구매버튼이 될 IAP 버튼과 아이템을 연결해준다.

Product ID 연결


아이템 정보 띄우기

IAP Catalog에서 생성한 아이템의 정보를 화면에 띄워보자.

Text 3개 생성
Title, Description, Price Text 부분에 각각 연결

Item의 이름, 설명, 가격을 보여줄 3개의 UI Text를 만들고 그것을 각각 IAP Button component의 텍스트 부분에 연결한다. 그러면 에디터에서 게임을 실행했을 때 IAP Catalog에 등록했던 내용이 모두 텍스트로 나타난다.

TIP) 혹시 구매버튼에 바로 가격을 띄우고 싶다면 IAP 버튼 자식으로 있는 Text Component를 Price Text에 연결해준다.

 

 


구매 적용

IAPManager.cs Script를 작성한다.

각 아이템의 Product ID를 담아줄 string 변수를 아이템 개수만큼 선언하고 각각의 변수에 Product ID를 string으로 넣어준다. IAP 버튼에 달아줄 함수 2개를 만든다.

 

 

예제용 코드

더보기

상품 ID를 처음 생성 후 변경하지 않을 것이므로 const string으로 설정하였다. 구매하고 나면 아이템의 가격이 Purchased라는 글자로 바뀔 것이다.

아이템의 개수가 늘어나면 if 조건문 처리보다는 다른 방식으로 아이템이 무엇인지 판단해야할 것 같다. 어디까지나 예제용 코드!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Purchasing;

public class IAPManager : MonoBehaviour
{
    private const string coin500 = "com.BeatDalin.BeatMaster.coin500";
    private const string newbieBoard = "com.BeatDalin.BeatMaster.NewbieBoard";
    private const string _purchased = "Purchased";
    
    public void OnPurchaseComplete(Product product)
    {
        // When players successfully paid for the product
        if (product.definition.id == coin500)
        {
            // give the item
            Debug.Log("The current player is given 500 coins.");
            _coinBtn.priceText.text = _purchased;
        }
        else if (product.definition.id == newbieBoard)
        {
            // give the item
            Debug.Log("The current player is given a newbie skateboard!");
            _boardBtn.priceText.text = _purchased;
        }
    }
    public void OnPurchaseFailed(Product product, PurchaseFailureReason failureReason)
    {
        Debug.Log($"{product.definition.id} failed because {failureReason}.");
    }
}

 

Script를 저장한 뒤 해당 Script를 붙일 Empty GameObject를 만든다. IAPManager.cs를 컴포넌트로 붙인 뒤 On Purchase Complete와 On Purchase Failed에 연결한다. 각각 OnPurchaseComplete와 OnPurchaseFailed를 연결한다.

 

비어 있는 곳에 함수 추가

 

 

이후 게임을 실행해 구매 버튼을 눌러보면 구매하겠냐는 가짜 UI가 뜨고 Buy를 누르면 OnPurchaseComplete 함수 안에 있는 내용이 실행될 것이다. 나중에 구글 플레이 스토어나 애플 앱 스토어를 연결하면 해당 스토어로 넘어가 결제 처리가 일어난다고 한다.

구매 전
너무 작아서 잘 안 보이지만 가짜 UI에서 Buy를 누르면 구매한 것처럼 테스트해볼 수 있다.
구매 후

 

댓글