大家在玩游戏的时候,无论是大型的网游还是普通的手游都会遇见游戏结束时的排行榜,那么这个排行榜是怎么实现的,最近研究了一番。下面让大家看看效果,没有UI,就是简单的Image与Text。

第一个是名次,第二个是名字,第三个是分数,第四个是时间。上面那个是添加新的记录。名字是在前面的场景中拿到的,如果测试,可以在当前的场景中直接把Text改为InputField即可。

下面是我用到的代码。

1.先搭建基本的UI。大家可以自由发挥。

2.这是基本的声明。

    //输入需要排行的信息-在实际逻辑中从外部获取再展示public InputField inputField;//提交需要排行信息public Button button;public GameObject prefabShow;public Image parentsShow;public Image parentsShowUI;public Text textName;

3.在初始化时我们拿到玩家的名字和对事件绑定。就是提交按钮触发的事件。

     void Start (){textName.text = Global.PlayerName;button.GetComponent<Button>().onClick.AddListener(InputOK);}void InputOK(){Global.SkillCount = int.Parse(inputField.text);string PlayerResultDate = ResultToJson(Global.PlayerName, Global.SkillCount);SaveString(PlayerResultDate);DictionarySort(GetJsonDate()); }

2.首先需要知道,既然是排行榜,一定涉及到了数据持久化,那么,在这我用的是Json,对于Json的操作我就不在这里赘述了。我存取的方式是将名字分数以及时间存在本地。

    //将数据转化成Jsonpublic string ResultToJson(string Name, int NowCount){StringBuilder sb = new StringBuilder();JsonWriter WriteDate = new JsonWriter(sb);WriteDate.WriteObjectStart();WriteDate.WritePropertyName("Name");WriteDate.Write(Name + "|" + DateTime.Now.ToShortTimeString());WriteDate.WritePropertyName("Count");WriteDate.Write(NowCount);WriteDate.WriteObjectEnd();return sb.ToString();}//下面的方法就是保存在本地private void SaveString(string str){FileInfo fi = new FileInfo(Application.dataPath + "/Resources/Json.txt");StreamWriter sw = null;if (fi.Exists){sw = fi.AppendText();}else{sw = fi.CreateText();}sw.WriteLine(str);sw.Close();}//下面的方法是获取Json数据public Dictionary<string, int> GetJsonDate(){FileStream fi = new FileStream(Application.dataPath + "/Resources/Json.txt", FileMode.Open);Dictionary<string, int> jsonDate = new Dictionary<string, int>();if (fi.CanRead){StreamReader sw = new StreamReader(fi);string jsonStr;while ((jsonStr = sw.ReadLine()) != null){JsonData data = JsonMapper.ToObject(jsonStr);jsonDate.Add(data["Name"].ToString(), int.Parse(data["Count"].ToString()));}}return jsonDate;}//这个方法是把获取的Json数据排序并且显示出来private void DictionarySort(Dictionary<string, int> dic){if (dic.Count > 0){List<KeyValuePair<string, int>> lst = new List<KeyValuePair<string, int>>(dic);lst.Sort(delegate(KeyValuePair<string, int> s1, KeyValuePair<string, int> s2){return s2.Value.CompareTo(s1.Value);});//parentsShow.rectTransform.sizeDelta = new Vector2(600, lst.Count * 100);//parentsShowUI.GetComponent<Mask>().enabled = true;//parentsShowUI.GetComponentInChildren<Scrollbar>().value = 1;dic.Clear();float i = 1, r = 1, g = 1, b = 0;foreach (KeyValuePair<string, int> kvp in lst){if (i <= 3){string[] Key = kvp.Key.Split('|');GameObject ga = Instantiate(prefabShow, parentsShow.transform.position, Quaternion.identity) as GameObject;ga.transform.parent = parentsShow.transform;r -= 0.2f;g -= 0.2f;b -= 0.2f;Debug.Log(r + g + b);Text[] Children = ga.GetComponentsInChildren<Text>();Children[0].color = new Color(r, g, b);Children[1].color = new Color(r, g, b);Children[2].color = new Color(r, g, b);                Children[3].color = new Color(r, g, b);Children[1].text = Key[0];Children[3].text = kvp.Value.ToString();Children[2].text = Key[1];Children[0].text = (i++).ToString();}else{string[] Key = kvp.Key.Split('|');GameObject ga = Instantiate(prefabShow, parentsShow.transform.position, Quaternion.identity) as GameObject;ga.transform.parent = parentsShow.transform;Text[] Children = ga.GetComponentsInChildren<Text>();Children[1].text = Key[0];Children[3].text = kvp.Value.ToString();Children[2].text = Key[1];Children[0].text = (i++).ToString();}      }}}

好了,这个排行榜的主要逻辑部分就完成了,如果有什么写得不对的地方 ,希望大家在下方留言,一起进步与提升。



