Unity3D 實現本地排行榜功能

       大家在玩遊戲的時候,無論是大型的網遊還是普通的手遊都會遇見遊戲結束時的排行榜,那麼這個排行榜是怎麼實現的,最近研究了一番。下面讓大家看看效果,沒有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();
                }      
            }
        }
    }

好了,這個排行榜的功能就完了,如果有什麼寫得不對的地方 ,希望大家在下方留言,一起進步與提升。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章