动作手游技术漫谈-角色的状态和行为

游戏中的角色通常都会有站立,跑动,攻击,受击等状态。学过计算机的人都知道有限状态机FSM这个神器,它广泛应用于硬件控制电路设计和软件开发中。是的,每个角色都应该有一个状态机,状态机定义了角色可能出现的状态和这些状态相互转换的条件。例如跑动状态可以切换到攻击或受击状态,但是受击状态不可以立刻切换到攻击状态。

一个动作游戏的角色应该有多少个状态呢?站立,跑动,攻击,受击,跳跃,受击浮空,空中受击,倒地,死亡。好像差不多了吧。当你真正开始开发的时候,问题来了:怪物在没有发现玩家的时候需要在场景中走来走去巡逻,发现玩家后需要追逐玩家,那么巡逻和追逐也是状态吗?是的,从语文上来说这是角色的状态,但是巡逻和追逐貌似也是跑动啊?有些游戏的设计者确实把追逐作为一种状态来处理,叫做MoveToTarget之类的,看起来也挺有道理的,这是一种特殊的跑动状态–向着目标跑动,它可以实现需要的功能,只不过在很多地方要判断是否是跑动的时候需要同时判断是否是跑动或者追逐。我觉得这不是一个好的设计思路,巡逻和追逐应该是比状态更高一级的东西:角色的行为。

如何区分状态和行为?一般来说,状态有唯一性,并且有动作与之对应,站立有站立动画,攻击有攻击动画,角色只能处于一个状态中;而行为是一种AI层面的东西,它可以对应到一个状态序列。例如巡逻是一个行为,它可以包含站立->向左走->站立->向右走。一个动作游戏的角色应该有多少行为呢?这个就太多了,取决于游戏AI的复杂程度。那么如何来处理这些行为呢?继续使用神器状态机是可行的,但是有限状态机其实是维护了一张图,图的节点是一个个的状态,节点和节点的连线是状态间根据一定的规则做的状态转换,当状态数量很多时,状态转换的规则也就会变得复杂和难以维护。处理行为,我们有更好的工具:行为树(Behavior Tree)。行为树,是一颗多叉树,从数据结构上来说树就比图简单很多。关于行为树网上有很多资料,这里我只想推荐u3d一个很好用的行为树插件Behavior Designer,用过这个插件,你基本上也就掌握行为树了,你游戏的AI也会变得很富有乐趣。

除了上面说的状态和行为,角色还有另一种状态:晕眩,冰冻,中毒,狂暴等。这是另外一套状态体系,我们就叫效果状态吧。效果状态和角色的状态的本质区别是效果是可以叠加的,角色可以同时拥有多个效果状态。因此效果状态不能用状态机,而是作为一种属性附加到角色身上即可。

你可能感兴趣的:(unity,状态机,动作游戏,行为树)