当前位置: 首页 > 知识库问答 >
问题:

Unity-Firebase实时数据库-获取我在排行榜中的排名

羊舌子瑜
2023-03-14

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

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

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

这是获取排行榜的代码。

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);
                }
            }
        });

共有2个答案

阎伟志
2023-03-14

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

代码后的示例图像

    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);

          }

      };
史承福
2023-03-14

如何知道我的排名

这在一定程度上取决于“我的”是谁。但是假设您在变量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");
    }
}
 类似资料:
  • 我正在使用firebase实时数据库、unity和facebook(个人资料图片和姓名)制作排行榜 但是我在挣扎,我不确定这样做的方式。我想展示多个排行榜- 我知道我可以使用云功能重置每周和每月排行榜。但是如何存储世界和地区分数呢?现在我只有这个- https://cdn.discordapp.com/attachments/440873502535450627/82136147435388932

  • 我想在我的应用程序中创建一个排行榜。排行榜应显示得分最高的10位最佳用户。我的Firebase数据库如下所示: Firebase Datenbank: 我已经创建了一个包含10个文本视图的活动。从第一个文本视图开始,我想将文本更改为: “第一名|‘用户名’|‘高分’分数” 现在我的问题是: 对我来说,做这件事最简单的方法是什么? 那么,保护数据库的最佳方式是什么,以便只能使用应用程序更改数据?

  • 获取全站粉丝排行 获取财富达人排行 获取全站收入排行 获取全站粉丝排行 根据全站的用户粉丝数进行的排序 GET /ranks/followers 传入参数 名称 类型 必填 说明 limit int - 数据返回条数 默认10条 offset int - 偏移量 默认为0 响应 Http Status 200 Ok [ { "id": 1, "name": "baishi"

  • 获取资讯排行 获取资讯排行 根据一定时间内的资讯获得的浏览量量进行的排序 GET /news/ranks 传入参数 名称 类型 必填 说明 limit int - 数据返回条数 默认10条 type string - 筛选类型 day - 日排行 week - 周排行 month - 月排行 offset int - 偏移量 默认为0 响应 Http Status 200 Ok [ {

  • 获取解答排行 获取问答达人排行 获取社区专家排行 获取解答排行 根据一定时间内发布的回答数进行的排序 GET /question-ranks/answers 传入参数 名称 类型 必填 说明 limit int - 数据返回条数 默认10条 type string - 筛选类型 day - 日排行 week - 周排行 month - 月排行 offset int - 偏移量 默认为0 响应 H

  • 获取动态排行 获取动态排行 根据一定时间内的动态获得的点赞量进行的排序 GET /feeds/ranks 传入参数 名称 类型 必填 说明 limit int - 数据返回条数 默认10条 type string - 筛选类型 day - 日排行 week - 周排行 month - 月排行 offset int - 偏移量 默认为0 响应 Http Status 200 Ok [ {