Avatar状态机设计

来源:互联网 发布:国家基本药物 知乎 编辑:程序博客网 时间:2024/04/30 14:30

Avatar状态机设计看似非常简单,其实深究每个细节则会发现并没有想象中那么容易,如何让设计合理、符合玩家操作习惯是一个很大的话题,我结合实际工作中的设计实例,来做一些分析,本文的素材来源是公司的实际项目,文中引用到一些参与者的设计和言论,并不是最终设计结果,参与讨论者的观点也是即时观点,有倾向性的观点也只对本文内涉及的内容有效。

 

注释:本文为实际项目中的对答,文中给出的设计图需各位看官分析思考

 

首先给出一个设计方案如下

这个设计里有些问题,有大有小,罗列如下:

  • 自动攻击  是一种状态没错,但自动攻击的同时,角色也可以移动,但上图中 自动攻击 移动的关系是相互切换
  • 谈话  其实可以不作为一种状态,和NPC对话的同时 玩家同样可遭受攻击,进入战斗状态,在对话的过程中,也可以释放技能,上图中没有表现
  • 跳跃 状态结束 有可能直接进入移动状态
  • 按你的设计,空闲,跳跃,移动,是人物动作状态,而并非人物所处的状态,非玩家控制状态下 你的角色仍然可能释放技能,比如 被敌对玩家 “精神控制”,因此,非玩家控制 状态  人物动作状态并非同一层面
  • 战斗状态 非战斗状态 两种状态 此图不能体现
  • 瞬发技能不需要咏唱,在空闲和跳跃的过程中都可能释放
  • 移动状态下,不可切换成咏唱,必须是空闲状态下,才可以咏唱,这里估计是想错了,认为移动可切换成站立不动的咏唱,但实际上应该是先不动了,才能咏唱

 

注释:以上提出的几点,是这个状态机的直观分析,设计者的隐藏设计,并不在考虑之内

 

针对以上问题的讨论如下:(不同颜色代表不同的讨论者)

1、自动攻击  是一种状态没错,但自动攻击的同时,角色也可以移动,但上图中 自动攻击 移动的关系是相互切换

自动攻击时不能移动,这个参考天龙的做法,跟wow不一样,用鼠标操作的如果自动攻击时可以移动会带来很多问题。

自动攻击时不能移动,刚刚LY也是这么说,这一点我持保留意见。另外,就算按照你说的,自动攻击时不能移动,那自动攻击时能不能释放技能呢?图里也没画吧?我觉得自动攻击是一种常态,是角色所处的状态,不能和角色的动作状态放在一起。

其实仔细看下来ZJ的这张图里,并没有动作状态,全都是逻辑上的状态,所以自动攻击作为一种角色状态放在里面是没问题的。另外,自动攻击中不能移动这个不是我们决定的,策划文档里虽然没有明确指出这一点,但由于我们是参考天龙,所以没有明确指出的部分,在文档上没有被明确补完之前,这样的迁移没有问题。

LY:如你所说,这张图确实可以理解为一张纯逻辑状态图,如果这样理解,问题就变成了:跳跃本身就是移动的一种子状态,此图就没有跳跃状态,因为区分“移动”和“空闲”两种状态的目的是为了“移动中不可施法”,跳跃没有作为一种单独状态存在的理由(有的话,请举出)。如果“自动攻击”状态成立,那自动攻击状态不可施法(图中)?空闲不可进入自动攻击?这里还需要确认的是“自动攻击”的定义,我认为自动攻击是一种保持的状态,在战斗中移动了位置,也是在自动状态中,而你的解释是,自动攻击会切换到移动状态,然后再切回来,从你的这个论点出发,就是按照角色动作划分了,并不是按照角色状态划分了。因为角色才此时的状态就是自动攻击状态。

 

2、谈话  其实可以不作为一种状态,和NPC对话的同时 玩家同样可遭受攻击,进入战斗状态,在对话的过程中,也可以释放技能,上图中没有表现

在谈话时被攻击会打断谈话过程,天龙跟wow好像都是这么做的吧。

我的意思就是这个意思,既然谈话时,玩家也能被攻击,也可能会死,那么对话就不是单独的一个状态了,我的观点就是,没有谈话这种状态。

谈话是一种状态,而且谈话时会触发到谈话状态机。有些事件只有玩家在谈话时才会接受,因此谈话必须做为一种状态存在才能有正确的迁移

LY:可以认为谈话是一种状态,但我认为是多余的,既然谈话中可能被攻击,那谈话就是空闲状态,并不是谈话状态,什么是你说的:“因此谈话必须做为一种状态存在才能有正确的迁移”,需要什么正确的迁移?

 

3、跳跃 状态结束 有可能直接进入移动状态

在跳跃状态下是不响应玩家操作的,所以跳跃完肯定是静止站立在那边的,移动中跳跃不同,这里参照的天龙中的做法,移动中跳跃不改变移动方向,所以我这里的跳跃状态不包括移动中跳跃

我不是很理解,你所说的:“我这里的跳跃不包括移动中跳跃”这句话。我的理解是,这个图必须能完整反映整个情况。

这里有点问题,我看了下需求文档,里面写移动中跳跃不迁移。但实际上移动中会接收跳跃的事件并产生响应与动作,在图中应该用一个自迁移来表示,而并非文档里用红字写的“ 状态不迁移”

LY:暂无异议

 

