C# 在不同的Android设备上识别相同的用户

C# 在不同的Android设备上识别相同的用户,c#,android,unity3d,device,gnupg,C#,Android,Unity3d,Device,Gnupg,我正在制作一个Unity游戏,玩家在其中建造一座城市,用户的进化数据保存在服务器上。 考虑到这一点,我需要检测玩家何时连接到不同的设备,为他提供自己的城市(而不是新城市)。实现这一点的最佳方法是什么?如果可能的话,不需要玩家的操作,比如单击登录按钮或接受权限 目前我只为Android开发,我的理解是,我需要应用程序为服务器提供一个令牌id,它可以验证(并检索相关的玩家id)。我该怎么做?我正在尝试使用Google Play Games(Unity插件),但它似乎有很多我不需要的功能。除此之外,可

我正在制作一个Unity游戏,玩家在其中建造一座城市,用户的进化数据保存在服务器上。 考虑到这一点,我需要检测玩家何时连接到不同的设备,为他提供自己的城市(而不是新城市)。实现这一点的最佳方法是什么?如果可能的话,不需要玩家的操作,比如单击登录按钮或接受权限

目前我只为Android开发,我的理解是,我需要应用程序为服务器提供一个令牌id,它可以验证(并检索相关的玩家id)。我该怎么做?我正在尝试使用Google Play Games(Unity插件),但它似乎有很多我不需要的功能。除此之外,可能是由于这些功能,在我的第一次尝试中,我向用户请求了以下权限:

  • 知道你在谷歌上是谁吗
  • 管理此游戏的游戏活动
我玩过其他与Google Play帐户连接的游戏,不需要这样的权限,只要说“欢迎XXX”。 有谁能给我一些如何做的建议吗

实现这一目标的最佳方法是什么?如果可能,最好的方法是什么 需要玩家进行操作,如单击登录按钮或 接受权限

未经许可,您无法在不同设备上检测到同一用户。您必须有一种方法来检测这些不同设备上常见的东西,以便确定它是否是同一个用户

在这种情况下,唯一可能做到这一点的信息是在设备上注册的帐户,它需要权限。别无选择。这可能是唯一的办法

这是唯一需要的权限,可以很容易地访问您的Unity项目。不需要插件:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

通过这样做,您将避免仅为此使用Google Play Games插件。

谢谢您的详细回答。这样,我如何保证从服务器上的应用程序接收的数据的准确性?假设有人创建了一个脚本,尝试使用不同的帐户名,幸运的是得到了一个有效的帐户名。上次我检查时,该数组中返回的第一个帐户链接到android market,它需要用户名和密码,这意味着使用第一个项目是安全的。我不知道从那以后情况是否有所改变。我建议您在使用之前先进行测试和验证。在我之前的回答中,可能我没有正确解释,但我需要验证服务器上接收到的用户标识数据。否则,一个玩家可以操纵数据,从另一个玩家那里获得城市。按照Google开发者网站()上的建议,我们不应该接受普通用户ID,因此我将使用TokenId方法(使用用于Unity的Google Play Games插件)。尽管如此,我还是感谢你的回答,谢谢!
string[] getAllEmailAccounts()
{
    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

    AndroidJavaClass ACManager = new AndroidJavaClass("android.accounts.AccountManager");
    AndroidJavaObject ACManagerAct = ACManager.CallStatic<AndroidJavaObject>("get", currentActivity);

    AndroidJavaObject accounts = ACManagerAct.Call<AndroidJavaObject>("getAccountsByType", "com.google");
    AndroidJavaObject[] accountArray = AndroidJNIHelper.ConvertFromJNIArray<AndroidJavaObject[]>(accounts.GetRawObject());

    string[] accountName = new string[accountArray.Length];

    for (int i = 0; i < accountName.Length; i++)
    {
        accountName[i] = accountArray[i].Get<string>("name");
    }

    return accountName;
}