【问题标题】:Unity - Firebase realtime database - Get my rank in leaderboardUnity - Firebase 实时数据库 - 在排行榜中获得我的排名
【发布时间】:2019-03-28 09:41:50
【问题描述】:

我有一个使用 firebase 实时数据库的迷你游戏。

在我从 firebase 获得用户分数列表后,我想获得当前不在列表中的用户的分数。

获取当前用户的分数很容易,但是如何知道列表中的排名是 OrderByChild("score")。

这是获取排行榜的代码。

List<UserScore> leaderBoard = new List<UserScore>();
FirebaseDatabase.DefaultInstance
                .GetReference("user-scores")
                .OrderByChild("score")
                .LimitToLast(10)
                .GetValueAsync()
                .ContinueWith(task =>
        {
            if (task.IsFaulted)
            {
                Debug.Log("Fail To Load");
            }
            else if (task.IsCompleted)
            {
                DataSnapshot snapshot = task.Result;
                foreach (DataSnapshot h in snapshot.Children)
                {
                    UserScore userScore = new UserScore(h.Child("uid").Value.ToString(), h.Child("name").Value.ToString(), h.Child("photo").Value.ToString(),int.Parse(h.Child("score").Value.ToString()));
                    leaderBoard.Add(userScore);
                }
            }
        });

【问题讨论】:

    标签: c# firebase unity3d firebase-realtime-database leaderboard


    【解决方案1】:

    如何知道我的等级

    这在一定程度上取决于“我的”是谁。但是假设您在变量uid 中有当前用户的UID。然后,您可以通过以下方式确定他们在前 10 名中的排名:

    int rank = 0;
    foreach (DataSnapshot h in snapshot.Children)
    {
        rank = rank + 1;
        UserScore userScore = new UserScore(
          h.Child("uid").Value.ToString(), 
          h.Child("name").Value.ToString(), 
          h.Child("photo").Value.ToString(),
          int.Parse(h.Child("score").Value.ToString()));
        leaderBoard.Add(userScore);
        if (h.Child("uid").Value.ToString() == uid) {
          Debug.Log("I'm number "+rank+" in the rankings");
        }
    }
    

    【讨论】:

    【解决方案2】:

    试试这个在排行榜中查找用户排名。这对我有用

    sample image after code

        email_arrayList = new ArrayList();
    
        var currentUser = FirebaseAuth.DefaultInstance.CurrentUser;
    
        int rank = 0;
         playerId = currentUser.UserId;
         Debug.Log(playerId);
    
        FirebaseDatabase.DefaultInstance.GetReference("users").ValueChanged += FirebaseSaveLoadScript_ValueChanged;
    
        FirebaseDatabase.DefaultInstance
          .GetReference("users").OrderByChild("userScore")
          .ValueChanged += (object sender2, ValueChangedEventArgs e2) => {
              if (e2.DatabaseError != null)
              {
                  Debug.LogError(e2.DatabaseError.Message);
                  return;
              }
              Debug.Log("Received values for Leaders.");
              string title = leaderBoard[0].ToString();
              leaderBoard.Clear();
              leaderBoard.Add(title);
              if (e2.Snapshot != null && e2.Snapshot.ChildrenCount > 0)
              {
                  foreach (var childSnapshot in e2.Snapshot.Children)
                  {
                      if (childSnapshot.Child("userScore") == null
                    || childSnapshot.Child("userScore").Value == null)
                      {
                          Debug.LogError("Bad data in sample.  Did you forget to call SetEditorDatabaseUrl with your project id?");
                          break;
                      }
                      else
                      {
                          Debug.Log("Leaders entry : " +
                        childSnapshot.Child("userEmail").Value.ToString() + " - " +
                        childSnapshot.Child("userScore").Value.ToString());
    
                          email_arrayList.Add(childSnapshot.Child("userEmail").Value.ToString());
    
                          leaderBoard.Insert(1, childSnapshot.Child("userScore").Value.ToString()
                        + "  " + childSnapshot.Child("userEmail").Value.ToString());
    
                          displayScores.text = "";
                          foreach (string item in leaderBoard)
                          {
                              displayScores.text += "\n" + item;
    
                          }
                      }
    
                  }
              }
    
              email_arrayList.Reverse();
              foreach (string obj in email_arrayList)
              {
                  rank++;
                  if (obj == currentUser.Email)
                  {
                      int rank_final = rank;
                      Debug.Log("I'm number " + rank_final + " in the rankings");
                      userRank.text = "Your Rank is " + rank_final;
                      rank = 0;
                      break;
                  }
    
                  Debug.Log(obj);
    
              }
    
          };
    

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      相关资源
      最近更新 更多