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

2023-11-01

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

 

M:


//数据模型类 主要负责数据(玩家的数据)
public class RankModel 
{
    //定义三个属性 姓名、分数、排名
    //定义构造函数
    public string Name{
        set;
        get;
    }

    public int Score{
        set;
        get;
    }

    public int Number{
        set;
        get;
    }

    public RankModel(string name,int score,int number){
        Name = name;
        Score = score;
        Number = number;
    }

}

V:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//排行榜视图类:负责UI数据的显示,向外界提供UI数据初始化的方法
public class RankElementSc : MonoBehaviour
{
    private Text numberText;//显示排名的子物体的text
    private Text nameText;//显示名字的子物体的text
    private Text scoreText;//显示分数的子物体的text

    void Awake()
    {
        numberText = transform.Find("NumberText").GetComponent<Text>();
        nameText = transform.Find("NameText").GetComponent<Text>();
        scoreText = transform.Find("ScoreText").GetComponent<Text>();
    }

    //UI初始化
    public void Init(RankModel rank){
        Debug.Log(numberText + "" + rank.Number);
        numberText.text = rank.Number.ToString();
        nameText.text = rank.Name;
        scoreText.text = rank.Score.ToString();
    }

}

C:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//排行榜控制类,负责数据的处理,游戏的逻辑
public class RankController : MonoBehaviour
{
    public GameObject rankElementPr;//排行榜元素预设体
    List<RankModel> rankModels;//数据的集合
    List<RankElementSc> elementScs;//单元格脚本的集合
    public int RANKNUMBER = 5;//显示排名的数量
    RankModel[] top5Arr;//存放前5名+1的数据
    private string playerData;
    private void Awake()
    {
        rankModels = new List<RankModel>();//初始化玩家列表
        elementScs = new List<RankElementSc>();//初始化单元格脚本列表
        top5Arr = new RankModel[RANKNUMBER + 1];//初始化前5名玩家数组
    }
    void Start()
    {
        LoadData();//加载初始数据
        SortRankdataOrScore();//对所有玩家进行排序
        //DisplayData();//更新所有玩家数据
        DisplayTop5Data();//更新前5名数据
    }

    //加载初始数据
    private void LoadData()
    {
        //创建一个数据
        //RankModel m1 = new RankModel("孙悟空", 99, 0);
        //rankModels.Add(m1);
        //RankModel m2 = new RankModel("李寻欢", 66, 0);
        //rankModels.Add(m2);
        //RankModel m3 = new RankModel("猪八戒", 70, 0);
        //rankModels.Add(m3);
        //RankModel m4 = new RankModel("沙僧", 89, 0);
        //rankModels.Add(m4);
        //RankModel m5 = new RankModel("傻吊", 30, 0);
        //rankModels.Add(m5);
        //RankModel m6 = new RankModel("测试玩家", 0, 0);
        //rankModels.Add(m6);
        //PlayerPrefs.DeleteAll();
        //初始数据
        //if (!PlayerPrefs.HasKey("RankData"))
        //{
        //    playerData = "孙悟空 99 0\n李寻欢 66 0\n猪八戒 70 0\n沙僧 89 0\n傻吊 30 0\n测试玩家 0 0";
        //    PlayerPrefs.SetString("RankData", playerData);
        //}
        解析数据
        //string Datas = PlayerPrefs.GetString("RankData");
        //string[] playerdatas = Datas.Split('\n');
        //foreach (string item in playerdatas)
        //{
        //    string[] playerdata = item.Split(' ');
        //    string modelName = playerdata[0];
        //    string modelScore = playerdata[1];
        //    string modelRank = playerdata[2];
        //    RankModel model = new RankModel(modelName, int.Parse(modelScore), int.Parse(modelRank));
        //    rankModels.Add(model);
        //}
        if (!PlayerPrefs.HasKey("RankData"))
        {
            playerData = "孙悟空 99 0\n李寻欢 66 0\n猪八戒 70 0\n沙僧 89 0\n傻吊 30 0\n测试玩家 0 0";
            PlayerPrefs.SetString("RankData",playerData);
        }
        string Datas =PlayerPrefs.GetString("RankData");
        string[] playerdatas = Datas.Split('\n');
        foreach (string item in playerdatas)
        {
            string[] playerdata = item.Split(' ');
            string modelName = playerdata[0];
            string modelScore = playerdata[1];
            string modelRank = playerdata[2];
            RankModel model = new RankModel(modelName, int.Parse(modelScore), int.Parse(modelRank));
            rankModels.Add(model);

        }




        //将6名玩家添加到排行榜前五名数组中
        top5Arr = rankModels.ToArray();
        //对前五名数组排序
        SortTop5Arr();
    }