Unity3D 实现本地排行榜功能相关推荐

  1. cocosjs微信头像本地服务器,Cocos creator游戏接入微信开放数据域,实现好友排行榜功能...

    微信小游戏加入排行榜功能,可以增加游戏微信好友参与,增加分数竞争氛围,官方的说明文档不怎么详细,也有坑.本文实战以cocos creator v2.2版本为例,供大家参考. 结果显示: 前提: 1.创 ...

  2. 捕获Camera并保存图片到本地(照相功能) -samhy

    Flex博文 捕获Camera并保存图片到本地(照相功能) -samhy 作者:admin 日期:2010-07-12 字体大小: 小 中 大 捕获Camera并保存图片到本地(照相功能) 这几天对C ...

  3. php redis 搜索,PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

    许多网站都有排行榜的功能,比如球员人气榜单.阅读排行榜,对于一些小网站,通过查数据库就能实现排行榜的功能,但是对于稍微有点用户量而且还是实时排名的网站,使用一些关系型数据库如(MySQL.Oracle ...

  4. 新增本地存储功能 山石网科发布下一代防火墙新品

    网络安全空间厂商山石网科宣布发布下一代防火墙新产品--增加本地存储功能的山石网科E系列下一代防火墙.本次发布的E系列产品包含8款型号,具备日志.报表本地存储功能,覆盖更多的应用场景,满足用户对存储的需 ...

  5. ueditor去掉本地保存功能

    2019独角兽企业重金招聘Python工程师标准>>> ueditor.config.js文件中设置enableAutoSave参数为false就可以关闭本地保存功能. // 启用自 ...

  6. 小播本地音乐功能指引

    小播本地音乐功能指引 (小播与手机设备需要在同一个局域网下使用) 注释:小播APK(安卓端)已经实现本地音乐播放功能模块,可在app程序中使用. 小播iOS(苹果端)该功能需要使用 iOS系统所提供的 ...

  7. 前端Vue项目中点击a标签实现下载文件到本地的功能

    点击a标签可实现下载图片或者是文件到本地的功能 1.根据后台提供的接口url下载文件到本地 <a :href="后台给接口提供的文件的url地址">点击下载文件< ...

  8. 【Python_PyQtGraph 学习笔记(四)】基于PyQtGraph设置槽函数,实现保存图片到本地的功能

    基于PyQtGraph设置槽函数,实现保存图片到本地的功能 前言 基于PyQtGraph实现绘图功能后,想要将绘制好的图片保存到本地,PyQtGraph是支持在可视化窗口中右键保存的(Exportin ...

  9. 使用 Redis 实现语音社交聊天室源码中的排行榜功能

    在语音社交聊天室源码中,排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般语音社交聊天室源码的排行榜都是有实效性的,比如"用户积分榜&quo ...

最新文章

  1. BCH区块链上启动新应用程序Chainfeed
  2. PC微信逆向:分析通用设置数组
  3. python字典赋值方法_python如何给字典的键对应的值为字典项的字典赋值
  4. Java项目出现的问题01----学习
  5. Http协议Get方式获取图片
  6. 随想录(机器学习的生产应用)
  7. apache字体文件跨域_在CabloyJS中将Webpack生成的文件自动上传到阿里云OSS
  8. 微信、支付宝否认提供「锁定 35 万人」数据;苹果押宝中国 5G 市场;TiDB 4.0.1 发布 | 极客头条...
  9. mysql工具分页原理_高效的mysql分页方法及原理
  10. eclipse(window平台)快捷键总结
  11. 实验七 6 音乐DJ和回响贝斯
  12. 最全的视频格式分类详解(很全面)
  13. ofd文件怎么编辑文字
  14. pypyodbc 连接Access数据库常见报错整理
  15. tplink迷你路由器中继模式_[转载]TL-WR800N迷你型无线路由器Repeater模式(中继模式)设置教程...
  16. IT黑马成长之CSDN第一篇博客
  17. 报错 Delete `··` prettier/prettier解决方法
  18. 拦截广告的链接(注意软件的广告不拦截,只拦截桌面图标链接)
  19. Quartus与Modelsim联合仿真ROM IP时输出波形一直为零的问题以及ROM配置仿真教程
  20. 真香啊,推荐 6 个 Python 数据分析神器

热门文章

  1. oracle按层级分组,oracle按照指定列分组合计group by rollup()
  2. 如何在Linux系统中安装DBeaver通用数据库工具
  3. 《2021中国企业数智化转型升级发展研究报告》正式发布丨数据猿上海大数据联盟...
  4. php实现验证码(数字、字母、汉字)
  5. 分布式系统生成唯一主键
  6. [悦读] 让听得见炮声的人来决策——《赋能》读书笔记
  7. 飞塔防火墙HA详解与配置
  8. 微信内链接已禁止访问是什么情况?微信链接防封细节
  9. C语言课程设计:通讯录系统
  10. PopupWindow底部弹出,底部UI被遮盖问题