计分排行榜

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

namespace Assets.Scripts
{
    public class RankScore : MonoBehaviour
    {
        //如果我们想要清除后面排行榜中的内容就需要_scoreDataList .Clear();
        private List<SortScoreData> _scoreDataList = new List<SortScoreData>(); //创建list,用来存Score数据
        //这是用来盛放后来生成的一个个排行榜中的内容位置的父物体
        private Transform _scoreDataParent;//父物体
        //生成的一个个排行榜中的物体,就是上面父物体下面的子物体
        private GameObject _scoreItem;
        private Button _sortButton;
        private InputField _nameField;
        private InputField _scoreField;
        //如果项目第一次用就需要在电脑中创建一个盛放数据的列表
        private bool _isFirstReader = true;
        void Awake()
        {
            JudgementOrCreate();
            //一切操作都在脚本里面完成就不需要在unity里面拖或者修改输入框的性质
            _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;
            }
//防止前面出错,start里面确保前面只会出现输入框,没有排行榜
            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);
            _scoreField.gameObject.SetActive(true);
//排序按钮的位置
            _sortButton.transform.localPosition = new Vector3(0, -30f, 0);
//排序按钮我们上面的字是需要动态加载的
            _sortButton.transform.GetChild(0).GetComponent<Text>().text = "SortData";
            
*****//按钮的监听写在Start里面!!!*****
            ListenerInputField();
            
        }
        void Update()
        {
            if(Input.GetKeyDown(KeyCode.A))
            {
                _scoreDataList.Clear();
            }
        }

        /// <summary>
        /// 监听输入
        /// </summary>
        void ListenerInputField()
        {
        //按钮点击首先移除上一次的listeners(我觉得这个还挺重要的)
            _sortButton.onClick.RemoveAllListeners();
        //按钮点击添加监听事件
            _sortButton.onClick.AddListener(
                () =>
                {
                //如果点击就执行下面的方法:
                //首先将输入框不显示,按钮的位置放到别的地方,按钮的字换为back,移除所有的监听,
                    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++)
            {
                _scoreItem= Instantiate(Resources.Load<GameObject>("ScoreData")) as GameObject;
                _scoreItem.gameObject.SetActive(true);
                _scoreItem.transform.SetParent(_scoreDataParent, false);
                _scoreItem.transform.Find("Number").GetComponent<Text>().text = (i + 1).ToString();
                _scoreItem.transform.Find("Name").GetComponent<Text>().text = _scoreDataList[i].Name;
                _scoreItem.transform.Find("Score").GetComponent<Text>().text = _scoreDataList[i].GameScore.ToString();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/vickieyy/article/details/89604506