本文最后更新于36 天前,其中的信息可能已经过时,如有错误请发送邮件到1077511618@qq.com
8.5 (背包系统开发思路与反思)
工作流构建思路
借此次机会,我希望锻炼自身构建工作流的能力,并尽可能考虑到组件使用体验及开发效率,所以在初步写背包系统时,我想尽可能地创建一个较为成熟的背包框架(虽然现在回头看来有诸多不足,感觉像一个初学者写的东西T_T)。
-
容器网格生成器(BackpackCreator):支持在编辑器中先快速生成一个矩形网格阵,并于此基础上进行单个网格的拓展或删除,让整体容器网格形式多样。
-
物体网格生成器(ItemMeshCreator):能根据绑定的物品图片尺寸生成网格(默认是自动生成矩形网格阵,同样支持单个网格的增删),这样做的原因是有便于匹配网格时提升准确性、能让编辑者较为直观地在编辑器中看到物品网格将在容器中导致的占用情况。
主要网格检测匹配思路
得知背包系统是类似于《三角洲行动》那样的网格类容器后,我的初步思路就是直接匹配物品的长宽,同背包网格进行比对匹配,但是后续看了组长给的那两款游戏的参考后,我发现实际要实现的效果所需的逻辑可能还复杂一点,所以后续有了以下网格匹配方案:
容器层分离
容器有多个夹层、隔层,为了将不同层进行分离,我将不同层设置一个锚点,以此锚点为原点来进行容器网格的生成,这样每个容器网格的父级都是对应于此锚点,检测时只需要知道容器网格的父级并针对于此执行一系列逻辑就能不影响其他容器层,防止出现物品跨层防止的情况。
网格检测匹配
同容器网格的生成,物体网格也会有一个锚点并以此锚点为原点来生成物体网格。为了较为准确的匹配网格分布不规则的物体与容器网格,我给每层容器网格与物体网格都建立了本地坐标系(这个算是整个系统的核心之一,设置锚点也是为了服务本地坐标系),当检测到鼠标的不同操作时(使用IBeginDragHandler, IDragHandler, IEndDragHandler这三个接口),在适当时机进行网格检测:物体网格的锚点锁定某个容器网格->将物体网格的本地坐标系进行平移,使锚点原有坐标(0,0)同被锁定的容器网格坐标一致,而后直接进行物体网格与容器网格坐标分布的比对(依次遍历查询网格排布及容器网格占用情况)就能确定这一块区域能否放下整个物体->如果能放下,松开鼠标后物体网格锚点就会对其被锁定的容器网格,这样整个物体就能较为准确地被放在容器中了。
网格示例:
这是一个物体网格阵及每个网格的本地逻辑坐标↓(空格代表没有网格)
|
(0,0) – 锚点
|
(1,0)
|
(2,0)
|
|
(0,-1)
|
||
|
(0,-2)
|
(2,-2)
|
|
|
(0,-3)
|
(1,-3)
|
这是一个容器网格阵及每个网格的本地逻辑坐标↓(网格占用状态于此暂不展示)
|
(0,0) – 锚点
|
(1,0)
|
(2,0)
|
(3,0)
|
|
(0,-1)
|
(1,-1)
|
(2,-1)
|
(3,-1)
|
|
(0,-2)
|
(1,-2)
|
(2,-2)
|
(3,-2)
|
|
(1,-3)
|
(2,-3)
|
在同其他组员交流中的收获
在与二组中某位同学的交流中,鄙人了解到可以使用字典来绑定单个网格与其逻辑坐标(之前没考虑到是因为对于字典 or 哈希表这一块使用的很少、掌握较浅),虽然因为我的代码架构定型且比较史山,暂时放弃重构,但这次收获对我后续的个人项目、刷题帮助非常大。
验收当晚,因为我们的容器方案有两套,所以我和原先负责垃圾系统的同学进行了交流,他的网格匹配方案是在物体网格分布不规则时,根据物体总体尺寸构建一个大的矩形,随后进行标记哪些地方没有实际的物体网格、是不能被计入的。我认为这个解决方法蛮酷的。
对于不足之处的反思
-
在认领任务后,没有仔细进行总体架构的构思,直接进行功能、效果堆叠,状态检测机制不完善,导致逻辑层、视图层分离差,脚本命名看起来也一团糟(shit),系统如果真正合并到项目内,难以维护拓展、同其他模块进行联动;
-
没有及时向组长反馈个人开发意向(当时马上想到了背包系统可以进行复用,直接当成整个游戏的容器系统),甚至在PR时也没有进行说明,且缺少详细文档;
-
还有许多地方待改进,这里就先不写了()


