Unity3D用LeanCloud实现排行榜2 - SSB4455/ownArticleSome GitHub Wiki

上一篇我们把每次的成绩都提交到了排行榜里面 这样作为记录是可以的 但是作为一个排行榜其实是不合适的
这次我们就来把内容调整一下让它变成一个真正的排行榜

public void SubmitScore()
{
	AVObject leaderBoardScore = null;
	new AVQuery<AVObject>("GameScore").WhereEqualTo("playerName", "player1").OrderByDescending("score").FindAsync().ContinueWith(t =>
	{
		foreach (AVObject avobj in t.Result)
		{
			Debug.Log(avobj["playerName"] + " " + avobj["score"] + " " + avobj.CreatedAt);
			leaderBoardScore = avobj;
			break;
		}
		
		if (leaderBoardScore == null)
		{
			leaderBoardScore = new AVObject("GameScore");
			leaderBoardScore["playerName"] = "player1";
			leaderBoardScore["score"] = int.Parse(intputField.text);
			intputField.text = int.Parse(intputField.text) + 1 + "";
		}
		if ((int)(leaderBoardScore["score"]) < int.Parse(intputField.text))
		{
			leaderBoardScore["score"] = int.Parse(intputField.text);
			leaderBoardScore.SaveAsync().ContinueWith(t2 =>
			{
				UpdateLeaderBoardText();
			});
		}
	});
}

void UpdateLeaderBoardText()
{
	new AVQuery<AVObject>("GameScore").FindAsync().ContinueWith(t =>
	{
		string scoresStr = "";
		foreach (AVObject avobj in t.Result)
		{
			Debug.Log(avobj["playerName"] + " " + avobj["score"] + " " + avobj.CreatedAt);
			scoresStr += avobj.CreatedAt.Value.ToString("yyyy-MM-dd HH:mm:ss") + " |\t" + avobj["score"] + "\t|\t" + avobj["playerName"] + "\n";
		}
		outputText.text = scoresStr;
	});
}

运行
1
先看到之前的成绩
2

输入9 点Button看到一个5已经更新成了9

现在成绩的显示没有倒序 并且时间也没有显示正确的 现在显示的还是创建时间 要改成更新时间

再改一下

void UpdateLeaderBoardText()
{
	new AVQuery<AVObject>("GameScore").OrderByDescending("score").FindAsync().ContinueWith(t =>
	{
		string scoresStr = "";
		foreach (AVObject avobj in t.Result)
		{
			Debug.Log(avobj["playerName"] + " " + avobj["score"] + " " + avobj.UpdatedAt);
			scoresStr += avobj.UpdatedAt.Value.ToString("yyyy-MM-dd HH:mm:ss") + " |\t" + avobj["score"] + "\t|\t" + avobj["playerName"] + "\n";
		}
		outputText.text = scoresStr;
	});
}

3

4

好 现在成绩已经能够正常更新 并且显示排行榜的顺序也都OK了 这里要注意以下LeanCloud的官方文档里面提到了查询条件要连在一起写

5

但到现在为止其实一只都存在着一个安全隐患 那就是数据的随意篡改 LeanCloud官方文档里面提到 6

别人可以从我们的游戏包里面拿到AppId AppKey
以现在的安全控制那么别人就可以在任何地方运行 然后把排行榜上所有人的成绩都篡改掉
就算是没有人恶意去篡改云端的数据 也有可能因为你开发时候的小失误导致玩家数据的丢失 而且因为现在数据是完全的可读可写丢失的很可能就是所有玩家的数据

不过也不用担心 LeanCloud为我们提供了一个很棒的工具 通过访问控制列表(Access Control List)简称为「ACL 机制」
下一篇我来介绍一下LeanCloud的用户系统以及使用ACL来有效保护云端的数据
2018-11-26

⚠️ **GitHub.com Fallback** ⚠️