最近在做一个游戏项目,开发过程中遇到需要设计技能系统的问题。个人在这方面并没有多少经验,网上搜到文章也是支离破碎,质量良莠不齐。无奈只好自己去要就一下。光靠脑子想不去记录,过后就会忘掉,所以写个文章记录一下一路以来的思路。这就是写这篇文章的动机
技能系统对于很多游戏来说都是不可或缺的一部分。但是奇怪的是如果去搜索这方面的文章会发现虽然做这方面研究的人不少,但是并没有一套成型的框架能够方便的设计实现这一个重要的系统。可能这个系统对于某些公司来说算是商业机密?总之想要彻底了解这个系统还是要自己做一些研究了。
首先根据一些网上的思路,设计一个技能时可以使用一种组合的思路,即一个大型技能实际上是有很多小技能组合而来的。例如一个技能A(随便起个名字),它的效果是在一定范围内造成伤害,并且对所有造成伤害的对象造成一个中毒的持续效果。那么这个技能设计时就可以考虑首先设计一个造成伤害的技能a,然后设计一个给敌人加毒buff的技能b,之后这个大A技能就可以考虑包含a,b两个小技能的组合技能。用代码来说明的话类似于下面这种形式
class a
{
public:
void use(){cout<<"造成伤害"<<endl;}
}
class b
{
public:
void use(){cout<<"加buff"<<endl;}
}
class A
{
public:
void use(){skill1.use();skill2.use();}
private:
a skill1;
b skill2;
}
原理很简单,就不上运行图了。总之这样做的好处就是可以将一个大技能的实现分离成小的技能,从而实现代码复用。例如现在有一个大技能B,这个技能的效果是给敌人造成伤害同时提升自己的攻击力,那么这个技能就可以看成是一个伤害技能和一个给自己上buff的组合技能。这时B技能的代码可能长成这样
class B
{
public:
void use(){skill1.use();skill2.use();}
private:
a skill1;
c skill2;
}
上面的B技能中的c就是给自己加buff的小技能,这里重用了a技能的代码,如果每一个大技能单独设计的话,就要在A,B两个技能里分别实现一遍a技能的代码。所以这样的思路我认为是一个不错的思路。
在这种思路下,技能系统就被分成了两个部分,一部分是实现基础功能的小技能类,这里我还是把他称作基础技能类,另一部分是实实在在能被使用的技能,在上面的例子中就像A,B这样的技能,我在这里把他叫做技能类。这两部分的关系如下图所示
按照这个思路,接下来到一个具体一点的环境中去。假设现在有一个主角类,一个敌人类,这两个类都继承于一个gameobject类,代码如下
class GameObject{}
class Hero:public GameObject
{
}
class Enemy:public GameObject
{
}
接下来主角要用一个技能把敌人打飞,应该怎么做呢?我继续用刚才的例子,只不过技能A我改叫毒液打击(drugattack,仍然是随便起的名字,英文不好不知道该怎么叫,汗),这个技能效果的两个基础技能名叫伤害hp技能(hurthp)和添加毒技能(adddrug),这时代码应该像这样
class HurtHP
{
public:
void use(){cout<<"造成伤害"<<endl;}
}
class AddDrug
{
public:
void use(){cout<<"添加毒buff"<<endl;}
}
class DrugAttack
{
public:
void use