GameTang
圣骑士
圣骑士
  • UID4314
  • 粉丝3
  • 关注2
  • 发帖数43
  • 社区居民
阅读:2514回复:5

菜鸟日记《五》(Unity数据本地保存制作排行榜)

楼主#
更多 发布于:2018-02-06 14:46
今天学了一点新玩意,解决完问题后来此记录下,希望和大家一起学习一下
一个小项目已经做到尾声了,需要做一个小小的排行榜,进行本地数据记录保存,IO 操作一直让我感到恐惧的存在。。。。弱鸡外加白斩鸡的菜
不做也是不行的,就花了点时间在网上找找自己整合整合,现在把实验的源码贴出来看看,暂时还没有整合到项目中,看明白之后相信大家也都会去做相应的修改

首先声明一个分数的类,具体属性具体修改,此只为参考
(之前说的不太详细,这次补充下)
先看下效果图

图片:QQ图片20180207093834.png








然后制作下榜单的预制体

图片:预览图.png








动态生成的分数单位预制体

图片:预览图2.png






(这回应该好理解点了吧,纯手打,多支持哈)
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Score :IComparable<Score>
{
    public string name;
    public int score;
    public Score(string n, int s) { name = n; score = s; }
    public int CompareTo(Score other)
    {
        if (other == null)
            return 0;
        int value = other.score - this.score;
        return value;
    }
    public override string ToString()//debug用  
    {
        return name + " : " + score.ToString();
    }
}


接下来就是操作流程新数据的存入、排行榜数据显示




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

public class JsonTest : MonoBehaviour
{

    List<Score> scoreList = new List<Score>(); //创建list,用来存Score  
    public string playerName;                  //玩家姓名
    private int playerScore;                   //玩家分数
    public GameObject ScorePrefab;             //分数预制体
    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

        if (Input.GetMouseButtonDown(0))   //游戏结束事件
        {
            //每次输入新的分数之前,先读取文本分数数据,进行与新数据比对,防止文本写入只写入新数据覆盖旧的数据造成后续文件操作异常
            StreamReader sr = new StreamReader(Application.dataPath + "/Resources/RankingList.txt");//声明文本对象读取数据流      
            string nextLine;                                      //声明一个数据接受对象
            while ((nextLine = sr.ReadLine()) != null)            //将所有存储的分数全部存到list中
            {
                scoreList.Add(JsonUtility.FromJson<Score>(nextLine));
            }
            sr.Close();                                            //关闭文件流

            playerScore = Random.Range(1001, 99999);               //获取玩家分数
            scoreList.Add(new Score(playerName, playerScore));
            scoreList.Sort();                                      //分数排序,并存入Json文件
            StreamWriter sw = new StreamWriter(Application.dataPath + "/Resources/RankingList.txt");//声明文本对象写入数据流        
            if (scoreList.Count > 10)
            {
                for (int i = 10; i <= scoreList.Count; i++)
                {
                    scoreList.RemoveAt(i);                         //移除超出排行榜之外的分数
                }
                for (int i = 0; i < scoreList.Count; i++)
                {
                    sw.WriteLine(JsonUtility.ToJson(scoreList));//将处理好的文本写入Json文本
                }
                scoreList.Clear();                                 //保存完毕清除数组
                sw.Close();                                        //关闭文件流
            }
        }

        if (Input.GetMouseButtonDown(1))                           //显示排行榜事件触发
        {
            StreamReader sr = new StreamReader(Application.dataPath + "/Resources/RankingList.txt");// 声明文本对象读取数据流        
            string nextLine;
            while ((nextLine = sr.ReadLine()) != null)             //循环按行读取数据,将所有存储的分数全部存到list中  
            {
                scoreList.Add(JsonUtility.FromJson<Score>(nextLine));
            }
            sr.Close();                                            //关闭文件流

            if (scoreList.Count <= 0)
            {
                print("排行数据读取异常,请重试");
                return;
            }
            for (int i = 0; i < scoreList.Count; i++)              //实例化排行榜
            {
                GameObject item = Instantiate(ScorePrefab);
                item.gameObject.SetActive(true);
                item.transform.SetParent(transform);
                item.transform.Find("Number").GetComponent<Text>().text = (i + 1).ToString();
                item.transform.Find("Name").GetComponent<Text>().text = scoreList.name;
                item.transform.Find("Score").GetComponent<Text>().text = scoreList.score.ToString();
            }
        }
    }
}



可以把我这两个鼠标点击抽成两个方法,根据具体数据做相应的修改,基本每行代码我都是注有注释的,相信新手应该也是好理解的
毕竟我也是,哈哈哈
简单说下遇到的坑,我在初始做的时候,文本新数据写入并没有先读取文本内容,所以初次新数据写入时列表只有新添加的一条数据,存入时

并把旧的数据覆盖了,造成后续的部分操作文本内容错误,简单捋了下思路,就知道在哪有问题了,所以碰见问题是,急是解决不了程序问题的

一定要冷静下来,你代码写完的话如果处理问题那应该就是逻辑上的问题,慢慢的去按照自己的思路一点点的去清理,毕竟有的时候自己敲的代码

执行逻辑并不会按照自己想当然的那样去走,往往会有思想的漏洞




参考帖子unity本地分数排行榜简单解决方案(Json) 感谢大神的无私奉献,菜鸟下次见
[GameTang于2018-02-07 09:44编辑了帖子]

欢迎分享

GameTang
圣骑士
圣骑士
  • UID4314
  • 粉丝3
  • 关注2
  • 发帖数43
  • 社区居民
沙发#
发布于:2018-02-06 14:48
@归海一啸 雨哥,为啥我插入的代码老是变成文本格式,是姿势不对吗
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
板凳#
发布于:2018-02-06 18:29
GameTang:@归海一啸 雨哥,为啥我插入的代码老是变成文本格式,是姿势不对吗回到原帖
好像是 浏览器的问题,也就是我们网站的兼容性问题
AR学院(www.arvrschool.com),从这里感触未来!
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
地板#
发布于:2018-02-06 18:29
GameTang:@归海一啸 雨哥,为啥我插入的代码老是变成文本格式,是姿势不对吗回到原帖
你最好发个图,推首页啊
AR学院(www.arvrschool.com),从这里感触未来!
GameTang
圣骑士
圣骑士
  • UID4314
  • 粉丝3
  • 关注2
  • 发帖数43
  • 社区居民
4楼#
发布于:2018-02-07 09:33
归海一啸:你最好发个图,推首页啊回到原帖
截了图的,忘了,一会编辑下放上去还可以吧
归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
5楼#
发布于:2018-02-07 09:53
GameTang:截了图的,忘了,一会编辑下放上去还可以吧回到原帖
妥妥滴
AR学院(www.arvrschool.com),从这里感触未来!
游客

返回顶部