使用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;
}
}