Unity3D自学笔记——UGUI背包系统(八)物品的分类与整理
来源:互联网 发布:web前端后端数据交互 编辑:程序博客网 时间:2024/04/19 03:33
物品的分类与整理
效果图
全部
装备
药水
其他
实现功能
1.全部显示背包的所有格子及所有物品
2.分类显示该类物品及该类物品个数的格子
3.不管是哪个面板的装备进行了更新,其余面板都应更新
4.数量显示当前格子数量和总数量
例如
从装备Tab装备一个装备至角色身上
装备分页该装备要消失
并且在全部分页中也应该对应消失
实现逻辑
1.有两个背包容器,一个为全部的物品,格子数量初始化固定,另一个为部分的物品,格子数量动态变化,切换标签页时对应隐藏背包容器
2.新建一个PartItemList用来存放分页的物品
3.每次切换标签的时候,进行计算,从ItemList里面进行筛选出对应分类的Item,添加至PartItemList
4.遍历PartItemList添加格子和物品,更新数量
5.当ItemList的Item发生变化时,即添加或移除物品,也要执行3和4步骤
实现步骤
1.复制一份背包容器的UI,并且重新命名为pnlScrollPartView
2.新建存放分页Item的List
private Dictionary<int, ItemStatus> m_ItemList; //背包中的Item private List<ItemStatus> m_PartItemList; //背包分页中的Item
3.新建一个枚举值,存放当前所点击的标签,默认为All
private enum TabType { All, Equip, Potion, Other }private TabType m_TabType = TabType.All;
4.添加向分页添加物品及刷新的方法
/// <summary> /// 向分页添加物品 /// </summary> private void AddItemToPartGrid(List<ItemStatus> itemList) { //初始化分页格子数量为PartItemList的数量 InitGrid(this.m_PnlPartGrid, itemList.Count, this.m_PartGridList); for (int i = 0; i < itemList.Count; i++) { GameObject go = GameObject.Instantiate(this.m_ItemPrefab); go.transform.SetParent(this.m_PartGridList[i]); go.GetComponent<UIItem>().SetInfo(itemList[i]); go.transform.localPosition = Vector3.zero; go.transform.localScale = Vector3.one; go.GetComponent<UIItem>().PointerClick += OnUIItemPointerClick; } }/// <summary> /// 刷新分页 /// </summary> private void RefreshPartGrid() { switch (this.m_TabType) { case TabType.Equip: this.m_PartItemList = m_ItemList .Select(i => i.Value).Cast<ItemStatus>() .Where(d => d.WhereType == WhereType.Knapsack && (d.ItemType == ItemType.Weapon || d.ItemType == ItemType.Armor || d.ItemType == ItemType.Ring || d.ItemType == ItemType.Necklace) ).ToList(); break; case TabType.Potion: m_PartItemList = m_ItemList .Select(i => i.Value).Cast<ItemStatus>() .Where(d => d.WhereType == WhereType.Knapsack && d.ItemType == ItemType.Potion ).ToList(); break; case TabType.Other: m_PartItemList = m_ItemList .Select(i => i.Value).Cast<ItemStatus>() .Where(d => d.WhereType == WhereType.Knapsack && d.ItemType == ItemType.Other ).ToList(); break; } if(this.m_PartItemList != null) AddItemToPartGrid(this.m_PartItemList); UpdateCount(); }private void UpdateCount() { string countStr; if (this.m_TabType == TabType.All) { countStr = string.Format("{0} / {1}", this.m_ItemList.Count, gridCount); } else { countStr = string.Format("{0} / {1}", this.m_PartItemList.Count, gridCount); } this.m_txtCount.text = countStr; }
5.在标签点击事件里更改m_TapType属性值,并进行取值刷新
private void BtnEquipPointerClick(PointerEventData obj) { this.m_PnlGrid.parent.gameObject.SetActive(false); this.m_PnlPartGrid.parent.gameObject.SetActive(true); this.m_TabType = TabType.Equip; RefreshPartGrid(); } private void BtnPotionPointerClick(PointerEventData obj) { this.m_PnlGrid.parent.gameObject.SetActive(false); this.m_PnlPartGrid.parent.gameObject.SetActive(true); this.m_TabType = TabType.Potion; RefreshPartGrid(); } private void BtnOtherPointerClick(PointerEventData obj) { this.m_PnlGrid.parent.gameObject.SetActive(false); this.m_PnlPartGrid.parent.gameObject.SetActive(true); this.m_TabType = TabType.Other; RefreshPartGrid(); } private void BtnAllPointerClick(PointerEventData obj) { this.m_PnlGrid.parent.gameObject.SetActive(true); this.m_PnlPartGrid.parent.gameObject.SetActive(false); this.m_TabType = TabType.All; UpdateCount(); }
6.在AddItem和RemoveItem中也添加刷新方法
public void AddItem(UserItemEntity item) { Transform grid = GetEnmptyGrid(); if (grid == null) //背包已满 return; if (!m_ItemEntityList.ContainsKey(item.ID)) return; GameObject go = GameObject.Instantiate(this.m_ItemPrefab); go.transform.SetParent(grid); ItemStatus itemStatus = go.GetComponent<UIItem>().SetInfo(item); go.transform.localPosition = Vector3.zero; go.transform.localScale = Vector3.one; go.GetComponent<UIItem>().PointerClick += OnUIItemPointerClick; if (m_ItemList.ContainsKey(itemStatus.ItemID)) { m_ItemList[itemStatus.ItemID] = itemStatus; } else { m_ItemList.Add(itemStatus.ItemID, itemStatus); } RefreshPartGrid(); }public void RemoveItem(ItemStatus itemStatus) { itemStatus.Count -= 1; if (itemStatus.Count == 0) {//销毁物品 this.m_ItemList.Remove(itemStatus.ItemID); DestroyImmediate(itemStatus.gameObject); } else {//更新数量显示 itemStatus.gameObject.GetComponent<UIItem>().UpdateCount(); } RefreshPartGrid(); }
整理
就是重新初始化背包
private void BtnRestorePointerClick(PointerEventData obj) { InitGrid(this.m_PnlGrid, gridCount, m_GridList); LoadData(); }
0 0
- Unity3D自学笔记——UGUI背包系统(八)物品的分类与整理
- Unity3D自学笔记——UGUI背包系统(七)物品的装备与卸下
- Unity3D自学笔记——UGUI背包系统(三)物品弹出提示框
- Unity3D自学笔记——UGUI背包系统(四)角色物品数据建立
- Unity3D自学笔记——UGUI背包系统(五)沿用Attribute设计实现物品等级
- Unity3D自学笔记——UGUI背包系统(一)ItemData
- Unity3D自学笔记——UGUI背包系统(二)UI设计实现及数据绑定
- Unity3D自学笔记——UGUI背包系统(六)角色换装及属性动态改变
- Unity3D自学笔记——UGUI背包系统(九)装备对HP影响的逻辑及使用药品
- Unity3D自学笔记——UGUI系统介绍
- Unity3D——UGUI实现背包系统
- Unity3D自学笔记——架构应用(八)人物移动与角色相机的跟随
- Unity3d背包系统(三)—— 设计物品类的JSON文件
- Unity3d 简单的背包系统(物品交换)
- Unity3d背包系统系统(一)——第一个类(Item物品类)
- Unity3D自学笔记——UGUI前台架构
- 基于Unity3D(UGUI)的背包系统<二>
- 基于Unity3D(UGUI)的背包系统<三>
- camera 2 连拍
- 51nod 1490 多重游戏
- tmux
- HBase内置过滤器的一些总结
- 【LeetCode】45. Jump Game II (Hard)
- Unity3D自学笔记——UGUI背包系统(八)物品的分类与整理
- Semantic Web Technologies: RDFS Inference
- OJ_1186数学公式【在化简分数时调用函数进行化简】【简便方法】
- 基于可靠消息的分布式事务错误处理
- 高并发性能的提升
- 错位排列的魅力
- SQL语句之CASE WHEN
- int 和 Integer 的区别
- Unity3D自学笔记——UGUI背包系统(九)装备对HP影响的逻辑及使用药品