当前位置:   article > 正文

Unity排行榜功能(使用MVC框架)_unity 排行榜

unity 排行榜

要求:实现如图所示UI界面,按下某一按键实现排行榜的更新

 

M:

  1. //数据模型类 主要负责数据(玩家的数据)
  2. public class RankModel
  3. {
  4. //定义三个属性 姓名、分数、排名
  5. //定义构造函数
  6. public string Name{
  7. set;
  8. get;
  9. }
  10. public int Score{
  11. set;
  12. get;
  13. }
  14. public int Number{
  15. set;
  16. get;
  17. }
  18. public RankModel(string name,int score,int number){
  19. Name = name;
  20. Score = score;
  21. Number = number;
  22. }
  23. }

V:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. //排行榜视图类:负责UI数据的显示,向外界提供UI数据初始化的方法
  6. public class RankElementSc : MonoBehaviour
  7. {
  8. private Text numberText;//显示排名的子物体的text
  9. private Text nameText;//显示名字的子物体的text
  10. private Text scoreText;//显示分数的子物体的text
  11. void Awake()
  12. {
  13. numberText = transform.Find("NumberText").GetComponent<Text>();
  14. nameText = transform.Find("NameText").GetComponent<Text>();
  15. scoreText = transform.Find("ScoreText").GetComponent<Text>();
  16. }
  17. //UI初始化
  18. public void Init(RankModel rank){
  19. Debug.Log(numberText + "" + rank.Number);
  20. numberText.text = rank.Number.ToString();
  21. nameText.text = rank.Name;
  22. scoreText.text = rank.Score.ToString();
  23. }
  24. }

C:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. //排行榜控制类,负责数据的处理,游戏的逻辑
  5. public class RankController : MonoBehaviour
  6. {
  7. public GameObject rankElementPr;//排行榜元素预设体
  8. List<RankModel> rankModels;//数据的集合
  9. List<RankElementSc> elementScs;//单元格脚本的集合
  10. public int RANKNUMBER = 5;//显示排名的数量
  11. RankModel[] top5Arr;//存放前5+1的数据
  12. private string playerData;
  13. private void Awake()
  14. {
  15. rankModels = new List<RankModel>();//初始化玩家列表
  16. elementScs = new List<RankElementSc>();//初始化单元格脚本列表
  17. top5Arr = new RankModel[RANKNUMBER + 1];//初始化前5名玩家数组
  18. }
  19. void Start()
  20. {
  21. LoadData();//加载初始数据
  22. SortRankdataOrScore();//对所有玩家进行排序
  23. //DisplayData();//更新所有玩家数据
  24. DisplayTop5Data();//更新前5名数据
  25. }
  26. //加载初始数据
  27. private void LoadData()
  28. {
  29. //创建一个数据
  30. //RankModel m1 = new RankModel("孙悟空", 99, 0);
  31. //rankModels.Add(m1);
  32. //RankModel m2 = new RankModel("李寻欢", 66, 0);
  33. //rankModels.Add(m2);
  34. //RankModel m3 = new RankModel("猪八戒", 70, 0);
  35. //rankModels.Add(m3);
  36. //RankModel m4 = new RankModel("沙僧", 89, 0);
  37. //rankModels.Add(m4);
  38. //RankModel m5 = new RankModel("傻吊", 30, 0);
  39. //rankModels.Add(m5);
  40. //RankModel m6 = new RankModel("测试玩家", 0, 0);
  41. //rankModels.Add(m6);
  42. //PlayerPrefs.DeleteAll();
  43. //初始数据
  44. //if (!PlayerPrefs.HasKey("RankData"))
  45. //{
  46. // playerData = "孙悟空 99 0\n李寻欢 66 0\n猪八戒 70 0\n沙僧 89 0\n傻吊 30 0\n测试玩家 0 0";
  47. // PlayerPrefs.SetString("RankData", playerData);
  48. //}
  49. 解析数据
  50. //string Datas = PlayerPrefs.GetString("RankData");
  51. //string[] playerdatas = Datas.Split('\n');
  52. //foreach (string item in playerdatas)
  53. //{
  54. // string[] playerdata = item.Split(' ');
  55. // string modelName = playerdata[0];
  56. // string modelScore = playerdata[1];
  57. // string modelRank = playerdata[2];
  58. // RankModel model = new RankModel(modelName, int.Parse(modelScore), int.Parse(modelRank));
  59. // rankModels.Add(model);
  60. //}
  61. if (!PlayerPrefs.HasKey("RankData"))
  62. {
  63. playerData = "孙悟空 99 0\n李寻欢 66 0\n猪八戒 70 0\n沙僧 89 0\n傻吊 30 0\n测试玩家 0 0";
  64. PlayerPrefs.SetString("RankData",playerData);
  65. }
  66. string Datas =PlayerPrefs.GetString("RankData");
  67. string[] playerdatas = Datas.Split('\n');
  68. foreach (string item in playerdatas)
  69. {
  70. string[] playerdata = item.Split(' ');
  71. string modelName = playerdata[0];
  72. string modelScore = playerdata[1];
  73. string modelRank = playerdata[2];
  74. RankModel model = new RankModel(modelName, int.Parse(modelScore), int.Parse(modelRank));
  75. rankModels.Add(model);
  76. }
  77. //6名玩家添加到排行榜前五名数组中
  78. top5Arr = rankModels.ToArray();
  79. //对前五名数组排序
  80. SortTop5Arr();
  81. }
  82. //刷新数据--创建UI
  83. private void DisplayData()
  84. {
  85. for (int i = 0; i < rankModels.Count; i++)
  86. {
  87. //调用UI初始化方法,传递数据
  88. CreatElement().Init(rankModels[i]);
  89. }
  90. }
  91. //更新前5名数据
  92. void DisplayTop5Data()
  93. {
  94. for (int i = 0; i < top5Arr.Length - 1; i++)
  95. {
  96. //调用UI初始化方法,传递数据
  97. CreatElement().Init(top5Arr[i]);
  98. }
  99. }
  100. //创建一个单元格
  101. RankElementSc CreatElement()
  102. {
  103. //创建UI排行榜元素
  104. GameObject element = Instantiate<GameObject>(rankElementPr);
  105. //设置父物体,自身缩放与父物体缩放无关
  106. element.transform.SetParent(transform, false);
  107. //添加组件
  108. RankElementSc ranksc = element.AddComponent<RankElementSc>();
  109. //将脚本添加到集合
  110. elementScs.Add(ranksc);
  111. return ranksc;
  112. }
  113. //对所有玩家进行排序
  114. private void SortRankdataOrScore()
  115. {
  116. for (int i = 0; i < rankModels.Count - 1; i++)
  117. {
  118. bool k = false;
  119. for (int j = 0; j < rankModels.Count - 1 - i; j++)
  120. {
  121. if (rankModels[j].Score < rankModels[j + 1].Score)
  122. {
  123. RankModel temp;
  124. temp = rankModels[j];
  125. rankModels[j] = rankModels[j + 1];
  126. rankModels[j + 1] = temp;
  127. k = true;
  128. }
  129. }
  130. if (!k)
  131. {
  132. break;
  133. }
  134. }
  135. //设置玩家排名
  136. for (int i = 0; i < rankModels.Count; i++)
  137. {
  138. rankModels[i].Number = i + 1;
  139. }
  140. }
  141. //对前5名数组进行排序
  142. private void SortTop5Arr()
  143. {
  144. for (int i = 0; i < top5Arr.Length - 1; i++)
  145. {
  146. bool k = false;
  147. for (int j = 0; j < top5Arr.Length - 1 - i; j++)
  148. {
  149. if (top5Arr[j].Score < top5Arr[j + 1].Score)
  150. {
  151. RankModel temp;
  152. temp = top5Arr[j];
  153. top5Arr[j] = top5Arr[j + 1];
  154. top5Arr[j + 1] = temp;
  155. k = true;
  156. }
  157. }
  158. if (!k)
  159. {
  160. break;
  161. }
  162. }
  163. //排名
  164. for (int i = 0; i < top5Arr.Length; i++)
  165. {
  166. top5Arr[i].Number = i + 1;
  167. }
  168. }
  169. //增加玩家
  170. int playerName = 0;
  171. public void AddPlayer()
  172. {
  173. //增模拟加一名新玩家
  174. playerName++;
  175. int score = Random.Range(0, 100);
  176. RankModel model = new RankModel("玩家" + playerName, score, 0);
  177. rankModels.Add(model);
  178. //创建单元格
  179. CreatElement();
  180. //重新排序
  181. SortRankdataOrScore();
  182. //刷新数据
  183. RefreshData();
  184. }
  185. //刷新数据
  186. void RefreshData()
  187. {
  188. for (int i = 0; i < rankModels.Count; i++)
  189. {
  190. elementScs[i].Init(rankModels[i]);
  191. }
  192. }
  193. //刷新数据 -- 前五名数组
  194. void RefreshData(RankModel[] topArr)
  195. {
  196. for (int i = 0; i < topArr.Length - 1; i++)
  197. {
  198. elementScs[i].Init(topArr[i]);
  199. }
  200. }
  201. private void Update()
  202. {
  203. if (Input.GetKeyDown(KeyCode.Space))
  204. {
  205. //AddPlayer();
  206. //增模拟加一名新玩家
  207. playerName++;
  208. int score = Random.Range(0, 100);
  209. RankModel model = new RankModel("玩家" + playerName, score, 0);
  210. rankModels.Add(model);
  211. //替换掉原排名数组中第6人的名单
  212. top5Arr[RANKNUMBER] = model;
  213. //重新排序
  214. SortTop5Arr();
  215. //刷新数据
  216. RefreshData(top5Arr);
  217. }
  218. }
  219. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/369446
推荐阅读
相关标签
  

闽ICP备14008679号