    //刷新数据--创建UI
    private void DisplayData()
    {
        for (int i = 0; i < rankModels.Count; i++)
        {
            //调用UI初始化方法,传递数据
            CreatElement().Init(rankModels[i]);
        }
    }

    //更新前5名数据
    void DisplayTop5Data()
    {
        for (int i = 0; i < top5Arr.Length - 1; i++)
        {
            //调用UI初始化方法,传递数据
            CreatElement().Init(top5Arr[i]);
        }
    }


    //创建一个单元格
    RankElementSc CreatElement()
    {
        //创建UI排行榜元素
        GameObject element = Instantiate<GameObject>(rankElementPr);
        //设置父物体,自身缩放与父物体缩放无关
        element.transform.SetParent(transform, false);
        //添加组件
        RankElementSc ranksc = element.AddComponent<RankElementSc>();
        //将脚本添加到集合
        elementScs.Add(ranksc);
        return ranksc;
    }
    //对所有玩家进行排序
    private void SortRankdataOrScore()
    {
        for (int i = 0; i < rankModels.Count - 1; i++)
        {
            bool k = false;
            for (int j = 0; j < rankModels.Count - 1 - i; j++)
            {
                if (rankModels[j].Score < rankModels[j + 1].Score)
                {
                    RankModel temp;
                    temp = rankModels[j];
                    rankModels[j] = rankModels[j + 1];
                    rankModels[j + 1] = temp;
                    k = true;
                }
            }
            if (!k)
            {
                break;
            }
        }

        //设置玩家排名
        for (int i = 0; i < rankModels.Count; i++)
        {
            rankModels[i].Number = i + 1;
        }
    }

    //对前5名数组进行排序
    private void SortTop5Arr()
    {
        for (int i = 0; i < top5Arr.Length - 1; i++)
        {
            bool k = false;
            for (int j = 0; j < top5Arr.Length - 1 - i; j++)
            {
                if (top5Arr[j].Score < top5Arr[j + 1].Score)
                {
                    RankModel temp;
                    temp = top5Arr[j];
                    top5Arr[j] = top5Arr[j + 1];
                    top5Arr[j + 1] = temp;
                    k = true;
                }
            }
            if (!k)
            {
                break;
            }
        }

        //排名
        for (int i = 0; i < top5Arr.Length; i++)
        {
            top5Arr[i].Number = i + 1;
        }
    }

    //增加玩家
    int playerName = 0;
    public void AddPlayer()
    {
        //增模拟加一名新玩家
        playerName++;
        int score = Random.Range(0, 100);
        RankModel model = new RankModel("玩家" + playerName, score, 0);
        rankModels.Add(model);

        //创建单元格
        CreatElement();
        //重新排序
        SortRankdataOrScore();
        //刷新数据
        RefreshData();
    }

    //刷新数据
    void RefreshData()
    {
        for (int i = 0; i < rankModels.Count; i++)
        {
            elementScs[i].Init(rankModels[i]);
        }
    }

