Unity使用PlayerPrefs实现排行榜教程
发表于2018-05-12
                        
                    在很多竞技类手游结束的时候,大家都能看到自己本局的一个排行情况。本文介绍下用PlayerPrefs实现排行榜的一个简单模板,排序方法用的是插入排序,当然,也可以改成冒泡排序、希尔排序,那就你们自己把算法替换一下吧。

首先,打开Unity,创建两个sence,第一个sence用来产生数据并存储传递,第二部分用来接收第一个scene的数据并显示排行榜。
简单设计如下图:
第一张

第二张

第二个scene里的pannel添加一个vertical layout group,用来自动排序。OK。
然后我们来写代码。
第一个场景不需要什么太多的代码,几行就够。主要是实现随机产生一个随机数字,显示出来,然后存储传到下一个场景。UGUI的button的场景跳转我就不多说了。
void Start () {
        RandomMText = GameObject.Find("Canvas").transform.Find("RandomText").GetComponent<Text>();
        RandomM = Random.Range(5, 15);
        RandomMText.text = RandomM.ToString();
        }
        // Update is called once per frame
        void Update () {
        }
    public void RandomC()
    {  
        PlayerPrefs.SetInt("indexM", RandomM);
        SceneManager.LoadScene("Scene2");
    }
第二个场景的代码逻辑有点复杂,需要注意很多地方。我大体列举一下:
1、取上一场景的数据。
2、取排行榜中已有的数据。
3、a.排行榜不满时,把上一场景数据加入并排序。
     b.排行榜已满,把上一场景数据与现有数据排序并删除多余数据。
4、把当前排行榜数据存储(数据需要持久化)。
5、把当前数据显示到场景UI中。
下面列一下代码:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class paixu : MonoBehaviour {
    public GameObject L0;
    public GameObject[] newIndexs;
    public GameObject Panel;
    public Text indexText;
    int indexM;//用来把取的数赋值于此
    int[] save = new int[8];
    int Num;
    string saveIntStr;
    //插入排序
        // Use this for initialization
        void Start () {
        //获取上一场景存储的数据
        indexM = PlayerPrefs.GetInt("indexM");
        indexText.text = "点击次数:" + indexM.ToString();
        //获取存储的排行榜中的数据
        for (int i = 0; i < 8; i++)
        {
            string saveIntStrS = saveIntStr + i.ToString();
            save[/font][font=微软雅黑] = PlayerPrefs.GetInt(saveIntStrS);
        }
        //添加新数据并排序(从小到大)
        for (int i = 0; i < 8; i++)
        {
            if (save[/font][/size][font=微软雅黑][size=3] == null || save[/size][/font][font=微软雅黑][size=3] == 0)
            {
                save[/size][/font][font=微软雅黑][size=3] = indexM;
                Num = i;
                for (int m = 0; m < Num + 1; ++m)
                {
                    int t = save[m];
                    int n = m;
                    while ((n > 0) && (save[n - 1] > t))
                    {
                        save[n] = save[n - 1];
                        --n;
                    }
                    save[n] = t;
                }
                break;
            }
            else
            {
                int n = 7;
                if (indexM < save[7])
                {
                    while (save[n - 1] > indexM)
                    {
                        save[n] = save[n - 1];
                        --n;
                        save[n] = indexM;
                        if (n == 0)
                        {
                            break;
                        }
                    }
                    break;
                }
            }
        }
        //把当前数据存储
        for (int j = 0; j < 8; j++)
        {
            string saveIntStrI = saveIntStr + j.ToString();
            PlayerPrefs.SetInt(saveIntStrI, save[j]);
            //PlayerPrefs.SetInt(saveIntStrI, 0);
        }
        //将数据显示到场景UI中
        for (int i = 0; i < newIndexs.Length; i++)
        {
            string saveIntStrO = saveIntStr + i.ToString();
            newIndexs[/size][/font][font=微软雅黑][size=3] = Instantiate(L0, transform.position, transform.rotation) as GameObject;
            newIndexs[/size][/font][font=微软雅黑][size=3].transform.SetParent(Panel.transform);
            newIndexs[/size][/font][font=微软雅黑][size=3].GetComponent<Text>().text = PlayerPrefs.GetInt(saveIntStrO).ToString();
        }
        }
        // Update is called once per frame
        void Update () {
        }
    public void reStart(){
        SceneManager.LoadScene("Scene1");
    }
}
代码看起来简单,但是十分考察基础与逻辑。需要一步步理清思路,不然很容易混淆。
如果想换一种排序方法只需要在第3步那里更改就行。
之后会把JSON的排行榜分享给大家。
相信这个简单的排行榜能够应付很多的小demo,易扩展,简单实用。如果有问题和建议,欢迎回复。
                    