4、按你的设计,空闲,跳跃,移动,是人物动作状态,而并非人物所处的状态,非玩家控制状态下 你的角色仍然可能释放技能,比如 被敌对玩家 “精神控制”,因此,非玩家控制 状态  人物动作状态并非同一层面

我状态机中的名字其实并没有实际意义,只是根据自底向上分析完之后把哪些响应同一事件的状态整合起来而已。

这句话我也不是很理解,我的理解是,状态机设计就是为了划分原本一些不清晰的概念,按照你的说法,你的名字都没有实际意义,那状态机设计就没有意义了,因为你的划分可以这样说,也可以那样说。

其实重点不在于动作里的名字有没有意义,重点是,里面每种状态是否明确表达了响应的事件和跳转关系

LY:保留意见

 

5、战斗状态 非战斗状态 两种状态 此图不能体现

我在需求文档中写过了,战斗状态和非战斗状态区别在于一些技能和物品使用的规则不同,所以我没有把他们放到控制玩家逻辑的状态机中,我觉得这样跟方便一些。

这一点,我持保留意见,回头可以深入探讨。

这一点,我觉得战斗状态和非战斗状态只是玩家能看到的两种表面状态,我们设计状态机时应该考虑的是里面的逻辑区别

LY:这两种状态并非表面状态,而是战斗状态不可以喝水吃面包,这就是和我们逻辑相关的,必须在图中体现

 

6、瞬发技能不需要咏唱,在空闲和跳跃的过程中都可能释放

瞬发技能是不用咏唱,我这样做只是为了把关于技能判断和处理的过程都放在咏唱阶段去处理,在空闲状态下释放技能放在移动中也是为了在移动中处理所有关于距离判断的处理,并不是说空闲状态下不能释放技能

不可以“把关于技能判断和处理的过程都放在咏唱阶段去处理”,因为“瞬发”和“咏唱再发”是两件事情

瞬发和咏唱只是两种表象,如果瞬发在数据库里只是咏唱时间为零的技能,那在逻辑上就是同一套东西。不过另一方面我觉得空闲状态下释放技能应该是有所表达的,或者把空闲和移动归到一个大的状态里,ZJ的图里其实看不到这一跳转。(状态图应该能把操作逻辑表达完整)

LY:保留意见

 

7、移动状态下,不可切换成咏唱,必须是空闲状态下,才可以咏唱,这里估计是想错了,认为移动可切换成站立不动的咏唱,但实际上应该是先不动了,才能咏唱

因为我关于距离判断的逻辑都在移动状态下处理,所以对于在移动时咏唱,不经过空闲阶段直接进行咏唱。

这个和状态机设计的原则不符合,不是说不能这样做,只是这样做好不好,这一点我持保留意见

 

你是按照自顶向下的设计思路设计的,我上个版本也是这么做的,把玩家分为战斗状态和非战斗状态,后来发现这样做最大的坏处就是很多判断和动作位置比较混乱,一旦有什么修改容易造成很多bug,所以这次我采用自底向上的方法,把子状态的所有可能跳转分析出来,然后根据同样的逻辑跳转整合在一起,并不是按照存活死亡、进入脱离战斗状态的方式设计,我觉得这样可能更有效些。

你说:“这样做最大的坏处就是很多判断和动作位置比较混乱”,我不是很理解,请举出具体例子,你说这样可能更有效,我也不是很理解,怎么有效?

 

其实这里有个问题,就是状态机设计是根据程序员的实现方式来还是根据玩家的操作方式来。这一点可以再讨论,因为也很难说清楚哪个更好,但状态机最低限度应该要能让策划理解并且回答“这样确实是我想要的逻辑”。

LY:我的理解不同,状态机不是说根据程序的需要或是玩家操作来,而是真相只有一个,状态机设计好坏,就是我们程序逻辑的好坏,没有从不同方向考虑,不同方向进入的差别。

 

我给出设计如下

此图为角色上半身动作状态图,下半身情况简单的多,只有空闲、移动、跳跃和死亡,如果把上下身体当作一个整体考虑,则需要做修改。

此图为玩家状态图

 

针对一些同事提出的按角色逻辑状态划分的需求,给出一个新的设计(角色逻辑状态)

我的考虑如下:

跳跃实际上就是角色的锚点按余弦轨迹移动,所以是移动的一种。按昨天的说法,谈话的过程中,不可以移动,不可以释放技能,所以移动状态到谈话状态是单向进入,这样的话,进入谈话状态,可能会被其他玩家轮X到死。这一点需考虑。

实际上,看上图分析,释放技能之后都会回到历史状态,这就显得很累赘了,释放技能实际上并不是一个状态,只是一个动作,因为假设释放一个技能的动作是0.2秒,如果此时是一个状态,则在这0.2秒中是无敌的,这样设计就错了,事实上,我们期望的结果是,瞬发技能只对自己或对方的状态产生影响,而表现这个动作花费的0.2秒,和放技能本身是两件事情。做出修改如下:

结论,状态机设计可以从不同的出发点和角度考虑,但最后能完全满足需求的设计方案应该只有一个,因为使用状态机进行设计,原本的目的就是为了统一小组成员的设计思想,状态的划分也将影响最后角色的行为,对游戏品质也有深远的影响,因此,设计状态机必须能转换角度看问题,从不同的层面不同的角度进行状态划分和组合,以求一个最简最精的设计方案。

原创粉丝点击