unity使用MVC实现客户端动态页数效果
当点击背包页面时,初始化背包界面的方法。
参数:
- obj:传入的参数对象,包含背包数据、最大页面数和当前页面数。
解析参数:
- 将传入的参数对象转换为对应的变量。
- vs[0]:背包数据,类型为List<BagData>。
- vs[1]:最大页面数,类型为int。
- vs[2]:当前页面数,类型为int。
创建页面toggle:
- 如果页面父物体下的子物体数量小于最大页面数,则创建新的页面toggle。
- 使用循环从当前页面开始创建到最大页面的toggle。
- 对于每个页面toggle,设置其对应的索引值为index。
- 实例化页面toggle,并获取其Toggle组件。
- 添加toggle的值改变监听事件。
- 如果toggle的值为true(选中状态),则显示toggle下的Label对象,并广播获取页面数据的消息。
- 如果toggle的值为false(未选中状态),则隐藏toggle下的Label对象。
- 设置toggle的ToggleGroup为页面父物体的ToggleGroup组件。
- 设置toggle的文本内容为索引值加1。
设置当前页面toggle:
- 根据当前页面数,将对应索引的toggle设为选中状态。
设置背包数据:
- 调用SetBagData方法,将背包数据和当前页面数传入。
private void InitBag(object obj) {
object[] vs = obj as object[];
List<BagData> bags = vs[0] as List<BagData>; // 获取背包数据
int maxPage = (int)vs[1]; // 获取最大页面数
int nowPage = (int)vs[2]; // 获取当前页面数
if (pageParent.childCount < maxPage) // 如果页面父物体下的子物体数量小于最大页面数
{
for (int i = (nowPage - 1); i < maxPage; i++) // 从当前页面开始创建到最大页面的toggle
{
int index = i; // 当前toggle的索引值
Toggle toggle = Instantiate(ResMgr.Instance.LoadAsset<GameObject>(ResType.UIPanel, "Page"), pageParent).GetComponent<Toggle>(); // 实例化页面toggle
toggle.onValueChanged.AddListener((flag) => // 添加toggle的值改变监听事件
{
if (flag) // 如果toggle的值为true(选中状态)
{
toggle.transform.Find("Label").gameObject.SetActive(true); // 显示toggle下的Label对象
MsgCtr.Instance.BroadCast(MsgId.GET_PAGE_DATA, index + 1); // 广播获取页面数据的消息
}
else // 如果toggle的值为false(未选中状态)
{
toggle.transform.Find("Label").gameObject.SetActive(false); // 隐藏toggle下的Label对象
}
});
toggle.group = pageParent.GetComponent<ToggleGroup>(); // 设置toggle的ToggleGroup为页面父物体的ToggleGroup组件
toggle.GetComponentInChildren<Text>().text = (i + 1).ToString(); // 设置toggle的文本内容为索引值加1
}
}
pageParent.GetChild(nowPage - 1).GetComponent<Toggle>().isOn = true; // 设置当前页面toggle为选中状态
SetBagData(bags, nowPage); // 设置背包数据
}
private void SetBagData(List<BagData> bags, int nowPage)
{
for (int i = 0; i < parent.Count; i++) // 遍历所有父物体 { if (parent[i].childCount > 0) // 如果父物体下有子物体 { for (int j = 0; j < parent[i].childCount; j++) // 遍历子物体 { Destroy(parent[i].GetChild(j).gameObject); // 销毁子物体 } } }
if (nowPage * 20 < bags.Count) // 如果当前页面的物品数量小于背包数据总数
{
for (int i = (nowPage - 1) * 20; i < nowPage * 20; i++) // 从当前页面的起始索引到结束索引
{
Instantiate(ResMgr.Instance.LoadAsset<GameObject>(ResType.UIPanel, "BagItem"), parent[i - (nowPage - 1) * 20].transform).GetComponent<BagItem>().Init(bags[i]); // 实例化背包物品,并初始化物品数据
}
}
else // 如果当前页面的物品数量大于等于背包数据总数
{
for (int i = (nowPage - 1) * 20; i < bags.Count; i++) // 从当前页面的起始索引到背包数据总数
{
Instantiate(ResMgr.Instance.LoadAsset<GameObject>(ResType.UIPanel, "BagItem"), parent[i - (nowPage - 1) * 20].transform).GetComponent<BagItem>().Init(bags[i]); // 实例化背包物品,并初始化物品数据
}
}
}
model层
private void GetPage(object obj)
{
object[] vs = obj as object[]; int page = (int)vs[0]; // 获取要切换的页面数
nowPage = page; // 更新当前页面数
MsgCtr.Instance.BroadCast(MsgId.INIT_BAG, bags, maxPage, nowPage); // 广播消息,初始化背包数据
}
private void BuyItem(object obj)
{
object[] vs = obj as object[]; BagData bag = vs[0] as BagData; // 获取购买的物品数据
bags.Add(bag); // 将物品数据添加到背包数据列表
if (bags.Count > maxPage * 20) // 如果背包数据数量超过当前最大页面能容纳的数量
{
maxPage++; // 更新最大页面数
}
nowPage = maxPage; // 更新当前页面数为最大页面数
MsgCtr.Instance.BroadCast(MsgId.INIT_BAG, bags, maxPage, nowPage); // 广播消息,初始化背包数据
}