【UnityTools】一个简单方便的排行榜网站Dreamlo及其拓展性

使用Dreamlo可以制作一个非常简单且低耦合的排行榜,不需要导入sdk和任何第三方插件,即可通过http方式实现排行榜的写入和查询。

使用方法非常简单,每个使用方法网站上都清楚地表明了,最常用的两个方法:

获取排行榜:http://dreamlo.com/lb/public code/json

写入排行榜:http://dreamlo.com/lb/private code/add/username/score

基础功能视频教程可以观看:

如果仅仅如此那也没什么特别的,但是这个排行榜是可以在写入时顺便带点文本的,正如网站例子中描述的

A player named Carmine got a score of 1000 in 90 seconds and is Awesome.
http://dreamlo.com/lb/private code/add/Carmine/1000/90/Awesome

最后的Awesome即为自定义文本,如此一来便带来了无穷的可能性,比如我使用了这个排行榜制作了app版本检测更新功能,即提前在排行榜写入以下内容:

http://dreamlo.com/lb/private code/add/app名称/app版本号/更新紧急程度/更新地址

然后在app中获取当前app的最新版本信息:

http://dreamlo.com/lb/public code/json-get/app名称

返回的数据将包括app版本号,紧急程度和更新的地址,然后通过这个地址打开网页更新app。

注意事项:

因为采用的是url格式,所以大部分特殊符号都不能使用,如果包含中文或者符号需要在unity中使用UnityWebRequest.EscapeURL方法对url进行处理。

缺点和限制:

免费版本目前是可以存放100个名额,但是作者有可能在今后改成25个,具体会不会改暂时未知。

而且免费版本使用的是http未加密有一点数据泄漏风险,虽然问题不大,如果想使用https或者需要拓展至1000个名额每个排行榜需要捐赠5美元,有点贵。

以下是我在unity中管理dreamlo的常用方法:

using LitJson;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

/// <summary>
/// dreamlo网站,一个排行榜网站
/// </summary>
public class DreamloManager
{
	public class DreamloData
	{
		public string name;
		public int score;
		public int seconds;
		public string text;
		public DateTime addTime;
	}

	public enum DataType
	{
		Pipe,
		Json
	}

	public const string url = @"http://dreamlo.com/lb/";

	/// <summary>
	/// 一个链接,用于获取排行榜指定名称的数据
	/// </summary>
	/// <param name="publicCode"></param>
	/// <param name="name"></param>
	/// <returns></returns>
	public static UnityWebRequest GetWebRequestByName(string publicCode, string name)
	{
		string finalUrl = url + publicCode + "/pipe-get/" + UnityWebRequest.EscapeURL(name);
		Debug.Log(finalUrl);
		return UnityWebRequest.Get(finalUrl);
	}

	/// 一个链接,用于添加排行榜指定名称的数据并返回结果
	/// </summary>
	/// <param name="publicCode"></param>
	/// <param name="name"></param>
	/// <returns></returns>
	public static UnityWebRequest GetReturnedPrivateWebRequest(string privateCode, string name, int score, string text, DataType dataType)
	{
		string dateTypeString = null;
		switch (dataType)
		{
			case DataType.Pipe:
				dateTypeString = "-pipe";
				break;
			case DataType.Json:
				dateTypeString = "-json";
				break;
			default:
				break;
		}
		if (text == null)
		{
			text = "";
		}
		string finalUrl = string.Format("{0}{1}/add{5}/{2}/{3}/0/{4}", url, privateCode, UnityWebRequest.EscapeURL(name), score, UnityWebRequest.EscapeURL(text), dateTypeString);
		Debug.Log(finalUrl);
		return UnityWebRequest.Get(finalUrl);
	}


	/// 一个链接,用于添加排行榜指定名称的数据
	/// </summary>
	/// <param name="publicCode"></param>
	/// <param name="name"></param>
	/// <returns></returns>
	public static UnityWebRequest GetPrivateWebRequest(string privateCode, string name, int score, string text)
	{
		if (text == null)
		{
			text = "";
		}
		string finalUrl = string.Format("{0}{1}/add/{2}/{3}/0/{4}", url, privateCode, UnityWebRequest.EscapeURL(name), score, UnityWebRequest.EscapeURL(text));
		Debug.Log(finalUrl);
		return UnityWebRequest.Get(finalUrl);
	}

