在这一节中我们梳理枪械系统的各种功能需求,然后绘制枪械系统的功能实现图

名称 形象 子弹 弹夹容量 攻击力 频率 射程/范围 限制 换弹时间 描述
手枪 7 1 1发/秒 半屏 无限 3秒 默认枪
冲锋枪 30 1 6发/秒 2/3屏幕 需要弹药 3秒
步枪 50 3 3发/秒 1屏 需要弹药 1秒 有一定后坐力
狙击枪 12 6 1发/秒 1屏 需要弹药 5秒 红外瞄准+后坐力大
火箭筒 1 5 1发/秒 1屏 需要弹药 4秒 跟踪+爆炸
霰弹枪 1 1 1发/秒 半屏 需要弹药 1秒 一次发射6~12颗子弹

对于枪械系统,我们在表现层有两个地方需要展示枪械系统的数据,一个是UI界面,一个是角色形象

枪械表现层

除了这两个比较明显的需求之外,还有一些隐性的功能需求,比如能不能开枪的判断,这个需要根据弹药量进行计算,再比如开枪之后发射什么样的子弹,具体怎么发射,子弹打中敌人怎么样没打中敌人怎么样,这些功能点都是枪械表现层的需求。

大致的需求如下:

  • 界面显示枪械信息
  • 主角手持枪械对象
    • 形象
    • 开枪逻辑、攻击力计算等

我们可以把不同的枪械的功能和形象都做成Prefab,然后这些Prefab上都挂上各自的脚本,让这些脚本都继承共同的父类(GunController),相同的逻辑在父类实现,不同的逻辑在子类通过override方式定制。

这里设计的逻辑就是很简单的表现层逻辑,到时候写就可以了。在纸上设计阶段,我们的重点是要把数据层逻辑理清楚,如果整个项目都在纸上设计,对设计者的要求太高。如果想锻炼能力,可以在纸上设计表现层的逻辑,这样节省很多纠结的时间。

我们在之前绘制过开枪功能的草图

开枪功能草图

我们的GunInfo需要更多的枪械状态来描述,比如填弹状态,射击状态,冷却状态(枪械开枪频率),还需要有一些数据,比如枪械名字,枪械名字其实就是类型,我们需要通过枪械名字去查询一些数据,比如开枪频率、填弹时间等。

当没有子弹的时候,我们可以进行填弹,填弹时机可以是开完一枪后枪内没有子弹的话自动进行,也可以是玩家再次按下开枪之后判断有没有子弹,没有子弹再进行,在这里我们使用前者。除此之外玩家可以通过按R键提前填弹。

总结之后我们的功能实现图如下

开枪与填弹纸上设计

功能实现图虽然不能完全绘制出具体的实现细节,但是已经帮我们节省很多编码时的工作量了,比如命名、数据结构设计等工作。

后续枪械系统相关的功能实现图都绘制好之后,会再进行一次检查工作。