技能没什么框架,只是有很多字段罢了,比如cd、施法距离、释放动画、飞行动画等等。。。其实游戏技能不是一直不是什么难点,毕竟根据每个属性实现逻辑就好了。
技能真正麻烦一点是其实是 所谓的“效果”。因为从很久以前,游戏设计的时候就把效果这个概念添加进来了。对于 游戏战斗对象主体,我们暂时叫做BattleAgent简称BA。影响BA的数据有很多,比如移动速度、攻击力、基础属性等等,影响的入口也有很多:
- 技能
- buff/被动技能
- 装备
- 强化
- 宝石
- 魂
等等,而这些实际上从影响结果没什么区别。
首先我们先谈区别,对于这些数值影响,其实区别只有入口或者说是作用的方式,技能是BA(castor)对BA(target)释放造成的瞬间数值影响。
buff是castor对BA(target)安装后造成的持续数值影响,分为按时触发瞬发和持续修改数值。
装备是特定容器对BA持续修改数值。
所以这里游戏开发者们抽象出了 效果这个概念。
对与效果而言,只存在2个行为:
对BA产生数值影响
对BA撤销数值影响
所以效果最终定义为:
interface Effect {
void cast(BattleAgent target);
default void reverse(){
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
而对于其他功能实体来说,就可以简化为效果的容器:
interface EffectContainer extends Effect{
List getEffects();
}
- 1.
- 2.
- 3.
- 4.
- 5.
这样我们就只要定义不同效果容器就可以了,
比如技能:
class abstract Skill implements EffectContainer{
public void spellTo(BattleAgent target){
foreach(Effect effect in getEffects()){
effect.cast(target);
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
对于buff:
class abstract Buff implements EffectContainer{
public void update(){
foreach(Effect effect in getEffects()){
effect.cast(target);
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
对于被动技能(其实也是buff):
class abstract BuffSkill extends Buff {
public void install(){
foreach(Effect effect in getEffects()){
effect.cast(target);
}
}
public void unstall(){
foreach(Effect effect in getEffects()){
effect.reverse(target);
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
装备同理被动技能,是不是很清晰?而对于复杂的技能效果,因为我们已经抽象出了Effect。
所以怎么实现也就很容易了!
class DamageEffect implements Effect{
private int damage = 100;
public void cast(BattleAgent target){
target.hp -= damage;
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
看起来是不是很简单,我们来写个变羊。
这个技能包括 2 个效果 外形修改和属性。
1、外形变羊
class ChangSheepEffect implements Effect{
public void cast(BattleAgent target){
target.gameObject = GameManager.getAnimeObject("sheep");
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
2、攻击力和防御力变0 速度变慢
class PropChangeEffect implements Effect{
public void cast(BattleAgent target){
target.atk = 0;
target.def = 0;
target.speed = 50;
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
就是这么简单,同学你明白了吗?
如果要深入一点的话,就是变羊是持续型的,到了时间会变回来。
所以我们要一个可以触发buff的效果:
class TriggerBuffEffect implements Effect{
BuffSkill buff = new BuffSkill (){
public List<>getEffects(){
return new List().add(new ChangSheepEffect()).add(new PropChangeEffect());
}
}
public void cast(BattleAgent target){
int time = 3000;//3秒
target.addBuff(buff,time);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
然后把这个TriggerBuffEffect加到技能能上就ok了,就完成了一个可以变羊3秒的技能。