栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

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

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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();
        nameText = transform.Find("NameText").GetComponent();
        scoreText = transform.Find("ScoreText").GetComponent();
    }

    //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 rankModels;//数据的集合
    List elementScs;//单元格脚本的集合
    public int RANKNUMBER = 5;//显示排名的数量
    RankModel[] top5Arr;//存放前5名+1的数据
    private string playerData;
    private void Awake()
    {
        rankModels = new List();//初始化玩家列表
        elementScs = new List();//初始化单元格脚本列表
        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 0n李寻欢 66 0n猪八戒 70 0n沙僧 89 0n傻吊 30 0n测试玩家 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 0n李寻欢 66 0n猪八戒 70 0n沙僧 89 0n傻吊 30 0n测试玩家 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(rankElementPr);
        //设置父物体,自身缩放与父物体缩放无关
        element.transform.SetParent(transform, false);
        //添加组件
        RankElementSc ranksc = element.AddComponent();
        //将脚本添加到集合
        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);
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902341.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号