大家在玩遊戲的時候,無論是大型的網遊還是普通的手遊都會遇見遊戲結束時的排行榜,那麼這個排行榜是怎麼實現的,最近研究了一番。下面讓大家看看效果,沒有UI,就是簡單的Image與Text。
第一個是名次,第二個是名字,第三個是分數,第四個是時間。上面那個是添加新的記錄。名字是在前面的場景中拿到的,如果測試,可以在當前的場景中直接把Text改爲InputField即可。
下面是我用到的代碼。
1.先搭建基本的UI。大家可以自由發揮。
2.這是基本的聲明。
public InputField inputField;
public Button button;
public GameObject PrefabShow;
public Image ParentsShow;
public Image ParentsShowUI;
public Text textName;
3.在初始化時我們拿到玩家的名字和對事件綁定。就是提交按鈕觸發的事件。
void Start ()
{
textName.text = Global.PlayerName;
button.GetComponent<Button>().onClick.AddListener(InputOK);
}
void InputOK()
{
Global.SkillCount = int.Parse(inputField.text);
string PlayerResultDate = ResultToJson(Global.PlayerName, Global.SkillCount);
SaveString(PlayerResultDate);
DictionarySort(GetJsonDate());
}
2.首先需要知道,既然是排行榜,一定涉及到了數據持久化,那麼,在這我用的是Json,對於Json的操作我就不在這裏贅述了。我存取的方式是將名字分數以及時間存在本地。
//將數據轉化成Json
public string ResultToJson(string Name, int NowCount)
{
StringBuilder sb = new StringBuilder();
JsonWriter WriteDate = new JsonWriter(sb);
WriteDate.WriteObjectStart();
WriteDate.WritePropertyName("Name");
WriteDate.Write(Name + "|" + DateTime.Now.ToShortTimeString());
WriteDate.WritePropertyName("Count");
WriteDate.Write(NowCount);
WriteDate.WriteObjectEnd();
return sb.ToString();
}
//下面的方法就是保存在本地
private void SaveString(string str)
{
FileInfo fi = new FileInfo(Application.dataPath + "/Resources/Json.txt");
StreamWriter sw = null;
if (fi.Exists)
{
sw = fi.AppendText();
}
else
{
sw = fi.CreateText();
}
sw.WriteLine(str);
sw.Close();
}
//下面的方法是獲取Json數據
public Dictionary<string, int> GetJsonDate()
{
FileStream fi = new FileStream(Application.dataPath + "/Resources/Json.txt", FileMode.Open);
Dictionary<string, int> jsonDate = new Dictionary<string, int>();
if (fi.CanRead)
{
StreamReader sw = new StreamReader(fi);
string jsonStr;
while ((jsonStr = sw.ReadLine()) != null)
{
JsonData data = JsonMapper.ToObject(jsonStr);
jsonDate.Add(data["Name"].ToString(), int.Parse(data["Count"].ToString()));
}
}
return jsonDate;
}
//這個方法是把獲取的Json數據排序並且顯示出來
private void DictionarySort(Dictionary<string, int> dic)
{
if (dic.Count > 0)
{
List<KeyValuePair<string, int>> lst = new List<KeyValuePair<string, int>>(dic);
lst.Sort(delegate(KeyValuePair<string, int> s1, KeyValuePair<string, int> s2)
{
return s2.Value.CompareTo(s1.Value);
});
//ParentsShow.rectTransform.sizeDelta = new Vector2(600, lst.Count * 100);
//ParentsShowUI.GetComponent<Mask>().enabled = true;
//ParentsShowUI.GetComponentInChildren<Scrollbar>().value = 1;
dic.Clear();
float i = 1, r = 1, g = 1, b = 0;
foreach (KeyValuePair<string, int> kvp in lst)
{
if (i <= 3)
{
string[] Key = kvp.Key.Split('|');
GameObject ga = Instantiate(PrefabShow, ParentsShow.transform.position, Quaternion.identity) as GameObject;
ga.transform.parent = ParentsShow.transform;
r -= 0.2f;
g -= 0.2f;
b -= 0.2f;
Debug.Log(r + g + b);
Text[] Children = ga.GetComponentsInChildren<Text>();
Children[0].color = new Color(r, g, b);
Children[1].color = new Color(r, g, b);
Children[2].color = new Color(r, g, b);
Children[3].color = new Color(r, g, b);
Children[1].text = Key[0];
Children[3].text = kvp.Value.ToString();
Children[2].text = Key[1];
Children[0].text = (i++).ToString();
}
else
{
string[] Key = kvp.Key.Split('|');
GameObject ga = Instantiate(PrefabShow, ParentsShow.transform.position, Quaternion.identity) as GameObject;
ga.transform.parent = ParentsShow.transform;
Text[] Children = ga.GetComponentsInChildren<Text>();
Children[1].text = Key[0];
Children[3].text = kvp.Value.ToString();
Children[2].text = Key[1];
Children[0].text = (i++).ToString();
}
}
}
}
好了,這個排行榜的功能就完了,如果有什麼寫得不對的地方 ,希望大家在下方留言,一起進步與提升。