战斗系统
战斗系统应该如何架构与设计
考虑将战斗系统分成三个层次:
功能组件层
策略层
行为决策层
1: 功能组件层
功能组件层顾名思义就是实现某个具体功能的组件,如
- 角色移动组件:控制角色的移动与行走
- 动画状态机组件:控制角色的状态与动画切换
- 攻击伤害计算组件:提供机制,按照技能的特性来提供计算伤害的时机与结束状态重置的时机,不提供具体的伤害计算的方法,只提供计算的机制
- 寻路导航组件:控制角色的寻路与行走
这个层次的组件代码在不同游戏里面大部分都可以重用。总结一个点就是凡是战斗中属于角色的功能组件的就实现在这个层次,同时这个层次只提供机制,不提供具体的策略。什么叫提供机制不提供策略,举个具体的例子,比如导航组件,设计的时候就只要按照路径去走就可以了,具体路径是哪些,怎么来。它不关心。又如动画状态机组件,只提供功能,根据用户给的状态来播放正确的动画就可以了,不大去关心什么时候用什么状态,这个就是功能层的只提供机制不提供具体策略。
2: 行为策略层
看战斗的行为策略层如何设计之前先看下战斗单元,常见的战斗单元有:玩家, Boss, NPC,小怪等。每个战斗单元都会有自己的战斗策略,比如,攻击,行走等。在这一层,我们主要实现怪物角色的具体的一个战斗的策略,比如
玩家具体实现攻击,技能的具体策略。比如敌人小怪,提供搜索玩家的策略(具体如何搜索),提供发起攻击的策略(具体如何攻击,每种攻击一种策略,并封装成接口),提供发起追击的策略(具体如何追击,封装成接口)
我们可以把战斗单元做成一个基类,实现一些通用的策略,比如HP生命值, Attack攻击力, Define防御力, 数据配表加载,防御力攻击力计算等。然后具体的战斗单元我们继承自这个基类,比如玩家Player,怪物Boss,小怪Monest等。这些战斗单元实现具体的各个策略,每个策略的数据就来自策划提供的数据配置表。
3: 操作决策层
什么时候要追击,什么时候要攻击,什么时候放技能,这个就属于行为操作决策。一般常用的操作决策有玩家UI操作(单机), 网络事件操作, AI操作决策(单机或服务端上的AI决策),固定操作序列等。我们把决定用哪些策略来战斗放到操作决策层,比如玩家有一个UI攻击操作,UI操作层就会调用玩家决策层接口来实现这个攻击,决策层,就会去找对应的目标,调用功能组件发起攻击。AI操作决策层,根据环境决定做什么,得到具体的操作,然后调用策略层的接口来实现具体的功能