GoF之状态(State)模式

状态模式的定义

状态模式,在GOF中的解释是:让一个对象的行为随着内部状态的改变而改变,而该对象也像换了类一样


 

 普通状态模式的UML图


 

使用状态模式实现游戏场景的切换

   在Unity3D的环境中,一次运行只能在一个场景中运行,一个场景负责一个不同的功能,而状态模式每次同样也只能存在一个在运行的状态,所以设计游戏的时候,我们

可以将一个状态和一个游戏场景进行绑定;场景之间的转换便成为了状态之间的切换;状态由一个状态控制器(StateController)控制,每个状态不必关注上一个状态的情况,

增加一个场景的时候,也不需要改变太多之前设计的东西,只需要重新设计一个继承与基础状态类的子类,修改状态控制器,在一定程度上也减少了代码的修改,符合开闭原

则,减少了状态之间的依赖程度。


 

状态模式的优点

减少错误的发生并降低维护难度     

  不在使用switch case来判断当前的状态,可以减少新增状态时候修改switch case带来的错误,符合开闭原则。

状态执行环境单一化

  与每一个状态有关的对象及操作都被是现在一个场景状态下,对程序设计者来说,可以清楚的知道每一个状态执行时候

所需要的对象及配合的类

不同项目之间的共享

  状态模式可以用于不同状态之间的共享,例如开始场景和开始状态可用于游戏的载入场景,加载游戏的一些初始化工作,如游戏的载入动画等。

特别是在网络在线游戏项目中,玩家的上线,登录,验证,数据同步等过程,实现上存在一定的复杂度,并且相同公司不同游戏项目这些操作重复度很高,

如果将这些复杂重复的操作放在共享场景中,共享使用与维护,就可以在一定程度上减少开发时间和成本。


 

状态模式面对变化

  当游戏后期游戏企划提出新的系统功能来增加游戏内容的时候,这些提案可能是增加游戏小关卡,提供查看角色信息图鉴,玩家排行等功能。当程序设计人员

分析这些新增功能的需求后,如果觉得在现有的场景中解决不了,或者修改过多的话,可以尝试设计一个新的场景来完成这些功能。这是我们需要:

  在Unity3D中新建一个场景

  加入一个新的场景切换状态类,对应新的场景上,与之绑定,并在类中实现相关功能。

  决定要从那个现有的场景切换到新的场景

  决定新的场景结束后要转换到那个场景

上述流程就程序的代码设计而言,只是增加一个场景状态类,增加一些相关功能的类文件,不会设计到太多原有类的修改或者替换,符合一定的开闭原则。


 

状态模式的其他应用方式

角色AI

  使用状态模式来控制角色的不同状态下的AI行为。

游戏服务器连接状态

  网络游戏的客户端,需要处理与游戏服务器的连接状态,一般包含了开始连接,连接中,断线等状态,而在不同的状态下,会有不同的封包信息处理方式,需要

分别实现。

游戏关卡设计

  如果是通关类型游戏,进入关卡时候通常会分成不同的阶段,包含加载数据,显示管卡信息,倒数通知开始,关卡进行,关卡结束和分数计算,这些不同的阶段可以用不同的

状态类进行负责。

 


 

  至此,状态模式的随笔结束,此文只是作为学习的小结,感谢蔡升达先生的书籍《设计模式与游戏完美开发》。

  另附github练习源码:状态模式练习

 

posted @ 2018-01-05 17:16  Recho  阅读(605)  评论(0编辑  收藏  举报