记录一下目前做的背包系统结构
2个物品类
ItemBase:物品基类,持有一个物品的基本信息
Weapon:武器类,继承物品基类,额外持有武器相关的信息(同一种类的武器的数值也有浮动)。
3个数据表
ItemConfigData:存储所有物品的基础数据,包括,id,名称,种类、描述,品质,图片路径,持有数量等
PlayerItemCount:存储玩家持有的物品id和数量
PlayerWeaponData:存储玩家持有的武器信息,攻击、防御等。需要一个runtimeID用来区分同种武器的不同个体
其他
ItemConfigModel:存储所有物品的配置信息,读取json数据转换成字典,通过id获取对应物品的基本数据
BagSystem:读取玩家持有物品的数据转换为字典;读取玩家持有的武器数据转换为字典,读取时设置runtimeID;当前的选择物品;当前选择的种类;
UICell:背包界面的格子,初始化时设置自身持有的物品信息。
UI结构:
背包界面,分成3个大类:消耗品、武器、任务物品,设置toggle和toggle group,使得同时只有一个被选中;背包内容界面,使用组合控件ScrollView、自适应尺寸控件Content Size Fitter、排版layout Group;物品详细信息界面,显示当前选择物品的详细信息,使用和丢弃按钮
基本逻辑:
使用属性,在设置当前选择的物品种类时,调用更新物品种类事件
使用属性,在设置当前选择的物品时,调用更新当前物品详情事件,在物品详细信息的UI界面订阅这个事件
打开背包界面,订阅更新物品种类的函数,访问背包系统,根据当前物品类别获取物品信息列表,如果是武器类,获取持有的武器信息,结合该类武器的基本信息,组成一个完整的武器(享元?),背包界面获取到列表后,清空其下存有的所有格子(使用缓存池),遍历列表,取出格子并初始化,设置其存有的物品,根据图片路径获取图片,设置数量(武器不设置数量)。如果当前选择的物品的种类与当前选择的种类不同,需要设置该类的第一个格子设置为选择的物品。
物品进行增删时调用更新物品种类事件和更新当前物品详情事件(做的时候有些bug,大概是更新物品详情时当前物品为空,记不清了,注意下不要空引用就行了)
物品的使用
新增了一个物品技能系统,对每种物品技能写一个command类(有些物品的技能只是改个参数,用构造函数赋值),持有一个物品id-command的字典,然后在系统初始化时,手动为各个种类的物品添加命令类,在点击使用按钮时,访问技能系统,获取到对应的command并执行。
物品的使用是自己摸索的,如果有什么好的代替方法请在评论区留言,十分感谢!
背包系统的搭接过程参考了火星网课的json数据持久化教程、凉鞋的Qframework框架。UI的搭建是通过csdn学习的ui组件