技能,不过是一个属性的集合,比如技能特效,冷却时间,施法距离等。
游戏技能就是实现每个属性的逻辑。
但技能的难点还是在于技能效果。
效果是什么呢?
就是技能所要造成的数值信息改变。
游戏画面再绚丽,本质上也就是数值的传递修改。
很多种情况能够造成效果
技能
被动技能
BUFF
装备
这些都是影响游戏对象数据的入口,比如我施放了一个造成伤害并持续减速的技能,那就造成了两种效果,一个伤害一个减速,伤害会让对象生命值降低,减速会让对象移动速度降低。
但是光说效果,好像体现不了什么。
但是我们知道了,一切对象数据的改变都可以抽象为效果
那我们把效果这个概念抽象出来
1.对游戏对象造成数值影响
2.撤销对游戏对象造成的影响
Interface Effect{
void Cause(); //造成影响
Void Revert(); //撤销影响
}
那我们某个功能的实例就是包含了多种效果的容器
interface EffectContainer : Effect
{
List<Effect> GetEffects();
}
哈哈,举几个例子,比如技能影响
abstract class Skill :EffectContainer
{
public void Spell(GameObject target)
{
foreach(Effect effect in GetEffects())
{
effect.Cause(target);
}
}
}
BUFF技能也是如此,被动技能多了撤销影响,因为被动通常有时间限制
abstractclass BuffSkill :Buff {
publicvoid install(){
foreach(Effect effect in GetEffects()){
effect.Cause(target);
}
}
publicvoid unstall(){
foreach(Effect effect inGetEffects()){
effect.Revert(target);
}
}
}
----------------------------------我是线---------------------------------
说到底效果该怎么定义呢?别急下面就是…
//属性改变效果
class StatusChangeEffect : Effect{
<span style="white-space:pre"> </span>private int intellect = 20;
<span style="white-space:pre"> </span>private int agility = 20;
<span style="white-space:pre"> </span>…..
<span style="white-space:pre"> </span>public void Cause(GameObejct target){
<span style="white-space:pre"> </span>target.intellect -=intellect;
<span style="white-space:pre"> </span>target.agility +=agility ;
<span style="white-space:pre"> </span>}
}
简单来说,就是把技能、状态、装备效果的共性提取出来,他们都对目标造成影响,所以,把这项抽象出来,作为Effect,把目标对象作为传入参数,在这个Effect的线程中,我们就可以实现对目标状态的修改了。
---------------什么怎么把效果加入技能?
技能继承EffectContainer接口了,实现了GetEffects()方法,这个方法写成这样不就好了
public void GetEffects(){
List<Effect> effectList = new List<Effect>();
effectList.Add(new DamgeEffect());
effectList.Add(new StatusChangeEffect ());
return effectList;
}
-----------------------------GG-----------------------------
这下好了吧。大概都解释完毕了。相信也比较清楚了。那这篇文章就这样了。。吐血中。。。