关闭

unity本地分数排行榜简单解决方案(Json)

1173人阅读 评论(0) 收藏 举报
分类:

具体效果

大体方法:创建一个分数类Score和一个分数类的容器List<Score>,和一个json.txt用来存储所有的分数(最多显示10条分数)。进入主菜单时读取txt将分数全部读到list中,当用户点击排行榜显示按钮时从list中加载出来;在游戏中结算分数时实例化一个分数类并Add到List中,并排一下序,把分数最小的元素Remove掉(一拍大腿,为什么不用优先队列呢!!不过那得自己实现),并输出到文本中。什么时候读和输出其实可以很随意,能实现效果就好,毕竟运算的元素不多。

方法

准备工作:先创建一个所有分数的父物体Item,在上面挂上GridLayoutGroup


这个是用来让分数Prefab自动排版,设置参数如图

然后制作一个分数Prefab,一个空物体下面有3个text子物体分别对应Number,Name,Score

准备工作完事,然后是代码  

  List<Score> scoreList = new List<Score>(); //创建list,用来存Score


当用户进入游戏i主界面时

StreamReader sr = new StreamReader(Application.dataPath + "/Resources/RankingList.txt");
        string nextLine;
        while ((nextLine = sr.ReadLine()) != null)
        {
            scoreList.Add(JsonUtility.FromJson<Score>(nextLine));
        } 
        sr.Close();//将所有存储的分数全部存到list中


当游戏结束分数结算时

        scoreList.Add(new Score(Name, numScore));//分数名字直接调变量,不用给出细节

当用户点击排行榜按钮时

        scoreList.Sort();
        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[i]));
            Debug.Log(scoreList[i].ToString());
        }
        sw.Close();

这样,list中就存了最多10条分数记录了,排序方法需要实现接口。下面是Score类的定义

public class Score : System.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();
    }
}

list的部分就大功告成了,最后是加载Prefab

for (int i = 0; i < scoreList.Count; i++)
        {
            GameObject item = Instantiate(Item.gameObject);
            item.gameObject.SetActive(true);
            item.transform.SetParent(Item.parent, false);
            item.transform.Find("Number").GetComponent<Text>().text = (i + 1).ToString();
            item.transform.Find("Name").GetComponent<Text>().text = scoreList[i].name;
            item.transform.Find("Score").GetComponent<Text>().text = scoreList[i].score.ToString();
        }

主要是用到了unity自己的JsonUtility,将类输出成json的字符串,同样还能将json的字符串转化成类,非常方便。

{"name":"hjkhjk","score":26}
{"name":"zzz","score":15}
{"name":"213","score":9}
{"name":"ad","score":6}
{"name":"g","score":6}
{"name":"3333","score":3}
{"name":"9","score":0}
{"name":"qwe","score":0}
{"name":"l","score":0}
{"name":"9","score":0}


通过JsonUtility,还可以实现很多功能,大坑啊。



0
0
查看评论

Unity3D 实现本地排行榜功能

大家在玩游戏的时候,无论是大型的网游还是普通的手游都会遇见游戏结束时的排行榜,那么这个排行榜是怎么实现的,最近研究了一番。下面让大家看看效果,没有UI,就是简单的Image与Text。 第一个是名次,第二个是名字,第三个是分数,第四个是时间。上面那个是添加新的记录。名字是在前面的场景中拿到的,...
  • CodeKsky
  • CodeKsky
  • 2016-02-19 09:34
  • 4240

Unity实现排行榜(PlayerPrefs)

原文:点击打开链接 using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.SceneManagement; public class Rank : MonoBehaviou...
  • qq_28221881
  • qq_28221881
  • 2016-10-30 00:28
  • 1052

unity5.0.1:利用PlayerPrefs排行榜制作

看到网上制作排行榜的教程一大堆,看了一天,头越来越大,直到后来发现PlayerPrefs,这个是unity自带的,可以将游戏数据永久保存在本地,用来制作排行榜是再好不过的了!! 我们在一个场景的camera上,挂上如下脚本:当然这只是我代码的一部分,大家自己看着弄 b = int.Par...
  • u013129771
  • u013129771
  • 2015-10-28 18:02
  • 1383

Unity3D GameCenter 排行榜, 成就实现

Unity3D内部已经集成了对 GameCenter的支持 在 UnityEngine.SocialPlatforms 命名空间下,基本已经满足目前需求  http://wiki.ceeger.com/manual:social_api?s[]=socialplatforms C#...
  • nicepainkiller
  • nicepainkiller
  • 2016-03-31 15:05
  • 4444

[UnityUI]使用UGUI制作排行榜

本人使用的unity版本是4.6.3 1.首先,制作我们想要显示的内容。这里有一个小技巧,那就是为Panel添加Vertical Layout Group组件,再把一个个Item拖到Panel下,这样unity就会自动为我们排好位置。 2.创建一个Image,调整...
  • lyh916
  • lyh916
  • 2015-03-24 19:26
  • 4772

Unity3D跑酷游戏开发-游戏结束分数排名当前高能显示 (原创教程)

一般游戏结束后都会有个分数排名板。   接下来让分析这功能。 1.游戏结束后显示高分排列,当前玩家分数高能显示。(如果能进入排名板) 2.数据必须持久化,切换场景,关闭开启游戏都要能用。。。   流程: 游戏结束后,调出排名板。 1.取得上次的所有排名数据保存到list泛型,...
  • subsystemp
  • subsystemp
  • 2015-04-19 23:04
  • 6636

unity 2017破解

  • 2017-08-18 16:46
  • 62KB
  • 下载

【unity】利用sqlite制作排行榜

同学做项目的时候,想采用sqlite来制作排行榜。好吧,对于数据库,我只是简单的接触过,并不熟悉。所以今天花了半天多的时间来温习了下这部分知识。。。当然了,我觉得吧,能跟其他知识点结合起来运用,才能最大限度的接受它,了解它。所以呢,本篇文章,在利用本地数据库的同时,利用UGUI简单的制作一个排行榜吧...
  • wonnayov
  • wonnayov
  • 2015-08-04 14:11
  • 1488

【Unity】简单的分数排行榜功能实现(Web数据库)

這篇文章中有使用到的工具有: XAMPP:建立排行榜所需資料庫 NetBeans:撰寫 PHP 表單部分 Unity:撰寫客戶端發送請求 教學中所使用的 Username 為 root 是 MySQL 中預設的使用者帳號,也是權限最高的帳號 因為撰寫教學所以在這裡直接使用 root 建議實際撰寫時...
  • swj524152416
  • swj524152416
  • 2017-04-10 14:17
  • 957

【Unity3d】ScriptableObject介绍和简单的本地排行榜实现

最近有个项目中需要实现一个排行榜系统,只需显示排名和分数,一开始想用sqlite做一个简单的数据库,但是在写文件的时候发现,由于sqlite只支持单线程的写操作,所以在更新排行榜的时候会出现数据库lock的现象。由于排行榜十分简单,所以想着不如用ScriptableObject来实现。当然设计一下感...
  • dark00800
  • dark00800
  • 2017-02-28 16:54
  • 708
    个人资料
    • 访问:15207次
    • 积分:741
    • 等级:
    • 排名:千里之外
    • 原创:60篇
    • 转载:3篇
    • 译文:1篇
    • 评论:0条
    文章分类