Android 게임에 Google Play 게임 서비스를 구현하면 업적, 리더 보드 등과 같은 기능에 Google의 서비스 레이어를 활용할 수 있습니다. 게임이 Google Play 게임 서비스를 구현하는 경우 추가 설정을 통해 UDP가 다른 스토어에 대해 생성하는 빌드를 지원해야 합니다.
게임에서 Google Play 게임 서비스를 호출하면 Google Play 게임 서비스는 다음 세부 정보가 Google Play 콘솔에 등록된 정보와 일치하는지 확인합니다.
일치하지 않으면 플레이어가 Google Play 게임 서비스를 사용하여 애플리케이션에 로그인할 수 없습니다.
UDP를 통해 게임을 퍼블리시하는 특정 스토어의 경우 UDP는 패키지 이름에 스토어별 접미사를 추가합니다. 또한 자체 프라이빗 키를 사용하여 인증서를 생성하지 않는 경우 UDP는 리패킹된 각 빌드에 대해 인증서를 생성합니다. 이 이벤트로 인해 인증서 및/또는 패키지 이름이 Google Play 콘솔의 정보와 더 이상 일치하지 않게 됩니다. 이 경우 사용자가 Google Play 게임 서비스를 사용하여 게임에 로그인할 수 없습니다.
다음 섹션에서는 이 문제를 해결하는 방법에 대해 설명합니다.
이 섹션에서는 UDP 버전을 Google Play 애플리케이션에 연결하여 Google Play 게임 서비스가 모든 버전에서 동작하도록 만드는 방법을 설명합니다.
이 섹션에서는 Google Play 게임 서비스 프로젝트를 생성하여 신규 또는 기존 클라우드 프로젝트에 연결하는 방법을 설명합니다.
Play Games Services 설정 페이지에서 Yes, my game already uses Google APIs를 선택했다면 다음 단계를 따르십시오.
Play Games Services 설정 페이지에서 No, my game doesn’t use Google APIs를 선택했다면 다음 단계를 따르십시오.
새로운 Play Games Services 프로젝트를 만들면 Add credential 링크가 비활성화됩니다.
위 단계를 완료하면 Google Play 게임이 Google Play 게임 서비스에 연결됩니다. 다음 단계는 UDP 빌드를 게임 서비스에 연결하는 것입니다.
앱을 Google Play 게임 서비스에 연결하면 다른 (UDP) 앱을 게임 서비스에 연결할 수 있습니다.
openssl x509 -in [downloaded-pem-filepath] -fingerprint -noout
Google Cloud Platform > Google API & Services 대시보드의 Credentials에서 Google Play 애플리케이션에 연결한 UDP 빌드를 확인할 수 있습니다.
이러한 단계를 통해 Google Play 게임 서비스는 이러한 방식으로 연결된 모든 UDP 스토어 버전에서 성공적으로 동작할 수 있습니다. 단, SDK가 이전 버전의 Google Mobile Services를 통합하여 충돌이 발생하는 Mi GetApps는 제외입니다.
참고: Google 시스템에 대한 모든 변경 사항은 위에 설명된 솔루션에 영향을 미칠 수 있습니다. Google의 문제 해결 정보에 대한 자세한 내용은 Google 문서를 참조하십시오.
클라우드 빌드를 사용하여 다음과 같은 방법으로 UDP 콘솔에 게임을 배포할 수 있습니다.
이 섹션에서는 클라우드 빌드를 사용하여 게임을 UDP로 푸시하는 방법을 설명합니다. Unity 에디터에서 Project Settings 창에서 클라우드 빌드를 활성화하십시오.
Unity 에디터에서 클라우드 빌드 기능을 통해 UDP에 게임을 배포하려면 UDP 빌드를 업로드한 후 UDP로 푸시해야 합니다.
Unity 대시보드에서 클라우드 빌드 기능을 통해 UDP에 게임을 배포하려면 UDP 빌드를 Unity 대시보드에 업로드한 후 UDP로 푸시해야 합니다.
Unity 팀즈 어드밴스드를 사용하는 경우 빌드를 자동으로 생성할 수 있습니다.
Project Settings 창의 Cloud Build 탭에서 다음 단계를 따르십시오.
Unity 클라우드 빌드 개발자 대시보드를 통해 빌드를 UDP로 직접 푸시합니다(위 참조).
UDP는 게임이 사용하는 다른 서비스에 어느 스토어에서 게임을 다운로드했는지 알릴 수 있습니다.
이 정보는 Unity 서비스와 타사 또는 자체 서비스에서 다양한 방식으로 사용될 수 있습니다.
예를 들어 Unity 리모트 설정을 통해 정의된 규칙에 따라 게임 설정을 조정할 수 있습니다(예: 게임을 다운로드한 스토어).
이 섹션에서는 다른 서비스가 이러한 정보에 액세스하도록 허용하는 방법을 설명하고 관련 예시를 소개합니다.
플레이어의 기기에서 게임이 처음으로 실행되면 UDP는 게임의 영구 데이터 경로에 udp.json
파일을 만들고 삭제합니다. 이 파일에는 게임을 다운로드한 스토어를 보여주는 udpStore
필드가 있습니다. 해당 정보를 검색해서 가져온 후 원하는 방식으로 활용하십시오.
참고: 이로 인해 게임 매니페스트에 새로운 권한을 추가되지는 않습니다.
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
파일에는 다음 정보가 들어 있습니다.
{"key":"UDP","udpStore":"StoreName","udpClientId":"value_of_udpClientId","CloudProjectId":"value_of_CloudProjectId"}
udpStore
필드에는 게임을 다운로드한 UDP 스토어의 값이 들어 있습니다.
다음은 udp.json
파일의 예입니다.
{“key”:“UDP”,“udpStore”:“SamsungGalaxyStore”,“udpClientId”:“icjaB7wmu_q7AOjrSLH8yw”,“cloudProjectId”:“bc2be074–09f3–450f–8e98-a0f79c9746f7”}
이 예에서 게임은 Samsung Galaxy 스토어에서 다운로드되었습니다.
팁: JSONUtility.FromJsonOverwrite
를 사용하여 파일 내용을 텍스트 에셋으로 읽으십시오.
아래 표에는 UDP에서 사용할 수 있는 스토어에 대해 기대할 수 있는udpStore
값이 나열되어 있습니다.
이 값들은 대소문자를 구분합니다.
스토어(UDP에서의 채널 이름) | udpStore 값 |
---|---|
UDP 샌드박스(일반 UDP 빌드용) | UdpSandbox |
ONE Store | OneStore |
APPTUTTi | Apptutti |
Mi GetApps (Xiaomi) | XiaomiStore |
HUAWEI AppGallery | Huawei |
Samsung Galaxy Store | SamsungGalaxyStore |
QooApp Game Store | QooApp |
TPAY MOBILE Stores | Tpay |
Uptodown | Uptodown |
SHAREit | ShareIt |
JioGames | JioGamesStore |
Unity 리모트 설정을 사용하면 애플리케이션의 새 버전을 배포하지 않고도 게임 설정을 조정할 수 있습니다. 플레이어가 게임을 실행하면 리모트 설정이 규칙 조건으로 사용되는 컨텍스트 속성을 감지합니다(Unity, 애플리케이션, 사용자, 또는 사용자 정의 기준을 따름). 그런 다음 서비스는 적용되는 규칙에 따라 각 플레이어에 대해 커스터마이즈된 설정을 반환합니다.
udpStore
를 규칙 조건의 속성으로 사용하면 게임을 다운로드한 UDP 스토어에 따라 게임 설정을 결정할 수 있습니다.
리모트 설정으로 udpStore를 구현하려면 다음 단계를 따르십시오.
public struct AppAttributes
{
public string udpStore;
}
{
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<AppAttributes>(udpFileContents);
Unity.RemoteConfig.ConfigManager.FetchCompleted += ConfigManager_FetchCompleted;
Unity.RemoteConfig.ConfigManager.FetchConfigs(null, appAttr);
}
Unity IAP를 사용하여 UDP를 구현하려면 먼저 Unity IAP를 설정하십시오.
참고: UDP 패키지를 사용하는 대신, Unity IAP 버전 1.22.0–1.23.5를 사용하여 UDP를 구현하려는 경우에는 Unity IAP를 통해서만 구현해야 합니다.
Unity IAP는 다음 작업을 자동으로 처리합니다.
하지만 게임은 Unity IAP 문서에 따라 Unity IAP의 유사한 기능(예: 초기화, 구매)을 올바르게 사용해야 합니다.
Unity IAP를 사용하여 게임의 인앱 구매를 구현했다면 다음 단계에 따라 Unity IAP로 UDP를 설정하십시오.
queryInventory
메서드에 전달할 IAP 상품을 페치하는 경우 ProductCatalog.LoadDefaultCatalog()
를 호출하십시오. 그러면 에디터의 IAP Catalog(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 상품 정보를 페치하도록 게임을 준비시키십시오.
queryInventory
메서드에 전달할 IAP 상품을 페치하는 경우 builder.AddProduct를 호출하여 UDP 콘솔에서 특정 IAP 상품을 검색해서 가져오십시오.
builder.AddProduct(product.id, product.type, new IDs{})
통화 포맷이 지정된 상품 가격을 표시하려면 productInfo.Value.Price
를 사용하십시오.
UDP 콘솔에서 정의된 모든 IAP 상품을 검색해서 가져오려는 경우에는 IAP 상품 검색 메서드를 호출하지 마십시오. 그러면 게임이 UDP 콘솔에서 전체 IAP 카탈로그를 페치합니다.
참고: UDP 콘솔에서 IAP 상품의 CSV 파일을 업로드하면 IAP 카탈로그를 완전히 덮어씁니다.
UDP에 대한 모든 인앱 구매를 IAP 카탈로그에 추가하고 구성합니다.
참고: 게임 클라이언트에서 IAP 카탈로그를 사용하지 않는 경우(예: 게임 서버에서만 IAP 아이템을 유지하는 경우)에도 여전히 UDP 콘솔에서 IAP 카탈로그를 생성해야 합니다.
IAP 카탈로그가 올바르게 저장되었는지 확인하려면 추가한 아이템이 UDP 콘솔에 표시되는지 확인하십시오.