【发布时间】:2016-07-04 03:29:47
【问题描述】:
试图找出这个 GPG 插件出了什么问题。我按照说明并理解了文档,以便通过one 测试运行登录并显示排行榜 UI。我确实通过 Google Play 开发者帐户制作了玩游戏成就 + 排行榜,进行了设置,复制粘贴源代码,然后就完成了。通过添加 Admob Unity 包和 GPG Unity 包来测试广告,效果很好。我什至更新了一些适用于 Android 的插件(等 .aar 文件、firebase-common、manifest),以最大限度地提高兼容性和效率,这样我就可以构建 APK 而不会出现任何干扰构建的问题。
但是,有一个问题:在我登录并尝试点击“显示排行榜 UI”按钮以及询问用户是否已通过身份验证的按钮事件后,它将允许您通过更新来记录您的最新高分在显示排行榜 UI 之前。以下是代码的工作原理:
首先,在 Start() 回调中...
PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
.Build();
PlayGamesPlatform.InitializeInstance(config);
PlayGamesPlatform.DebugLogEnabled = true;
PlayGamesPlatform.Activate();
接下来,这里是登录/注销过程...
public void LogInAccount() {
// Show dialog.
y = 0;
dialogPanel.SetActive (true);
dialogBackground.SetActive (true);
// You can logout if you're logged in.
if(Social.localUser.authenticated) {
((PlayGamesPlatform)Social.Active).SignOut ();
y = 0;
message.text = "Your account have been logged out.";
logButtonLabel.text = "Log-in via Google";
button.SetActive (true);
confirmSound.Play();
return;
}
// Check for status.
if (CheckNetwork.checkOnlineStatus ()) {
Social.localUser.Authenticate ((bool success) => {
if (success) {
// LOG IN SUCCESS! (Check if the email is identified or not.)
if((((PlayGamesLocalUser)Social.localUser).Email != null) || (((PlayGamesLocalUser)Social.localUser).Email != "")) {
y = 0;
message.text = "Login complete. However, email is not verified or unknown.";
logButtonLabel.text = "Log-out";
button.SetActive (true);
errorSound.Play();
} else {
y = 0;
message.text = "Login complete!\nYour email:" + ((PlayGamesLocalUser)Social.localUser).Email;
logButtonLabel.text = "Log-out";
button.SetActive (true);
confirmSound.Play();
}
} else if (!success) {
// LOG IN FAILED.
if((((PlayGamesLocalUser)Social.localUser).Email != null) || (((PlayGamesLocalUser)Social.localUser).Email != "")) {
message.text = "Login failed. Please try again later.\nYour email: ? ? ?";
} else {
message.text = "Login failed. Please try again later.\nYour email: " + ((PlayGamesLocalUser)Social.localUser).Email;
}
y = 0;
button.SetActive (true);
logButtonLabel.text = "Log-in via Google";
errorSound.Play();
}
});
} else {
message.text = "Connection is lost. Please enable online.";
button.SetActive (true);
}
}
然后,显示排行榜回调/按钮事件。
public void OpenLeaderboard() {
// Show dialog.
y = 0;
dialogPanel.SetActive (true);
dialogBackground.SetActive (true);
// Check for status.
if (Social.localUser.authenticated && CheckNetwork.checkOnlineStatus ()) {
// Updating your highscore...
Social.ReportScore ((long)Score.GetScore (),
AchievementReference.leaderboard_best_intergalactic_chasers_top_score,
(bool success) => {
if(success) {
// LEADERBOARD APPEARED!
dialogPanel.SetActive (false);
dialogBackground.SetActive (false);
confirmSound.Play();
Social.ShowLeaderboardUI();
// ((PlayGamesPlatform)Social.Active).ShowLeaderboardUI(AchievementReference.leaderboard_best_intergalactic_chasers_top_score);
} else {
y = 0;
message.text = "Load failed. Please try again later.";
button.SetActive (true);
errorSound.Play();
}
});
} else if (!Social.localUser.authenticated) {
y = 0;
confirmSound.Play();
button.SetActive (true);
if (!CheckNetwork.checkOnlineStatus ()) {
message.text = "Connection not available at a moment.";
} else if (CheckNetwork.checkOnlineStatus ()) {
message.text = "You must login first in order to see the leaderboard.";
}
}
}
在我第一次尝试时,我确实登录(有时会显示欢迎标志)并点击排行榜按钮,但 2 分钟后没有任何反应。第二次尝试,我使用 login-logout-login 方法,GPG 提示我选择电子邮件地址,欢迎用户名标志出现在顶部。但是,仍然......当我点击显示排行榜 UI 按钮时,3 分钟后没有任何反应。我使用this 参考来获得更多关于有效显示 leaderboardc UI 的想法并检查代码示例。最后一次尝试,我假设在发布我创建的游戏服务(之前设置为测试模式)并查看排行榜 UI 是否正常工作之前,排行榜 UI 不会显示。然后一两天后,使用第一次第二次尝试的相同方法,仍然没有成功。
问题是:为什么在测试模式下,甚至在通过 Google Play 服务开发者部分发布游戏服务后,排行榜 UI 仍然不显示?在成就 UI 中显示时也会发生同样的事情。是什么原因导致即使我在设置中正确执行了排行榜 UI 也无法显示?我怀疑这是互联网连接问题或wifi信号。问题可能是我制作的一个非常简单的游戏服务的长期负载。我只创建了两个排行榜(高分和被摧毁的船只数量)和五个达到一定分数和没有的成就。被毁的船只。
此外,除了显示排行榜 UI 问题之外,即使通过 Google 帐户后续成功登录,还有一个错误会导致字符串值(实际上,我正在使用所选电子邮件地址检索)为空或为空屏幕顶部的欢迎用户名标志。
更新 在我检查了错误并从 S 提供了一些解决方案之后。 Tarik Cetin,我在 logcat 上查看了有关登录的信息。一开始我以为是登录成功。然后,我注意到了这一点:
W/Unity (32099): *** [Play Games Plugin DLL] 07/05/16 14:33:54 -07:00 ERROR: E
xception launching token request: java.lang.ClassNotFoundException: com.google.g
ames.bridge.TokenFragment
W/Unity (32099):
W/Unity (32099): (Filename: ./artifacts/generated/common/runtime/UnityEngineDe
bugBindings.gen.cpp Line: 37)
W/Unity (32099):
W/Unity (32099): *** [Play Games Plugin DLL] 07/05/16 14:33:54 -07:00 ERROR: U
nityEngine.AndroidJavaException: java.lang.ClassNotFoundException: com.google.ga
mes.bridge.TokenFragment
W/Unity (32099): java.lang.ClassNotFoundException: com.google.games.bridge.Tok
enFragment
W/Unity (32099): at java.lang.Class.classForName(Native Method)
W/Unity (32099): at java.lang.Class.forName(Class.java:217)
W/Unity (32099): at java.lang.Class.forName(Class.java:172)
W/Unity (32099): at com.unity3d.player.UnityPlayer.nativeRender(Native Me
thod)
W/Unity (32099): at com.unity3d.player.UnityPlayer.a(Unknown Source)
W/Unity (32099): at com.unity3d.player.UnityPlayer$b.run(Unknown Source)
W/Unity (32099): Caused by: java.lang.NoClassDefFoundError: com/google/games/b
ridge/TokenFragment
W/Unity (32099): ... 6 more
W/Unity (32099): Caused by: java.lang.ClassNotFoundException: com.google.games
.bridge.TokenFragment
W/Unity (32099): at dalvik.system.BaseDexClassLoader.findClass(BaseDexCla
ssLoader.java:61)
W/Unity (32099): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
W/Unity (32099): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
W/Unity (32099): ... 6 more
W/Unity (32099): at UnityEngine.AndroidJNISafe.CheckException () [0x00000] i
n <filename unknown>:0
W/Unity (32099): at UnityEn
另外,我在登录和注销一次时遇到了 logcat 的状态。
W/Unity (32099): at UnityEn
I/Unity (32099): [Play Games Plugin DLL] 07/05/16 14:38:07 -07:00 DEBUG: Star
ting Auth Transition. Op: SIGN_OUT status: ERROR_NOT_AUTHORIZED
I/Unity (32099):
I/Unity (32099): (Filename: ./artifacts/generated/common/runtime/UnityEngineDe
bugBindings.gen.cpp Line: 37)
I/Unity (32099):
最后,这是在尝试直接打开排行榜 UI 时发现的问题。
W/Unity (32099): *** [Play Games Plugin DLL] 07/05/16 14:40:31 -07:00 ERROR: U
nityEngine.AndroidJavaException: java.lang.ClassNotFoundException: com.google.ga
mes.bridge.NativeBridgeActivity
W/Unity (32099): java.lang.ClassNotFoundException: com.google.games.bridge.Nat
iveBridgeActivity
W/Unity (32099): at java.lang.Class.classForName(Native Method)
W/Unity (32099): at java.lang.Class.forName(Class.java:217)
W/Unity (32099): at java.lang.Class.forName(Class.java:172)
W/Unity (32099): at com.unity3d.player.UnityPlayer.nativeRender(Native Me
thod)
W/Unity (32099): at com.unity3d.player.UnityPlayer.a(Unknown Source)
W/Unity (32099): at com.unity3d.player.UnityPlayer$b.run(Unknown Source)
W/Unity (32099): Caused by: java.lang.NoClassDefFoundError: com/google/games/b
ridge/NativeBridgeActivity
W/Unity (32099): ... 6 more
W/Unity (32099): Caused by: java.lang.ClassNotFoundException: com.google.games
.bridge.NativeBridgeActivity
W/Unity (32099): at dalvik.system.BaseDexClassLoader.findClass(BaseDexCla
ssLoader.java:61)
W/Unity (32099): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
W/Unity (32099): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
W/Unity (32099): ... 6 more
W/Unity (32099): at UnityEngine.AndroidJNISafe.CheckException () [0x00000] i
n <filen
更新 我在检查电子邮件是否为空时犯了一个错误。我读错了。但是,电子邮件地址值仍然存在问题,它应该以字符串值返回已识别的值,并在读取不为空时留空。
// LOG IN SUCCESS! (Check if the email is identified or not.)
if((((PlayGamesLocalUser)Social.localUser).Email != null) || (((PlayGamesLocalUser)Social.localUser).Email != "")) {
y = 0;
message.text = "Login complete!\nYour email:" + ((PlayGamesLocalUser)Social.localUser).Email;
logButtonLabel.text = "Log-out";
button.SetActive (true);
confirmSound.Play();
} else {
y = 0;
message.text = "Login complete. However, email is not verified or unknown.";
logButtonLabel.text = "Log-out";
button.SetActive (true);
errorSound.Play();
}
【问题讨论】:
-
如果对您有帮助,请查看SO question 中的解决方案。
-
@KENdi 好的。如果有更新,我会通知你的。我去看看……
-
@KENdi 根据您通过链接提供的其中一个详细信息,我已经设置了包括我自己在内的测试人员。但即使在我决定发布排行榜后,排行榜 UI 仍然没有显示。另外,我只使用了一个密钥库,而不是 debug.keystore.
-
@KENdi 来自this link 的第二个答案,我创建了一个密钥库,只有一个。但是,我在播放器设置中有 2 个密钥别名:Unsigned (debug) 和创建的自定义密钥。这个问题是计数还是仍然可以显示排行榜?我必须确保匹配的 SHA1 和我使用的密钥库能够正常工作。
-
@KENdi @S.TarıkÇetin 我在控制台上检查了一下,发现了这个:
I/Unity ( 6607): [Play Games Plugin DLL] 07/07/16 11:46:24 -07:00 DEBUG: Repo rtScore: score=28340, board=CggIiLq7x3EQAhAB。但是,在我使用您给我的实例代码后,我仍然在显示排行榜 UI 时遇到错误,原因是NativeBridgeActivity。
标签: android authentication unity3d google-play-games leaderboard