9.排行榜界面逻辑

  1. 9.开始场景-排行榜界面-逻辑处理
    1. 9.1 知识点
      1. 创建排行榜界面RankPanel 脚本继承面板基类挂载到排行榜面板控件,添加关闭按钮和排行榜滚动视图控件变量并关联。初始化的时候给关闭按钮添加隐藏排行榜面板的监听,初始化要隐藏排行榜面板,重写显示自己的方法,在显示自己时应该更新排行榜面板,这个等一下处理。让开始面板的排行榜按钮点击真正显示排行榜面板。
      2. 创建排行榜单条RankItem脚本,添加三个label变量,挂载到RankItem预制体上并关联三个label变量。封装一个让RankItem预制体显示初始化的方法暴露给排行榜面板使用。
      3. 在排行榜界面RankPanel脚本创建一个存储每个排行榜单个Item的列表。在排行榜界面RankPanel脚本重写的显示面板方法中,处理实际显示排行榜的逻辑。首先得到游戏数据管理器中排行榜数据的排行榜信息列表,遍历这个排行榜信息列表。判断当前排行榜面板上的排行榜单个Item的数量有没有数据里的多。没有的话直接设置当前数据到对应排行榜单个Item上。数据更多的话,实例化新的排行榜单个Item得到上面的脚本传入数据设置父对象设置位置。新实例化的排行榜单个Item添加到排行榜单个Item的列表中去。
      4. 可以在排行榜面板脚本的Init处添加测试代码,测试添加排行榜数据,看刷出来的正不正常。添加排行榜代码实际上要在完成游戏后输入姓名确认后再添加的。
      5. 可以把xml文件存的地址打印出来,看存储的xml文件的内容。
    2. 9.2 知识点代码
      1. RankPanel
      2. RankItem
      3. BeginPanel

9.开始场景-排行榜界面-逻辑处理


9.1 知识点

创建排行榜界面RankPanel 脚本继承面板基类挂载到排行榜面板控件,添加关闭按钮和排行榜滚动视图控件变量并关联。初始化的时候给关闭按钮添加隐藏排行榜面板的监听,初始化要隐藏排行榜面板,重写显示自己的方法,在显示自己时应该更新排行榜面板,这个等一下处理。让开始面板的排行榜按钮点击真正显示排行榜面板。

//排行榜界面类
public class RankPanel : BasePanel<RankPanel>
{
    //关闭按钮
    public UIButton btnClose;
    //排行榜列表ScrollView
    public UIScrollView svList;

    //存储每个排行榜项的控件
    private List<RankItem> itemList = new List<RankItem>();

    //初始化方法
    public override void Init()
    {
        //为关闭按钮添加点击事件
        btnClose.onClick.Add(new EventDelegate(() => {
            HideMe();
        }));

        //隐藏排行榜界面
        HideMe();

    }

    //显示排行榜界面的方法
    public override void ShowMe()
    {
        base.ShowMe();
        //更新面板上显示的信息

        
    }
}
//开始面板的排行榜按钮
btnRank.onClick.Add(new EventDelegate(() => {
    //显示 排行榜
    RankPanel.Instance.ShowMe();
}));

创建排行榜单条RankItem脚本,添加三个label变量,挂载到RankItem预制体上并关联三个label变量。封装一个让RankItem预制体显示初始化的方法暴露给排行榜面板使用。

//定义一个名为RankItem的类,继承自MonoBehaviour,用于表示排行榜单条数据的组合控件
public class RankItem : MonoBehaviour
{
    //定义一个公共字段labRank,用于存储排名标签
    public UILabel labRank;
    //定义一个公共字段labName,用于存储玩家名称标签
    public UILabel labName;
    //定义一个公共字段labTime,用于存储玩家成绩标签
    public UILabel labTime;