    //刷新数据 -- 前五名数组
    void RefreshData(RankModel[] topArr)
    {
        for (int i = 0; i < topArr.Length - 1; i++)
        {
            elementScs[i].Init(topArr[i]);
        }
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            //AddPlayer();
            //增模拟加一名新玩家
            playerName++;
            int score = Random.Range(0, 100);
            RankModel model = new RankModel("玩家" + playerName, score, 0);
            rankModels.Add(model);
            //替换掉原排名数组中第6人的名单
            top5Arr[RANKNUMBER] = model;
            //重新排序
            SortTop5Arr();
            //刷新数据
            RefreshData(top5Arr);
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity排行榜功能(使用MVC框架) 的相关文章

  • Stream流

    概念 是JDK1 8的新语法 和IO流不是一个东西相当于流水线 很方便的对数据进行加工 Stream流把真正的函数式编程风格引入到Java中 代码简洁 Stream流不能直接修改数据源中的数据 不使用Stream流的优势是加工处理数据 每个

随机推荐

  • buuctf_Exec

    0x01 题目链接 BUUCTF在线评测BUUCTF 是一个 CTF 竞赛和训练平台 为各位 CTF 选手提供真实赛题在线复现等服务 https buuoj cn challenges 0x02 题目 打开题目就看到大大的PING 二话不说
  • 在存储过程中使用了DML语句要不要调用COMMIT?

    要调用commit语句 或者正常退出sqlplus 系统会自动提交 dml语句不能自动提交 ddl语句和dcl语句可以自动提交 转自 http bbs csdn net topics 80160481
  • 胶囊体阴影

    官方介绍 虚幻引擎现在支持非常柔滑的间接阴影 由代表角色的胶囊体来进行投影 通常 在受间接光照时 并不会产生阴影 除非是屏幕空间环境遮罩 间接投影需要做的非常柔滑 因为间接光照是来自很多不同的方向 因此 传统的阴影贴图做法的效果并不好 间接
  • android windows 安装

    转自 http www cnblogs com skynet archive 2010 04 12 1709892 html 本系列适合0基础的人员 因为我就是从0开始的 此系列记录我步入Android开发的一些经验分享 望与君共勉 作为A
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决

    安防视频监控汇聚EasyNVR视频集中存储平台 是基于RTSP Onvif协议的安防视频平台 可支持将接入的视频流进行全平台 全终端分发 分发的视频流包括RTSP RTMP HTTP FLV WS FLV HLS WebRTC等格式 为了满
  • MATLAB神经网络编程(四)——线性神经网络的实现与局限

    MATLAB神经网络编程 化学工业出版社 读书笔记 第四章 前向型神经网络 4 2 线性神经网络 本文是 MATLAB神经网络编程 书籍的阅读笔记 其中涉及的源码 公式 原理都来自此书 若有不理解之处请参阅原书 一 线性神经网络的实现 线性
  • vue 中 elementui Dropdown 下拉菜单中 选项的click事件

  • gcc/g++交叉编译*.c/*.cpp程序时的配置

    CFLAGS I PWD src CFLAGS I third party hisi include CFLAGS L third party hisi lib CXXFLAGS I PWD src CXXFLAGS I third par
  • 电脑网络故障:LSP造成?

    问题 1 什么是LSP 删除了什么才导致了不能上网 LSP 为什么能影响网络 其内部的原理机制是什么 网络连接正常但无法上网 能ping通外网DNS 解决方法 2013 11 03 00 47 17 转载 标签 辅助工具 在线聊天 解决方法
  • java 阻塞模式与非阻塞模式

    TCP IP 阻塞模式与非阻塞模式 java view plain copy print package concurrentTest import java io BufferedReader import java io IOExcep
  • warning:Deprecated declaration LaberPwmSel_High - give arg types解决方法

    有些小伙伴在编译代码的时候偶尔会遇到这样的警告 当然这对整体并没有什么影响 直接忽略也是ok的 警告的大概意思是 LaberPwmSel High 应该提供类型声明 也就是说 使用MDK编译器的时候 如果函数在定义时没有传参 要在括号中加v
  • css禁止滑动页面_css页面滑动穿透的两种解决办法

    这篇文章主要介绍了css如何防止页面滑动穿透 小编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 问题描述 移动端当有 fixed 遮罩背景和弹出层时 在屏幕上滑动能够滑动背景下面的内容 这就是著名的滚动穿透问题 示
  • java实现----sql解析器

    更新中 首先我们项目要编写一个小型的dbms 所以我负责编写的sql解析的部分 所以本文只是记录我学习和编写sql解析器的过程
  • 大型网站架构之架构模式

    上节讲了大型网站的演变 今天讲下架构的模式 什么是模式呢 每一个模式描述了一个再我们周围不断重复发生的问题及问题解决方案的核心 这样你就能一次次重用该方案而不必去做重复的工作 可见模式的关键在于可重复性 网站架构模式的目标 面临高并发访问
  • element-ui中文官方文档入口

    点击下面链接 element ui点我跳转中文文档链接
  • 小区视频监控系统

    一 方案概述 名称 小区视频监控系统设计方案 内容 现在高档小区在大中小城市遍布各个角落 每天进出这些小区人形形色色 人们的居住环境应该有所保障 加上小区内部的高档配置硬件更应如此 但是仅仅靠人力所为是不现实的 人力成本 维护成本 效率低下
  • Git技能树(3):Git使用

    Git技能树 3 Git使用 在开始 Git 的基础命令学习之前 我们先来认识一下版本库 Repository 接下来我们所有提到的 Git 基础命令 都是基于版本库的 那么什么是版本库呢 版本库又名仓库 英文名 repository 你可
  • mybatis-plus更新数据updateById返回false

    Packet byId ips getById 211l System out println byId Packet pa new Packet pa setId byId getId pa setStatus 1 pa setVersi
  • 霍夫投票直观理解

    霍夫投票法最典型的示例是二维图像中霍夫直线检测 过二维平面中的定点可以得到无数条直线 如果以顶点参数为做一条直线 即将这些直线变换到参数空间 那么这个定点对应参数空间中的一条直线 如果在参数空间中有两条直线相交于同一个点 那么说明对应的两个
  • Unity排行榜功能(使用MVC框架)

    要求 实现如图所示UI界面 按下某一按键实现排行榜的更新 M 数据模型类 主要负责数据 玩家的数据 public class RankModel 定义三个属性 姓名 分数 排名 定义构造函数 public string Name set g