# 다른 서비스에서 UDP 사용

> Learn how the Unity Distribution Portal worked with other services, for a service that shut down in February 2025.

| **중요**                                                                                                                                                                                                                                                                                                                     |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| UDP(유니티 퍼블리싱 포털)는 2025년 2월 17일에 종료됩니다. 이 날짜에 UDP 웹 콘솔 및 서비스에 대한 액세스가 영구적으로 비활성화됩니다. 키스토어를 다운로드하고 게임을 앱 스토어에 직접 다시 퍼블리시하는 방법에 대한 지침을 보려면 [UDP 개요](https://api-udp.unity.com/overview) 페이지를 참조하십시오. 계정에 대한 질문이 있으면 [Unity 고객 지원 팀](https://support.unity.com/hc/en-us/requests/new?ticket_form_id=360000323692)에 티켓을 제출하십시오. |

## UDP 빌드의 Google Play 게임 서비스

### 개요

Android 게임에 [Google Play 게임 서비스](https://developers.google.com/games/services/console/enabling)를 구현하면 업적 및 리더보드 같은 기능에 Google의 서비스 계층을 활용할 수 있습니다. 게임에 Google Play 게임 서비스를 구현하는 경우 [UDP](https://unity.com/products/unity-distribution-portal)가 여러 스토어에 대해 생성하는 빌드를 지원하려면 추가 설정이 필요합니다.

게임에서 Google Play 게임 서비스를 호출하면 Google Play 게임 서비스는 다음 세부 정보가 Google Play 콘솔에 등록된 정보와 일치하는지 확인합니다.

* 애플리케이션의 **패키지 이름**
* 애플리케이션 서명에 사용된 **인증서**

일치하지 않으면 플레이어가 Google Play 게임 서비스를 사용하여 애플리케이션에 로그인할 수 없습니다.

UDP를 통해 게임을 퍼블리시하는 특정 스토어의 경우 UDP는 패키지 이름에 스토어별 접미사를 추가합니다. 또한 자체 프라이빗 키를 사용하여 인증서를 생성하지 않는 경우 UDP는 리패킹된 각 빌드에 대한 인증서를 생성합니다. 이러한 이벤트로 인해 인증서 및/또는 패키지 이름이 Google Play 콘솔의 정보와 더 이상 일치하지 않게 됩니다. 이렇게 되면 사용자가 Google Play 게임 서비스를 사용하여 게임에 로그인하지 못할 수 있습니다.

다음 섹션에서는 이 문제를 해결하는 방법에 대해 설명합니다.

### UDP 빌드용 Google Play 게임 서비스 설정

이 섹션에서는 UDP 버전을 Google Play 애플리케이션에 연결하여 Google Play 게임 서비스가 모든 버전에서 동작하도록 만드는 방법을 설명합니다.

1. Google Play 콘솔에서 타겟 앱으로 이동합니다.

2. **Play Games Services** > **Setup and management** > **Configuration**으로 이동합니다.

   * Google Play 게임에 Google Play 게임 서비스가 구현되었다면 게임은 Google Play 게임 서비스 프로젝트에 이미 연결되어 있습니다. 이 경우:

     1. **Use an existing Play Games Services project**를 선택합니다.
     2. 게임 프로젝트를 선택하고 **Use**를 선택합니다.
     3. [게임 서비스에 UDP 앱 연결](#link)의 단계를 따릅니다.

   * Google Play 게임에 Google Play 게임 서비스가 구현되지 않은 경우 다음 단계를 따르십시오.

     1. Play Games Services 설정 페이지에서 **Yes, my game already uses Google APIs** 또는 **No, my game doesn’t use Google APIs**를 선택합니다.
     2. [Google Play 게임 서비스 프로젝트 생성 및 연결](#create)의 단계를 따릅니다.

#### Google Play 게임 서비스 프로젝트 생성 및 연결

이 섹션에서는 Google Play 게임 서비스 프로젝트를 생성하여 신규 또는 기존 클라우드 프로젝트에 연결하는 방법을 설명합니다.

Play Games Services 설정 페이지에서 **Yes, my game already uses Google APIs**를 선택했다면 다음 단계를 따르십시오.

1. 클라우드 프로젝트를 선택합니다.
2. Use를 선택하여 새로운 Play Games Services 프로젝트를 생성하고 기존 클라우드 프로젝트에 연결합니다.

Play Games Services 설정 페이지에서 **No, my game doesn’t use Google APIs**를 선택했다면 다음 단계를 따르십시오.

1. 게임 이름을 입력합니다.
2. Create를 선택하여 새로운 Play Games Services 프로젝트를 생성하고 신규 클라우드 프로젝트에 연결합니다.

새로운 Play Games Services 프로젝트를 생성하면 **Add credential** 링크가 비활성화됩니다.

1. **Configure OAuth consent screen**을 선택합니다.

2. Play Games Services 설정 페이지에서 Refresh를 선택합니다.

   그러면 Add credential 옵션이 활성화됩니다.

3. **Add credential**을 선택합니다.

   그러면 Add credential 페이지가 열립니다.

4. Add credential 페이지에서 다음 단계를 따르십시오.

   1. **Type**으로 **Android**를 선택합니다.
   2. **Enable anti-piracy**를 **Off**로 설정합니다. 이렇게 하면 사용자가 Google Play 이외의 다른 앱 스토어에서 게임을 설치해도 게임에 액세스할 수 있습니다.
   3. Authorization 섹션에서 **Create OAuth client**를 선택합니다. 그러면 팝업이 열립니다.
   4. **Create OAuth Client ID**를 선택한 후 팝업의 세부 정보를 사용하여 양식을 작성합니다.

위 단계를 완료하면 Google Play 게임이 Google Play 게임 서비스에 연결됩니다. 다음 단계는 [UDP 빌드를 게임 서비스에 연결](#link)하는 것입니다.

#### UDP 앱을 게임 서비스에 연결

앱을 Google Play 게임 서비스에 연결하면 다른 (UDP) 앱을 게임 서비스에 연결할 수 있습니다.

1. Google Play 콘솔에서 **Play Games Services** > **Setup and management** > **Configuration**을 선택합니다.
   1. Play Games Services 설정 페이지에서 **Add credential**을 선택합니다.

2. Add credential 페이지에서 다음 단계를 따르십시오.

   1. **Android**를 선택합니다.
   2. **Enable anti-piracy를 Off**로 설정합니다. 이렇게 하면 사용자가 Google Play 이외의 다른 앱 스토어에서 게임을 설치해도 게임에 액세스할 수 있습니다.
   3. **Authorization** 섹션에서 **Create OAuth client**를 선택합니다. 그러면 팝업이 열립니다.
   4. **Create OAuth Client ID**를 선택한 후 팝업의 세부 정보를 사용하여 양식을 작성합니다.

3. Create OAuth client ID 양식에 필수 정보를 입력하여 UDP 빌드 중 하나에 대한 엔트리를 생성합니다.

   1. **Name** 필드에서 해당 스토어 이름을 따라 빌드 이름을 지정합니다(예: 'Samsung version').

   2. **Package name** 필드에서 UDP 콘솔을 통해 해당 스토어에 등록된 빌드의 패키지 이름을 지정합니다.

      스토어별 패키지 이름은 UDP 콘솔에 표시됩니다.

      1. My Games > Publish 탭으로 이동합니다.
      2. 해당하는 스토어에서 **Advanced**를 선택합니다.

         패키지 이름은 Basic Information 섹션에 표시됩니다.

   3. 인증서 필드에서 해당 UDP 스토어에 사용된 인증서를 사용합니다. UDP는 리팩 작업 후 새 인증서로 앱에 서명합니다.

      스토어별 인증서는 UDP 콘솔에 표시됩니다.

      1. My Games > Publish 탭으로 이동합니다.
      2. 해당하는 스토어에서 **Advanced**를 선택합니다.

         인증서는 Basic Information 섹션에 표시됩니다.

         **참고**: APK 인증서를 다운로드하여 다음 커맨드를 통해 핑거프린트 정보를 가져올 수도 있습니다.

         `openssl x509 -in [downloaded-pem-filepath] -fingerprint -noout`
      3. SHA-1을 UDP 콘솔에서 인증서 필드로 복사합니다.

4. 양식을 작성한 후 **Create**를 선택하여 Google Play 콘솔로 돌아갑니다.

5. **Refresh OAuth clients**를 선택합니다.

6. 새 OAuth 클라이언트를 선택합니다.
   1. **Save changes**를 선택하여 자격 증명을 저장합니다.

7. Google Play 애플리케이션에 연결할 각 스토어별 UDP 빌드에 대해 위 단계를 반복합니다.

Google Cloud Platform > Google API & Services 대시보드의 Credentials에서 Google Play 애플리케이션에 연결한 UDP 빌드를 확인할 수 있습니다.

이러한 단계를 통해 Google Play 게임 서비스는 해당 방식으로 연결된 모든 UDP 스토어 버전에서 성공적으로 동작할 수 있습니다. 단, SDK가 이전 버전의 Google Mobile Services를 통합하여 충돌이 발생하는 Mi GetApps는 제외입니다.

**참고**: Google 시스템의 변경 사항이 위에서 설명한 해결 방법에 영향을 미칠 수 있습니다. Google의 문제 해결 정보에 대한 자세한 내용은 [Google 기술 자료](https://www.google.com/url?q=https://developers.google.com/games/services/android/troubleshooting\&sa=D\&ust=1611571996561000\&usg=AOvVaw00u3uXWmm9qmGpqo4yuFQX)를 참조하십시오.

## UDP에서 Build Automation 사용

[Build Automation](https://docs.unity.com/ugs/en-us/manual/devops/manual/unity-build-automation.md)을 사용하여 다음과 같은 방법으로 UDP 콘솔에 게임을 배포할 수도 있습니다.

* [APK를 Build Automation에 업로드](#upload)한 후 UDP에 배포
* [Build Automation으로 게임을 빌드](#build)한 후 UDP에 배포

## Build Automation을 통해 UDP 콘솔에 빌드 푸시

이 섹션에서는 Build Automation을 사용하여 게임을 UDP로 푸시하는 방법을 설명합니다. Unity 에디터의 Project Settings 창에서 Build Automation을 활성화합니다.

### 에디터에서 Build Automation을 사용하여 UDP에 게임 배포

Unity 에디터에서 Build Automation 기능을 통해 UDP에 게임을 배포하려면 UDP 빌드를 업로드한 후 UDP로 푸시해야 합니다.

1. 이전에 빌드를 업로드하지 않았다면 Project Settings 창의 **Build Automation** 탭에서 **Upload Build**를 선택합니다.

2. **FILE**에서 다음을 수행합니다.

   * UDP 빌드의 APK를 선택합니다.
   * 유용한 **LABEL**을 입력합니다.
   * **PLATFORM** 필드를 Android로 설정합니다.

3. **UPLOAD**를 선택하면 업로드 프로세스가 자동으로 완료됩니다.

4. Project Settings 창의 **Build Automation** 탭에 있는 빌드 **History** 타임라인에서 원하는 빌드를 찾은 후 **Push to Unity Distribution Portal**을 선택합니다.
   1. 푸시할지, 그리고 해당 작업이 완료되는지 확인합니다.

### Unity 대시보드를 사용하여 게임을 UDP에 배포

Unity 대시보드에서 Build Automation 기능을 통해 UDP에 게임을 배포하려면 UDP 빌드를 Unity 대시보드에 업로드한 후 UDP로 푸시해야 합니다.

1. [Unity Developer Dashboard](https://developer.cloud.unity3d.com/build)에서 프로젝트의 **Build Automation** > **History**로 이동합니다.
2. **Upload**를 선택한 후 APK 파일을 선택합니다.
3. **Platform** 필드에서 **Android**를 선택합니다.
4. **Upload**를 선택합니다.
5. 빌드 옆에 있는 더 보기 메뉴를 선택하여 드롭다운 메뉴를 확장합니다.
6. **Push to Unity Distribution Portal**을 선택합니다.

## Build Automation을 통한 빌드 및 배포

Unity 팀즈 어드밴스드를 사용하는 경우, [빌드를 자동으로 생성](https://docs.unity.com/ugs/en-us/manual/devops/manual/unity-build-automation.md#continuous-integration)할 수 있습니다.

Project Settings 창의 Build Automation 탭에서 다음 단계를 따르십시오.

1. **Manage Build Targets** > **Add new build target**을 선택합니다.
2. **TARGET SETUP** 창에서 **PLATFORM** 필드를 Android로 설정하고 유용한 **TARGET LABEL**을 입력합니다.
3. **Next: Save**를 선택합니다.
4. **Start Build Automation**을 선택한 후 방금 생성한 타겟 빌드를 선택합니다.

Unity Build Automation 개발자 대시보드를 통해 빌드를 UDP로 직접 푸시합니다(위 참조).

## 서비스 상호호환성

UDP는 게임이 사용하는 다른 서비스에 어느 스토어에서 게임을 다운로드했는지 알릴 수 있습니다.

이 정보는 Unity 서비스와 타사 또는 자체 서비스에서 다양한 방식으로 사용될 수 있습니다.

예를 들어 [Unity 리모트 설정](https://unity.com/remote-config)을 통해 정의된 규칙에 따라 게임 설정을 조정할 수 있습니다(예: 게임을 다운로드한 스토어).

이 섹션에서는 다른 서비스가 이러한 정보에 액세스하도록 허용하는 방법을 설명하고 관련 [예시](#example)를 소개합니다.

### 작동 방식

게임이 플레이어의 기기에서 처음 실행되면 UDP는 게임의 영구 데이터 경로에 `udp.json` 파일을 생성하고 저장합니다. 이 파일에는 게임을 다운로드한 스토어를 보여 주는 `udpStore` 필드가 포함되어 있습니다. 해당 정보를 검색해서 원하는 대로 사용합니다.

**참고:** 이로 인해 게임 매니페스트에 새로운 권한이 추가되지는 않습니다.

### udp.json 찾기

파일 `udp.json`은 다음에 저장됩니다.

`Application.PersistentDataPath + '/Unity' + /Application.CloudProjectID + /udp/udp.json`

위치:

* `Application.PersistentDataPath`는 게임의 지속적인 데이터 경로입니다.
* `Application.CloudProjectID`는 게임의 Unity 프로젝트 ID입니다.

다음은 `udp.json` 파일 경로의 예입니다.

`path/storage/emulated/0/Android/data/com.mystudio.mygame/files/Unity/c83d2de2-de74-4b75-83fc-ade948bda064/udp/udp.json`

위치:

* `Application.PersistentDataPath`= `path/storage/emulated/0/Android/data/com.mystudio.mygame`
* `Application.CloudProjectID`= `c83d2de2-de74-4b75-83fc-ade948bda064`

### udp.json 읽기

`udp.json` 파일에는 다음에 관한 정보가 포함되어 있습니다.

```
{"key":"UDP","udpStore":"StoreName","udpClientId":"value_of_udpClientId","CloudProjectId":"value_of_CloudProjectId"}
```

`udpStore` 필드에는 게임을 다운로드한 UDP 스토어의 값이 포함되어 있습니다.

다음은 `udp.json` 파일의 예입니다.

```
{"key":"UDP","udpStore":"Huawei","udpClientId":"icjaB7wmu_q7AOjrSLH8yw","cloudProjectId":"bc2be074-09f3-450f-8e98-a0f79c9746f7"}
```

이 예에서 게임은 HUAWEI AppGallery에서 다운로드되었습니다.

**팁:** `JSONUtility.FromJsonOverwrite`를 사용하여 파일의 내용을 텍스트 에셋으로 읽으십시오.

### udpStore 값

아래 표에는 UDP에서 사용할 수 있는 스토어에 대해 기대할 수 있는 `udpStore` 값이 나열되어 있습니다.

이 값들은 대소문자를 구분합니다.

| 스토어(UDP에서의 채널 이름)    | udpStore 값  |
| -------------------- | ----------- |
| UDP 샌드박스(일반 UDP 빌드용) | UdpSandbox  |
| ONE Store            | OneStore    |
| APPTUTTi             | Apptutti    |
| Mi GetApps (Xiaomi)  | XiaomiStore |
| HUAWEI AppGallery    | Huawei      |
| QooApp Game Store    | QooApp      |
| Uptodown             | Uptodown    |
| SHAREit              | ShareIt     |
| JioGames             | JioGames    |
| Legion Store         | Legion      |

### 리모트 설정으로 udpStore 사용

[Unity 리모트 설정](https://unity.com/remote-config)을 사용하면 새 버전의 애플리케이션을 배포하지 않고도 게임 설정을 조정할 수 있습니다. 플레이어가 게임을 실행하면 리모트 설정은 규칙 조건으로 사용되는 컨텍스트 속성을 감지합니다(Unity, 애플리케이션, 사용자 또는 정의한 커스텀 기준에 기반). 그러면 서비스는 각 플레이어에게 적용되는 규칙에 따라 커스터마이즈된 설정을 반환합니다.

`udpStore`를 규칙 조건의 속성으로 사용하면 게임을 다운로드한 UDP 스토어에 따라 게임 설정을 결정할 수 있습니다.

리모트 설정으로 udpStore를 구현하려면 다음 단계를 따르십시오.

1. UDP 패키지를 다운로드하고 설치합니다.
2. Unity Remote Config 패키지를 다운로드하고 설치합니다. [원격 설정 기술 자료](https://docs.unity3d.com/Packages/com.unity.remote-config@latest/index.html)를 참조하십시오.
3. 최소한 'udpStore' 파라미터를 포함한 AppAttributes 구조체를 생성합니다.
   ```
   public struct AppAttributes
   {
     public string udpStore;
   }
   ```
4. 게임 코드에서 리모트 설정 ConfigManager.FetchConfigs 호출을 구현합니다.
5. FetchConfigs를 호출할 때 AppAttributes 구조체의 새 인스턴스를 생성하고 다음에서 UDP 스토어 데이터 파일을 읽습니다. Application.PersistentDataPath + '/Unity' + /Application.CloudProjectId + /udp/udp.json은 JSONUtility.FromJsonOverwrite를 사용하여 파일의 내용을 텍스트 에셋으로 읽습니다.
   ```
   {
       string udpFilePath = System.IO.Path.Combine(Application.persistentDataPath, "Unity", Application.cloudProjectId, "udp", "udp.json");
       string udpFileContents = System.IO.File.ReadAllText(udpFilePath);
       var appAttr = JsonUtility.FromJson&lt;AppAttributes&gt;(udpFileContents);
       Unity.RemoteConfig.ConfigManager.FetchCompleted += ConfigManager_FetchCompleted;
       Unity.RemoteConfig.ConfigManager.FetchConfigs(null, appAttr);
   }
   ```
6. AppAttributes 구조체가 ConfigManager.FetchConfigs에서 사용되는지 확인합니다.
7. **Remote Config** 설정(**Services** > **Remote Config** > **Configure**)을 열고 UDP 스토어에 따라 변경할 파라미터를 생성합니다.
8. 파라미터가 설정되고 게임 코드에서 계측되면 Remote Config 창에 각 스토어에 대한 규칙이 생성됩니다.
9. 각 규칙의 조건에 app.udpStore == "\[storeName]"을 입력합니다.
   * [udpStore 값](#udp-values) 보기


     **Frame:**
     ![](/api/media?file=/engine/6000.0/media/images/UDPServiceInteroperability_01.png)
10. 설정을 활성화하려면 Remote Config 설정의 왼쪽 패널에서 규칙 이름 옆에 있는 체크박스를 선택합니다.
11. 기기에 앱을 빌드하고 규칙이 제대로 적용되었는지 확인한 후 제공합니다.

## Unity IAP를 사용하여 UDP용 IAP 아이템 구현

Unity IAP를 사용하여 UDP를 구현하려면 먼저 [Unity IAP를 설정](https://docs.unity3d.com/Manual/UnityIAPSettingUp.html)합니다.

**참고**: UDP 패키지를 사용하는 대신, Unity IAP 버전 1.22.0-1.23.5를 사용하여 UDP를 구현하려는 경우에는 Unity IAP를 통해서만 구현해야 합니다.

Unity IAP는 다음 작업을 자동으로 처리합니다.

* UDP 초기화
* 스토어의 IAP 상품 인벤토리 쿼리
* 상품 구매 요청
* 구매한 아이템 소비

하지만 게임은 [Unity IAP 기술 자료](https://docs.unity3d.com/Manual/UnityIAP.html)에 따라 Unity IAP의 유사한 기능(예: 초기화, 구매)을 올바르게 사용해야 합니다.

Unity IAP를 사용하여 게임의 인앱 구매를 구현했다면 다음 단계에 따라 Unity IAP로 UDP를 설정하십시오.

### IAP 인벤토리 쿼리

#### Unity IAP 사용(코드 구현)

##### 에디터에 정의된 IAP 상품 페치

`queryInventory` 메서드로 전달할 IAP 상품을 가져오는 경우 `ProductCatalog.LoadDefaultCatalog()`를 호출합니다. 에디터의 **IAP 카탈로그**(**Services** > **Unity IAP** > **IAP Catalog**)에 정의된 IAP 상품을 반환합니다.

예를 들면 다음과 같습니다.

```
var catalog = ProductCatalog.LoadDefaultCatalog();

foreach (var product in catalog.allValidProducts)
{
   if (product.allStoreIDs.Count > 0)
   {
       var ids = new IDs();
       foreach (var storeID in product.allStoreIDs)
       {
           ids.Add(storeID.id, storeID.store);
       }
       builder.AddProduct(product.id, product.type, ids);
   }
   else
   {
       builder.AddProduct(product.id, product.type);
   }
}
```

##### UDP 콘솔에서 IAP 상품 정보 가져오기

UDP 콘솔에서 게임의 IAP 카탈로그를 수정하려는 경우 UDP 콘솔에서 IAP 상품 정보를 가져오도록 게임을 준비시키십시오.

`queryInventory` 메서드에 전달할 IAP 상품을 가져오는 경우 builder.AddProduct를 호출하여 UDP 콘솔에서 정의한 특정 IAP 상품을 검색해서 가져오십시오.

`builder.AddProduct(product.id, product.type, new IDs{})`

통화 포맷이 지정된 상품 가격을 표시하려면 `productInfo.Value.Price`를 사용하십시오.

##### UDP 콘솔에서 IAP 카탈로그 가져오기

UDP 콘솔에 정의된 모든 IAP 상품을 검색해서 가져오려면 IAP 상품 검색 메서드를 호출하지 마십시오. 그러면 게임이 UDP 콘솔에서 전체 IAP 카탈로그를 가져옵니다.

참고: UDP 콘솔에서 IAP 상품의 CSV 파일을 업로드하면 IAP 카탈로그를 완전히 덮어씁니다.

#### Unity IAP 패키지로 IAP 카탈로그 채우기

UDP에 대한 모든 인앱 구매를 [IAP 카탈로그](/engine/6000.0/manual/unity-services/udp.md#iap-catalog)에 추가하고 구성합니다.

**참고**: 게임 클라이언트에서 IAP 카탈로그를 사용하지 않는 경우(예: 게임 서버에서만 IAP 아이템을 유지하는 경우)에도 여전히 [UDP 콘솔에서 IAP 카탈로그를 생성](/engine/6000.0/manual/unity-services/udp/implementing-iap.md#create)해야 합니다.

1. Unity 에디터에서 **Services** > **Unity IAP** > **IAP Catalog**를 선택합니다.
2. **Add Product**를 선택하고 각 IAP 상품에 대한 세부 정보를 입력합니다.
   1. 유니티 퍼블리싱 포털 설정에서 IAP 아이템의 가격을 추가합니다.&#x20;
      **Frame:**
      ![](/api/media?file=/engine/6000.0/media/images/UDPGamesWithIAP_09.png)
3. IAP 상품을 UDP 콘솔에 저장하려면 **Sync to UDP**를 선택합니다. 생성하는 각 IAP 상품에 이 작업을 수행합니다.

IAP 카탈로그가 올바르게 저장되었는지 확인하려면 추가한 아이템이 UDP 콘솔에 표시되는지 확인하십시오.