	/// <summary>
	/// 一个链接,用于获取排行榜所有数据
	/// </summary>
	/// <param name="publicCode"></param>
	/// <param name="name"></param>
	/// <returns></returns>
	public static UnityWebRequest GetPublicWebRequest(string publicCode, DataType dataType)
	{
		switch (dataType)
		{
			case DataType.Pipe:
				return UnityWebRequest.Get(url + publicCode + "/pipe");
			case DataType.Json:
				return UnityWebRequest.Get(url + publicCode + "/json");
			default:
				return null;
		}

	}

	/// <summary>
	/// 用于从 request.downloadHandler.text 中获取排名第一的数据
	/// </summary>
	/// <param name="requestText"></param>
	/// <returns></returns>
	public static DreamloData GetFirstDataFromRequest(string requestText, DataType dataType)
	{
		var data = GetAllDataFromRequest(requestText, dataType);
		if (data != null && data.Count > 0)
		{
			return data[0];
		}
		else
		{
			return null;
		}
	}

	/// <summary>
	/// 用于从 request.downloadHandler.text 中获取数据
	/// </summary>
	/// <param name="requestText"></param>
	/// <returns></returns>
	public static List<DreamloData> GetAllDataFromRequest(string requestText, DataType dataType)
	{
		List<DreamloData> dreamloDataList = null;
		try
		{
			switch (dataType)
			{
				case DataType.Pipe:
					dreamloDataList = PipeDataToDreamloData(requestText);
					break;
				case DataType.Json:
					dreamloDataList = JsonDataToDreamloData(requestText);
					break;
				default:
					break;
			}
		}
		catch (Exception e)
		{
			Debug.LogError("GetAllDataFromRequest Error: " + e.Message);
		}
		if (dreamloDataList == null)
		{
			dreamloDataList = new List<DreamloData>();
		}
		return dreamloDataList;
	}

	public static List<DreamloData> PipeDataToDreamloData(string pipeData)
	{
		List<DreamloData> dreamloDataList = new List<DreamloData>();
		if (string.IsNullOrWhiteSpace(pipeData))
		{
			return dreamloDataList;
		}
		string[] data = pipeData.Split('\n');
		for (int i = 0; i < data.Length; i++)
		{
			if (!string.IsNullOrEmpty(data[i]))
			{
				string[] entry = data[i].Split('|');
				dreamloDataList.Add(new DreamloData()
				{
					name = UnityWebRequest.UnEscapeURL(entry[0]),
					score = int.Parse(entry[1]),
					seconds = int.Parse(entry[2]),
					text = UnityWebRequest.UnEscapeURL(entry[3]),
					addTime = DateTime.Parse(entry[4])
				});
			}
		}
		return dreamloDataList;
	}

	public static List<DreamloData> JsonDataToDreamloData(string jsonData)
	{
		List<DreamloData> dreamloDataList = new List<DreamloData>();
		if (string.IsNullOrWhiteSpace(jsonData))
		{
			return dreamloDataList;
		}
		var data = JsonMapper.ToObject(jsonData);
		if (data["dreamlo"]["leaderboard"] == null)
		{
			return dreamloDataList;
		}
		var entry = data["dreamlo"]["leaderboard"]["entry"];
		if (entry == null)
		{
			return dreamloDataList;
		}
		if (entry.IsArray)
		{
			for (int i = 0; i < entry.Count; i++)
			{
				dreamloDataList.Add(new DreamloData()
				{
					name = UnityWebRequest.UnEscapeURL(entry[i]["name"].ToString()),
					score = int.Parse(entry[i]["score"].ToString()),
					seconds = int.Parse(entry[i]["seconds"].ToString()),
					text = UnityWebRequest.UnEscapeURL(entry[i]["text"].ToString()),
					addTime = DateTime.Parse(entry[i]["date"].ToString())
				});
			}
		}
		else
		{
			dreamloDataList.Add(new DreamloData()
			{
				name = UnityWebRequest.UnEscapeURL(entry["name"].ToString()),
				score = int.Parse(entry["score"].ToString()),
				seconds = int.Parse(entry["seconds"].ToString()),
				text = UnityWebRequest.UnEscapeURL(entry["text"].ToString()),
				addTime = DateTime.Parse(entry["date"].ToString())
			});
		}
		return dreamloDataList;
	}
}


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注