状态模式笔记1
英雄游戏(英雄互娱)曾在面试中询问我有关动画状态机的内容,我当时没有准备过这方面,紧张时说出了不太了解的回答,事后回想自己其实了解过相关内容,曾在设计角色时绑定骨骼后导入过一些动作来操控角色,当时还学习过如何平滑动作动画,进行状态机的切换,懊悔自己薄弱的即时表达能力,感觉很可惜。借此机会,我回顾了“动画状态机”,同时再阅读有关“设计模式”的书籍,通过递归式地学习,针对“状态模式”先做些笔记,发散出了“有限状态机”再是“行为树”等内容,所以将笔记拆分为几篇集中叙写,内容对象针对游戏角色(AI)。这几天我的确还是有点乏了,感觉自己学的写的没有正反馈,认识的朋友们大都找到合适的工作了,我水平真的不够吗,感觉入职之后再写博客会更有动力吧。。。
状态模式
“允许一个对象的行为随着内部状态的改变而改变,对象看起来好像是在修改自身类。”
有限状态机FSM
- 拥有一组状态,并且可以在这组状态之间进行切换。
- 状态机同一时刻只能处于一种状态。
- 状态机会接收一组输入或者事件。
- 每一个状态有一组转换,每一个转换都关联着一个输入并指向另一个状态。

首先,有限状态机的每个状态可以用枚举 enum 列出来
1 | publice enum State{ |
然后在角色AI类中,简单可以通过switch case来实现条件判断和状态转换,但存在一些缺点:
- 每增加一个状态,就需要在所有switch代码中添加对应代码。
- 所有与状态有关的对象和参数保存在一个类中,在被多个状态共享时容易产生混淆。
- 方法过于冗长,不易于调试。
所以需要使用状态模式。
状态模式
- 角色类
- 状态接口
列举状态方法,切换具体状态。 - 具体状态类
继承自状态接口,设置在各状态下的行为。

状态模式将每个状态相关的行为封装到了相关类中,在增删改查时不会对原有架构造成较大影响,可以让人清楚了解单一状态执行时的环境,降低了维护成本。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 逸人の博客!
评论

