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

要求:实现如图所示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);
        }
    }
}

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity游戏中,MVC框架可以帮助我们更好地管理UI。MVC是一种将代码的功能进行划分的设计框架,主要原理是将软件用户界面和业务逻辑分离,提高代码的可扩展性、可复用性、可维护性和灵活性。 在Unity中,我们可以将MVC框架应用到游戏的UI设计中。举个例子来说,当游戏要发布节日活动,并且需要相应地更改游戏UI时,使用MVC框架可以将UI的功能分开,达到低耦合的效果。这样,当替换UI时,其他功能不会受到影响,提高游戏的质量。 在Unity开发过程中,许多公司都使用MVC的逻辑模式,即数据模型-视图-控制器。数据模型负责存储和管理游戏数据,视图负责显示用户界面,而控制器负责处理用户输入和更新数据模型。通过将这些功能分离,我们可以更好地组织和管理UI代码,提高开发效率。 所以,通过应用MVC框架,我们可以更好地管理Unity游戏的UI,提高代码的可维护性和可扩展性,同时也能提高游戏的质量和用户体验。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【Unity3D日常开发】Unity3d中使用MVC框架](https://blog.csdn.net/q764424567/article/details/83788696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Unity框架——MVC框架](https://blog.csdn.net/Htlas/article/details/79076201)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值