    /// <summary>
    /// 根据排行榜单条数据 对组合控件 进行显示初始化
    /// </summary>
    /// <param name="rank">排名</param>
    /// <param name="name">名字</param>
    /// <param name="time">时间</param>
    public void InitInfo(int rank, string name, int time)
    {
        //设置排名标签的文本为当前排名
        labRank.text = rank.ToString();
        //设置玩家名称标签的文本为玩家名称
        labName.text = name;
        //设置玩家成绩标签的文本为玩家成绩
        string str = "";
        //时(小时)
        if (time / 3600 > 0)
            str += time / 3600 + "h";
        //分
        if (time % 3600 / 60 > 0 || str != "")
            str += time % 3600 / 60 + "m";
        //秒
        str += time % 60 + "s";

        labTime.text = str;
    }
}

在排行榜界面RankPanel脚本创建一个存储每个排行榜单个Item的列表。在排行榜界面RankPanel脚本重写的显示面板方法中,处理实际显示排行榜的逻辑。首先得到游戏数据管理器中排行榜数据的排行榜信息列表,遍历这个排行榜信息列表。判断当前排行榜面板上的排行榜单个Item的数量有没有数据里的多。没有的话直接设置当前数据到对应排行榜单个Item上。数据更多的话,实例化新的排行榜单个Item得到上面的脚本传入数据设置父对象设置位置。新实例化的排行榜单个Item添加到排行榜单个Item的列表中去。

//排行榜界面类
public class RankPanel : BasePanel<RankPanel>
{
    //排行榜列表ScrollView
    public UIScrollView svList;

    //存储每个排行榜项的控件
    private List<RankItem> itemList = new List<RankItem>();

    //显示排行榜界面的方法
    public override void ShowMe()
    {
        base.ShowMe();
        //更新面板上显示的信息

        //获取本地存储的排行榜数据
        List<RankInfo> list = GameDataMgr.Instance.rankData.rankList;
        //根据数据更新面板上组合控件的信息
        //组合控件数量只会增加,不会减少,因为玩家只会玩游戏、增加数据,不会删除数据
        for (int i = 0; i < list.Count; i++)
        {
            //如果面板上已经存在组合控件,直接更新即可
            if (itemList.Count > i)
            {
                //根据序号、玩家名、通关时间更新排行榜项的显示内容
                itemList[i].InitInfo(i + 1, list[i].name, list[i].time);
            }
            //如果面板上组合控件不够多,就去实例化出来
            else
            {
                //创建预设体
                GameObject obj = Instantiate(Resources.Load<GameObject>("UI/RankItem"));
                //设置父对象
                obj.transform.SetParent(svList.transform, false);
                //设置位置
                obj.transform.localPosition = new Vector3(0, 115 - i * 45, 0);

                //设置数据
                //得到脚本
                RankItem item = obj.GetComponent<RankItem>();
                //调用设置数据的方法
                item.InitInfo(i + 1, list[i].name, list[i].time);
                //记录
                itemList.Add(item);
            }
        }
    }
}

可以在排行榜面板脚本的Init处添加测试代码,测试添加排行榜数据,看刷出来的正不正常。添加排行榜代码实际上要在完成游戏后输入姓名确认后再添加的。

//测试代码,一开始加入一些排行榜数据,用于更新,否则打开排行榜会没有数据
//for (int i = 0; i < 2; i++)
//{
//    GameDataMgr.Instance.AddRankData("韬老狮" + i, Random.Range(40, 60));
//}

可以把xml文件存的地址打印出来,看存储的xml文件的内容。

//输出本地数据文件夹路径,用于调试
print(Application.persistentDataPath);

9.2 知识点代码

RankPanel

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

//排行榜界面类
public class RankPanel : BasePanel<RankPanel>
{
    //关闭按钮
    public UIButton btnClose;
    //排行榜列表ScrollView
    public UIScrollView svList;

    //存储每个排行榜项的控件
    private List<RankItem> itemList = new List<RankItem>();

