12.排行榜数据逻辑

12.开始场景-排行榜数据逻辑


12.1 知识点

明确排行榜数据信息要完成的需求

排行榜数据信息应包含玩家名称、分数和时间,用于展示游戏中玩家的成绩排名。

创建排行榜单条数据类和排行榜列表

/// <summary>
/// 排行榜单条数据
/// </summary>
public class RankInfo
{
    public string name;
    public int score;
    public float time;
    
    //存数据的时候要有无参构造
    public RankInfo()
    {
    
    }
    
    public RankInfo(string name, int score, float time)
    {
        this.name = name;
        this.score = score;
        this.time = time;
    }
}

/// <summary>
/// 排行榜列表
/// </summary>
public class RankList
{
    public List<RankInfo> list;
}

在游戏数据管理类添加排行榜数据对象并在Start读取数据

//排行榜数据对象
public RankList rankData;

//私有构造函数
private GameDataMgr()
{
    //初始化游戏数据

    //...其他代码

    //初始化 读取 排行榜数据
    rankData = PlayerPrefsDataMgr.Instance.LoadData(typeof(RankList), "Rank") as RankList;
}

在排行榜面板完善刷新排行榜列表的逻辑

//更新排行榜信息函数
public void UpdatePanelInfo()
{
    //处理根据排行榜数据 更新面板
    //获取 GameDataMgr中的排行榜列表 用于在这里更新
    //得数据
    List<RankInfo> list = GameDataMgr.Instance.rankData.list;
    //根据列表更新面板数据
    for (int i = 0; i < list.Count; i++)
    {
        //名字
        labName[i].content.text = list[i].name;
        //分数
        labScore[i].content.text = list[i].score.ToString();
        //时间 存储的时间单位是s
        //把秒数 转换成 时  分 秒
        int time = (int)list[i].time;
        labTime[i].content.text = "";
        //得到 几个小时
        // 8432s  60*60 = 3600
        //8432 / 3600 ≈ 2时
        if (time / 3600 > 0)
        {
            labTime[i].content.text += time / 3600 + "时";
        }
        //8432-7200 余 1232s
        // 1232s / 60 ≈ 20分  
        if (time % 3600 / 60 > 0 || labTime[i].content.text != "")
        {
            labTime[i].content.text += time % 3600 / 60 + "分";
        }
        //1232s-1200 余 32秒 直接取余60即可
        labTime[i].content.text += time % 60 + "秒";
    }
}

在游戏数据管理类提供一个在排行榜中添加数据的方法

//提供一个在排行榜中添加数据的方法
public void AddRankInfo(string name, int score, float time)
{
    //添加单条数据
    rankData.list.Add(new RankInfo(name, score, time));
    //排序
    rankData.list.Sort((a, b) => a.time < b.time ? -1 : 1);
    //排序过后 移除10条以外的数据
    //从尾部往前遍历 移除每一条
    for (int i = rankData.list.Count - 1; i >= 10; i--)
    {
        rankData.list.RemoveAt(i);
    }
    //存储
    PlayerPrefsDataMgr.Instance.SaveData(rankData, "Rank");
}

12.2 知识点代码

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

/// <summary>
/// 排行榜单条数据
/// </summary>
public class RankInfo
{
    public string name;
    public int score;
    public float time;

    //存数据的时候要有无参构造
    public RankInfo()
    {

    }

    public RankInfo(string name, int score, float time)
    {
        this.name = name;
        this.score = score;
        this.time = time;
    }
}

/// <summary>
/// 排行榜列表
/// </summary>
public class RankList
{
    public List<RankInfo> list;
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