Implementing Google Play games services in your Android games lets you leverage Google’s service layer for features such as achievements and leaderboards. If your game implements Google Play game services, additional configuration is required to support the builds that UDP creates for different stores.
When your game invokes Google Play games services, Google Play games services checks that the following details match the information registered on the Google Play Console:
If they don’t match, the player can’t log into the application with Google Play games services.
For certain stores that you publish your game to via UDP, UDP adds a store-specific suffix to the package name. Additionally, if you don’t use your own private key to generate the certificate, UDP generates a certificate for each repacked build. These events would cause your certificate and/or package name to no longer match the information on the Google Play Console. This would prevent users from logging into the game with Google Play game services.
The following section explains how to resolve this issue.
This section explains how to link your UDP versions to a Google Play application so that Google Play game services can work on all of them.
This section explains how to create a Google Play games services project and link it to a new or existing cloud project.
If you selected Yes, my game already uses Google APIs in the Play Games Services setup page:
If you selected No, my game doesn’t use Google APIs in the Play Games Services setup page:
When you create a new Play Games Services project, the Add credential link is disabled.
When you’ve completed the above steps, your Google Play game is linked to its Google Play games services. The next step is to link your UDP builds to the games services.
When you have linked your app to Google Play games services you can link the other (UDP) apps to the games services.
openssl x509 -in [downloaded-pem-filepath] -fingerprint -noout
You can view the UDP builds you’ve linked to your Google Play application in the Google Cloud Platform > Google API & Services dashboard, under Credentials.
These steps enable Google Play games services to work successfully on all the UDP store versions that are linked that way, excluding Mi GetApps (whose SDK integrates an old version of Google Mobile Services, which creates conflicts).
Note: Any changes to Google’s systems could impact the solution described above. For more information on Google’s troubleshooting information, see the Google documentation.
可通过以下方式使用 Cloud Build 将游戏部署到 UDP 控制台:
This section explains how to use Cloud Build to push your game to UDP. In the Unity Editor, enable Cloud Build in the Project Settings window.
要通过 Unity 编辑器中的 Cloud Build 功能将游戏部署到 UDP,你需要上传 UDP 构建版本并将其推送到 UDP。
要通过 Unity Dashboard 中的 Cloud Build 功能将游戏部署到 UDP,你需要将 UDP 构建版本上传到 Unity Dashboard 并从其中推送到 UDP。
如果使用的是 Unity Teams Advanced,你可以自动生成构建版本。
In the Cloud Build tab of the Project Settings window:
通过 Unity Cloud Build 开发者控制面板 (Developer Dashboard) 将构建版本直接推送到 UDP(如上所示)。
UDP 可以让游戏使用的其他服务了解该游戏是从哪个商店下载的。
Unity 服务以及第三方服务或你自己的服务可以多种方式使用这一信息。
例如,在使用 Unity Remote Config 时,你可以根据定义的规则(例如,从哪个商店下载的游戏)来调整游戏设置。
本节介绍如何让其他服务访问此信息,并提供了一个示例。
当游戏首次在玩家的设备上启动时,UDP 将创建 udp.json
文件并将其放入游戏的“持久数据路径”(Persistent Data Path) 中。此文件包含的字段 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":"Huawei","udpClientId":"icjaB7wmu_q7AOjrSLH8yw","cloudProjectId":"bc2be074-09f3-450f-8e98-a0f79c9746f7"}
In this example, the game was downloaded from the HUAWEI AppGallery.
提示:使用 JSONUtility.FromJsonOverwrite
可将文件内容作为文本资源读取。
下表列出了 UDP 商店可能的 udpStore
值。
这些值区分大小写。
商店(UDP 上的通道名称) | udpStore 的值 |
---|---|
UDP Sandbox(适用于通用 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 |
使用 Unity Remote Config 可以在不部署应用程序新版本的情况下优化游戏设置。当玩家启动游戏时,Remote Config 会检测用作规则条件的上下文属性(基于 Unity、应用程序、用户或你定义的自定义条件)。然后,相应服务会根据适用于每个玩家的规则为玩家返回自定义设置。
在规则条件中使用 udpStore
作为属性,就可以根据游戏是从哪个 UDP 商店下载的来确定游戏设置。
要使用 Remote Config 实现 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。
注意:如果选择使用 Unity IAP 版本 1.22.0–1.23.5 来实现 UDP(而不是使用 UDP 包),则仅通过 Unity IAP 实现即可。
Unity IAP 自动进行以下处理:
但是,你的游戏必须根据 Unity IAP 文档正确使用 Unity IAP 的类似功能(例如初始化和购买)。
使用 Unity IAP 实现游戏的应用内购后,请按照以下步骤使用 Unity IAP 设置 UDP。
When fetching the IAP products to pass to the queryInventory
method, invoke ProductCatalog.LoadDefaultCatalog()
. This returns the IAP products defined in the Editor’s IAP Catalog (Services > Unity IAP > IAP Catalog).
例如:
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 商品信息。
在获取 IAP 商品以便传递给 queryInventory
方法时,请调用 builder.AddProduct 以获取 UDP 控制台上定义的特定 IAP 商品:
builder.AddProduct(product.id, product.type, new IDs{})
要显示带有货币格式的商品价格,请使用 productInfo.Value.Price
。
要获取在 UDP 控制台上定义的所有 IAP 商品,请不要调用任何 IAP 商品检索方法。你的游戏随后将从 UDP 控制台获取整个 IAP 目录。
注意:将 IAP 商品的 CSV 文件上传到 UDP 控制台上会完全覆盖你的 IAP 目录。
在 IAP 目录中添加和配置 UDP 应用内购。
注意:如果未在游戏客户端中使用 IAP 目录(例如,如果仅在游戏服务器上维护 IAP 商品),仍必须在 UDP 控制台上创建 IAP 目录。
为了确保正确保存了 IAP 目录,请检查 UDP 控制台中是否显示了所添加的商品。