Unity简单排行榜 实现

1.创建分数列表的父物体ScoreRankList,并添加Grid Layout Group组件自动排列UI。参数自己调
01.png
2.创建单条分数的数据组合ScoreData,并作为预制体,实例化使用。子物体包含排名,姓名,分数。
image.png

排序逻辑:

/************************************************************
  FileName: SortScoreData.cs
  Author:Guido Kuo       Version :1.0        Date: 2018-10-16
  Description:数据排序
************************************************************/
namespace Assets.Scripts
{
    /// <summary>
    /// 排序逻辑
    /// </summary>
    public class SortScoreData : System.IComparable<SortScoreData>
    {
        public string Name;
        public int GameScore;
        public SortScoreData(string n, int s)
        {
            Name = n;
            GameScore = s;
        }
        public int CompareTo(SortScoreData other)
        {
            if (other == null)
                return 0;
            int value = other.GameScore - this.GameScore;
            return value;
        }
        public override string ToString()
        {
            return Name + " : " + GameScore.ToString();
        }
    }
}
排序操作:

/************************************************************
  FileName: RankScore.cs
  Author:Guido Kuo       Version :1.0        Date: 2018-10-16
  Description:数据排序
************************************************************/

using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

namespace Assets.Scripts
{
    public class RankScore : MonoBehaviour
    {
        private List<SortScoreData> _scoreDataList = new List<SortScoreData>(); //创建list,用来存Score数据
        private Transform _scoreDataParent;//父物体
        private GameObject _socreItem;
        private Button _sortButton;
        private InputField _nameField;
        private InputField _scoreField;
        private bool _isFirstReader = true;
        void Awake()
        {
            JudgementOrCreate();
            _scoreDataParent = GameObject.Find("/Canvas/ScoreRankList").transform;
            _sortButton= GameObject.Find("/Canvas/SortButton").GetComponent<Button>();
            _nameField = GameObject.Find("/Canvas/NameInputField").GetComponent<InputField>();
            _nameField.contentType = InputField.ContentType.Name;
            _scoreField = GameObject.Find("/Canvas/ScoreInputField").GetComponent<InputField>();
            _scoreField.contentType = InputField.ContentType.IntegerNumber;
        }

        void Start ()
        {
            if (_isFirstReader)
            {
                ReaderJson();
                _isFirstReader = false;
            }

            if (_scoreDataParent.childCount>0)
                for (int i = 0; i < _scoreDataParent.childCount; i++)
                {
                    GameObject a;
                    a = _scoreDataParent.GetChild(i).gameObject as GameObject;
                    Destroy(a);
                }

            _nameField.gameObject.SetActive(true);
            //_nameField.ActivateInputField();
            //_nameField.text = "";

            _scoreField.gameObject.SetActive(true);
            //_scoreField.text = null;

            _sortButton.transform.localPosition = new Vector3(0, -30f, 0);

            _sortButton.transform.GetChild(0).GetComponent<Text>().text = "SortData";

            ListenerInputField();
        }

        /// <summary>
        /// 监听输入
        /// </summary>
        void ListenerInputField()
        {
            _sortButton.onClick.RemoveAllListeners();
            _sortButton.onClick.AddListener(
                () =>
                {
                    SortSetSomething();
                    ScoreSort();
                });
            _nameField.onEndEdit.RemoveAllListeners();
            _nameField.onEndEdit.AddListener(delegate { _scoreField.ActivateInputField(); });
            _scoreField.onEndEdit.RemoveAllListeners();
            _scoreField.onEndEdit.AddListener(
                delegate
                {
                    _scoreDataList.Add(new SortScoreData(_nameField.text, Convert.ToInt32(_scoreField.text)));
                    SortSetSomething();
                    ScoreSort();
                });
        }
        /// <summary>
        /// 判断是否有排序文档,如果没有,创建一个空文档。本机地址,相对路径。
        /// </summary>
        void JudgementOrCreate()
        {
            if (File.Exists(Application.persistentDataPath + "/RankingList.txt"))
                Debug.Log("已有文件");
            else
                File.Open(Application.persistentDataPath + "/RankingList.txt", FileMode.Create);
            //Debug.Log(Application.persistentDataPath);路径根目录
        }

        /// <summary>
        /// 读取数据流
        /// </summary>
        void ReaderJson()
        {
            //StreamReader sr = new StreamReader(Application.dataPath + "/Resources/RankingList.txt");//发布之后还需自己创建RankingList.txt文档复制进Resource文件夹内,不方便,且易被更改。
            StreamReader sr = new StreamReader(Application.persistentDataPath + "/RankingList.txt");
            string nextLine;
            while ((nextLine = sr.ReadLine()) != null)
                _scoreDataList.Add(JsonUtility.FromJson<SortScoreData>(nextLine));
            sr.Close();//将所有存储的分数全部存到list中   分行存入
        }

        /// <summary>
        /// 排序、实例化并重新写入Json
        /// </summary>
        void ScoreSort()
        {
            _scoreDataList.Sort();

            //StreamWriter sw = new StreamWriter(Application.dataPath + "/Resources/RankingList.txt");//写入数据流
            StreamWriter sw = new StreamWriter(Application.persistentDataPath + "/RankingList.txt");//写入数据流

            if (_scoreDataList.Count > 10)//排序后删除列表序列大于10的数据
                for (int i = 10; i <= _scoreDataList.Count; i++)
                    _scoreDataList.RemoveAt(i);

            foreach (SortScoreData t in _scoreDataList)
                sw.WriteLine(JsonUtility.ToJson(t));//重新写入排序后的json数据

            sw.Close();//写入结束

            InstantiateGo();

            for (int i = 0; i < _scoreDataList.Count; i++)
            {
                if (_scoreDataList[i].Name == _nameField.text)
                {
                    _scoreDataParent.GetChild(i).GetChild(0).GetComponent<Text>().color=Color.red;
                    _scoreDataParent.GetChild(i).GetChild(1).GetComponent<Text>().color=Color.red;
                    _scoreDataParent.GetChild(i).GetChild(2).GetComponent<Text>().color=Color.red;
                }
            }
        }

        /// <summary>
        /// 排序时的参数设置
        /// </summary>
        void SortSetSomething()
        {
            _nameField.gameObject.SetActive(false);
            _scoreField.gameObject.SetActive(false);
            _sortButton.transform.localPosition = new Vector3(361.5f, 205.5f, 0);
            _sortButton.transform.GetChild(0).GetComponent<Text>().text = "Back";
            _sortButton.onClick.RemoveAllListeners();
            _sortButton.onClick.AddListener( Start );
        }

        /// <summary>
        /// 实例化排名榜
        /// </summary>
        void InstantiateGo()//实例化排名榜
        {
            for (int i = 0; i < _scoreDataList.Count; i++)
            {
                _socreItem = Instantiate(Resources.Load<GameObject>("ScoreData")) as GameObject;
                _socreItem.gameObject.SetActive(true);
                _socreItem.transform.SetParent(_scoreDataParent, false);
                _socreItem.transform.Find("Number").GetComponent<Text>().text = (i + 1).ToString();
                _socreItem.transform.Find("Name").GetComponent<Text>().text = _scoreDataList[i].Name;
                _socreItem.transform.Find("Score").GetComponent<Text>().text = _scoreDataList[i].GameScore.ToString();
            }
        }
    }
}

工程名字:RankScore.unitypackage

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容