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