    //初始化方法
    public override void Init()
    {
        //为关闭按钮添加点击事件
        btnClose.onClick.Add(new EventDelegate(() => {
            HideMe();
        }));

        //隐藏排行榜界面
        HideMe();

        //输出本地数据文件夹路径,用于调试
        print(Application.persistentDataPath);

        //测试代码,一开始加入一些排行榜数据,用于更新,否则打开排行榜会没有数据
        //for (int i = 0; i < 2; i++)
        //{
        //    GameDataMgr.Instance.AddRankData("韬老狮" + i, Random.Range(40, 60));
        //}
    }

    //显示排行榜界面的方法
    public override void ShowMe()
    {
        base.ShowMe();
        //更新面板上显示的信息

        //获取本地存储的排行榜数据
        List<RankInfo> list = GameDataMgr.Instance.rankData.rankList;
        //根据数据更新面板上组合控件的信息
        //组合控件数量只会增加,不会减少,因为玩家只会玩游戏、增加数据,不会删除数据
        for (int i = 0; i < list.Count; i++)
        {
            //如果面板上已经存在组合控件,直接更新即可
            if (itemList.Count > i)
            {
                //根据序号、玩家名、通关时间更新排行榜项的显示内容
                itemList[i].InitInfo(i + 1, list[i].name, list[i].time);
            }
            //如果面板上组合控件不够多,就去实例化出来
            else
            {
                //创建预设体
                GameObject obj = Instantiate(Resources.Load<GameObject>("UI/RankItem"));
                //设置父对象
                obj.transform.SetParent(svList.transform, false);
                //设置位置
                obj.transform.localPosition = new Vector3(0, 115 - i * 45, 0);

                //设置数据
                //得到脚本
                RankItem item = obj.GetComponent<RankItem>();
                //调用设置数据的方法
                item.InitInfo(i + 1, list[i].name, list[i].time);
                //记录
                itemList.Add(item);
            }
        }
    }
}

RankItem

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

//定义一个名为RankItem的类,继承自MonoBehaviour,用于表示排行榜单条数据的组合控件
public class RankItem : MonoBehaviour
{
    //定义一个公共字段labRank,用于存储排名标签
    public UILabel labRank;
    //定义一个公共字段labName,用于存储玩家名称标签
    public UILabel labName;
    //定义一个公共字段labTime,用于存储玩家成绩标签
    public UILabel labTime;

    /// <summary>
    /// 根据排行榜单条数据 对组合控件 进行显示初始化
    /// </summary>
    /// <param name="rank">排名</param>
    /// <param name="name">名字</param>
    /// <param name="time">时间</param>
    public void InitInfo(int rank, string name, int time)
    {
        //设置排名标签的文本为当前排名
        labRank.text = rank.ToString();
        //设置玩家名称标签的文本为玩家名称
        labName.text = name;
        //设置玩家成绩标签的文本为玩家成绩
        string str = "";
        //时(小时)
        if (time / 3600 > 0)
            str += time / 3600 + "h";
        //分
        if (time % 3600 / 60 > 0 || str != "")
            str += time % 3600 / 60 + "m";
        //秒
        str += time % 60 + "s";

        labTime.text = str;
    }
}

BeginPanel

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

/// <summary>
/// 开始界面
/// </summary>
public class BeginPanel : BasePanel<BeginPanel>
{
    public UIButton btnBegin;
    public UIButton btnRank;
    public UIButton btnSetting;
    public UIButton btnQuit;
    public override void Init()
    {
        //监听按钮事件
        btnBegin.onClick.Add(new EventDelegate(()=> {
            //显示 选角面板
            print("显示选角");
            //隐藏自己
            HideMe();
        }));

        //开始面板的排行榜按钮
        btnRank.onClick.Add(new EventDelegate(() => {
            //显示 排行榜
            RankPanel.Instance.ShowMe();
        }));

        btnSetting.onClick.Add(new EventDelegate(() => {
            //显示 设置面板
            SettingPanel.Instance.ShowMe();
        }));

        btnQuit.onClick.Add(new EventDelegate(() => {
            //退出游戏
            Application.Quit();
        }));
    }
}


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

×

喜欢就点赞,疼爱就打赏