对于以资源管理, 捡垃圾为卖点的游戏而言, 一个暗黑破坏神式(Diablo like)的背包系统会增加很多趣味性(近几年还出现了专门以背包管理为主要玩法的游戏).
希望能支持如下功能:
- 多格物品. 更进一步, 凸多边形物品.
- 物品的拖动, 旋转. 格子染色.
- 多仓库实例. 玩家不止一个仓库/背包, 游戏中的其他 npc 也有自己的仓库/背包. 这些仓库/背包可以同时存在同时打开. 物品可以在不同仓库间转移, 支持拖动等可视化操作.
- 可嵌套容器. 容器类型筛选. 例如大背包里还有弹药袋, 专门用来存放弹药.
- 高可拓展性. 例如可以轻松地在其基础上实现装备栏, 配方栏等.
Asset Store 上有不少成熟的仓库方案, 但鲜有支持上述全部需求的.于是决定参考几个类似的项目自行实现. 最终效果主要参考 Escape From Tarkov.
上手前觉得挺复杂, 但理清思路后, 其实还是老生常谈的 MVC 式结构, 数据与表现分离.
- Model 数据类. 分为物品类和容器类. 容器对象中维护物品列表. 物品对象也能和某容器实例关联, 从而实现嵌套容器.
- Controller 管理器. 运行时维护所有容器对象. 处理来自 View 的操作, 确定格子对象和物品对象的对应关系, 执行实际的物品增/删/移动等逻辑.
- View 背包界面. 运行时根据容器数据构建格子网格, 再根据物品数据在对应的格子处渲染物品. 格子对象还负责监测玩家鼠标互动操作(例如拖动, 点击), 并传递给 Controller.
仓库系统的拓展, 采用了直接继承的方式(这样的设计不够严谨和美丽, 但目前而言够用).
例如玩家装备栏相比物品仓库, 需要支持分离的物品格子(格子位置根据配置决定), 同时每个格子需要支持不同的物品筛选配置(例如头部格子只能装备头盔, 手部格子只能装备武器). 那么在子类中重写涉及格子渲染, 物品筛选的函数即可.
最终效果:
参考项目:
UnInventory
Variable Inventory System
暂无关于此日志的评论。