现在中国游戏市场出现了好多那种中国类型的RPG类型的游戏,我自己也有几份那样的代码,在看他们代码的时候,觉得他们的代码编写有一个通病,就是写的太过于臃肿不够简洁,代码的移植性也不是很高,如果做同一类型的RPG的话,我感觉有种重做的感觉。所以就自己写一个这种游戏的通用型的框架一样。
首先我们对RPG类型的人物进行分析吧,我看到的一般RPG类型的游戏主要有怪物,主角等。可以来说的就是有生命特征的和没有生命特征的。对于一个有生命的个体来说,它在游戏中是不是有最基本的属性,例如移动属性,攻击属性,受伤属性。应该就有这些吧,当然还可以拥有buff属性。我把动画这部分也应该考虑拿出来,几个属性之间肯定是会存在着某种联系的,例如buff会给生命个体增加它的攻击属性,或者增加它的受伤属性啊,当然这些得看你的游戏怎么设计了,我假设红buff增加人物的暴击伤害,和暴击率等。蓝buff会增加人物的血量,或者减技能的cd等,这些都是我们要考虑的,但是一个成功的RPG游戏,在我看来最大的亮点在于动作的华丽,技能的连招,我看好多国人做的RPG类型的游戏都是在模仿lol,以我的观点,手机的最大的亮点就在于触屏,所以我觉得做手机游戏应该充分利用这点,跑酷类游戏,消除类游戏它们就做的非常不错。这些仅仅是我的观点,好了,扯了好久的野棉花了。该说今天的正题了。
接下来我们就每个人物属性去建立相应的类,这样写分工是很明确的,我的一个属性和另外一个属性它们是一种低耦合的状态。在unity里面我习惯给他们起一个名字叫做组件。下面就一次介绍它们:
1 MoveCpt
移动的组件,定义2个属性:移动速度和移动方向。定义一个2个方法:一个初始化方法Intilized,主要功能完成前面2个属性的初始化。一个拥有update功能的方法MoveByDirection。这个组功能非常简单,就是完成移动功能。
2 CanExportCpt
攻击组件,定义2个属性:含有攻击数据的攻击属性和一个敌我类型的枚举类型,先定义2个方法:一个初始化方法Intilized,主要完成人物的一些基本属性,例如攻击力,攻击速度,暴击伤害等一些数据,一个攻击方法Attack方法,主要是攻击敌人。攻击属性和受伤属性的紧密相连的,所以攻击方法其实是调用敌人的受伤方法。这里攻击属性可能会和属性组件产生一定的关联,例如人物拥有红buff提高人物的攻击力,攻击速度等等,人物拥有蓝buff属性,减少人物技能的cd等等,攻击组件有一定的依赖关系依赖于属性组件。所以我们该定义一个接口来定义一个方法解决这种依赖关系,让攻击组件依赖这个组件,而属性只用调用接口方法即可,再让攻击组件继承该接口,这种低耦合的关系就建立起来,当一个类对另外一个的依赖关系是不会经常发生变化,我们可以建立一种强依赖的关系,反之,我们就要建立一种强依赖的关系。
3 AcceptAttackableCpt
受伤组件,定义2个属性:含有受伤数据的受伤属性和一个敌我类型的枚举类型,先定义2个方法:一个初始化Intilized,主要完成人物的一些基本属性,例如血量,血量回复,护甲,魔抗等等一系列的属性。另外一个就是 GetHurt方法,完成人物受攻击的时血量的计算。
4 TriggerCpt
触发器组件,这个是检测人物与其他的事物发生碰撞,例如和子弹,箭,法术技能,刀,这些都是能触发触发器的一些东西,总之他们是把他们归为一类东西即可。定义2个方法,一个初始化方法Intilized,和一个继承来自 MonoBehaviour的模板方法OnTriggerEnter2D。
当我们东西触发触发器时,我们对首先对触发器的类型进行判断,判断是敌方还是友方,如果是当前触发器碰撞触碰的是地板,那么说明当前触发器时挂在子弹,法术技能的东西,而不是挂在人物上的,所以这个触发器是整个游戏中通用,不止简单处理人物和子弹。
5 PlayAniCpt
播放动画的组件,定义一个属性,这个属性是根据你用的是什么动画系统,如果是老的动画的系统,那么这个属性就是Animation反之就是animtor了。先定义一个初始化方法,对属性进行赋值。另外几个方法,就是根据游戏而定了,如果你的游戏中存在多少种动画的过渡,例如存在由走到跑,那么久需要定义这样一个方法,存在平A到的连招,那么你也需要为其设计方法,存在这多少种动画的过渡就需要写几个,所以国外传统的RPG玩的是动作,效果和打击感,而不是像国内的RPG,感觉玩的的数值,所以做这种游戏美工起到关键性的作用,它不像那种休闲类型的游戏,程序的作用就比美工重要的多,如果想做好RPG这种类型游戏,动画这个组件动画过渡方法要设计好。
6 PropertyCpt
这个组件就类似与那种buff系统了,当然这里还要去写一个计时器的类,来方便处理buff节能冷却。应该有几个组件依赖与这个组件,这里定义2个方法:一个初始化方法Intilized,初始化各种属性的初始值。另外一个类似update方法——OnUpdate方法。
前面只是一个个的组件,他们看起来是一个一个零散的组件,所以我们这里要去写一个管理类,去管理所有的组件,它在设计上来说就像一个根节点,而这些组件就像是一个叶子节点,采用聚合的方式,当在运行来说就像是一个河流然后分流到各条小溪,如果河流没水了那么各条小溪也就没水了。首先由这个管理类来统一初始化各个组件,统一update,采用的是一种update分发的原理,这样便于我们对整个游戏逻辑的控制。这种方式才是unity官方支持的一种,所以我为什么不在属性组件,移动组件中不写update而用OnUpdate代替。我们这类代码的时候,应该保持清醒的头脑,去分析事物之间的联系,分清楚他们之间的职责和依赖关系,还有就是我们尽量去写那种像树类型结构的代码,而不是网。如果是你个人开发你可以把代码写的跟网一样,但是我相信如果你隔一段时间再去看你的代码的时候,你要看懂是会很吃力的。下面我将给出具体设计想法。