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
今日推荐
周排行