状态模式(State)理解--unity

  • 模式所针对的情况
  • 状态模式优点
  • 状态模式与switch-case对比
  • 在unity中实现状态模式需要怎么实现
    • 抽象的基类
    • 基类下对应的子类
    • 状态的控制者
    • 主循环调用
  • 总结

模式所针对的情况

状态模式适用于包含“切换”关键词的几乎任何情况:场景界面切换、人物转台切换、阶段切换等等。

状态模式优点

相较于switch-case,状态模式易于修改。便于调试。简单来说就是方便阅读,减轻阅读负担。

状态模式与switch-case对比

就拿鬼泣5中的但丁为例:
但丁拥有12种武器,4个战斗风格,2个魔人模式,每个魔人模式对应的战斗风格对应的技能都不一样。
如果我们选择使用switch-case自然可以成功运行,但是这样的“技能表”脚本有着以下问题

  1. 这脚本在编写时需要保证每一个对应的类都在其中,在用switch-case进行编写时容易混淆,在调试时也不方便阅读。
  2. 脚本在编写完毕之后,如果以后又要增加一个新的武器,那么所有对应的模式都要再switch-case中增加对应的代码。
  3. 在制作完毕之后,对应的“技能表”脚本由于对其他类有过大的依赖,所以也会导致该类无法被引用到其他的工程当中。

以上的问题对应的解决办法如下

对于1、2而言,这种问题出现的原因就是因为这些代码都同时出现在一个脚本里面,那么我们所需要的就是多个脚本分别来编写这些代码
但是如果脚本变多了,就需要保证这些对应的代码都需要有一定的规律,不然只是让工作量增大而不是减少。
那么就寻找这些脚本的共同点来形成一个类来统一管理

综上,我们可以制作一个抽象的基类包含“初始化”、“结束后清除资源”、“定时更新逻辑”、“转换到其他状态”等方法。然后其他的相关的类只要跟着这个模式来写就能通过“转换到其他状态”的方法来达成彼此之间的转化

分析完成,以上解决办法就是状态模式的思想。

在unity中实现状态模式需要怎么实现

状态模式下unity中的对应脚本被划分为四个部分:

  1. 抽象的基类(技能模板)
  2. 基类下对应的子类(某个技能)
  3. 这些状态的控制者
  4. 主循环调用(主循环、主脚本)

下面会对每一个对应的部分进行较为详细的解释。

抽象的基类

首先需要一个抽象的基类来为其子类定义对应的格式,这个格式包含“对应状态的名字”、成员“控制者”、方法“开始”、“结束”、“更新”……
注意点:
(1)不必接上MonoBehavior接口,该接口主要是提供Awake、Update等主要方法
(2)保证对应类为抽象类的方法为在方法前增加“virtual”关键字,如“public virtual void StateBegin()”
(3)基类中必须拥有“控制者”成员,这样才能在该基类的子类中通过该成员调用该成员中的方法从而达到内部按需更换类的目的

基类下对应的子类

这些子类都继承自统一的基类,他们必须按照基类对应格式写下来,并且在其中保证子类之间的交换。
注意点:
(1)要接上基类接口,这是毋庸置疑的。
(2)override一定要加上,这也是肯定要做的“public override void StateBegin()”
(3)有些子类中不一定要把基类中的所有方法全部继承
(4)可以用一个子类作为所有子类的初始化类,在调用完毕“开始”方法后,调用“更新”方法时能通过“控制者”的设置方法跳转到别的类中去

状态的控制者

这些状态会被统一的管理,而在编写这个脚本的时候只需要正对对应的抽象基类即可,控制者脚本中往往需要一个“设置”方法来让所有子类都能调用,还需要一个“更新”方法来统一更新
注意点:
(1)控制者脚本中必须包含一个基类的成员,在设置脚本中就是通过调用和更改该成员为其子类来实现的状态更换
(2)控制者的“更新”方法中可以同时解决初始化的问题,只需要设置一个布尔值在进入函数之后更改就行了

主循环调用

主循环
注意点:
(1)接上Unity提供的MonoBehavior接口
(2)保证在更换场景的时候不被摧毁掉(GameObject.DontDestroyOnload(this.gameObject);)
(3)程序中只出现状态模式中的控制者成员
(4)提前准备好随机数种子

总结


状态模式通过多个脚本内部变化来更改类的实现方法。
状态变化的流程:事件响应——>通过对应State类中的Context/Controller成员调用其中的SetState方法——>Context/Controller通过其中的State成员的进行更新和更换——>所有的更新都在GameLoop中得到最终在游戏中的实现

将SetState方法放在Context/Controller中是因为对应的状态类可能改变,但是所有类对应的Context/Controller不会改变,而这个方法本身对于各个类而言又不会发生变化,所以放在Context/Controller中。简言之,工具就放在需要工具的地方

参考书籍:设计模式与游戏完美开发

状态模式(state)的理解--unity相关推荐

  1. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对"状态模式"并不陌生,因为我们之前使用到了状态模式进行 ...

  2. php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)

    状态模式 (State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for States) (一)为什么需要状态模式 ...

  3. c++状态模式state

    c++状态模式state 概念 角色和职责 案例 概念 State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样 ...

  4. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  5. 状态模式(State)-七十二变

    状态模式(State)-老孙七十二变 俺老孙来也-我是如来佛祖玉皇大帝观音菩萨指定取西经特派使者花果山水帘洞美猴王齐天大圣孙悟空啊!老孙的必杀技就是七十二变,没错比老外的变相怪杰还有牛逼许多. 关于老 ...

  6. 设计模式的理解:状态模式(State) 和备忘录模式(Memento)

    一.状态模式 状态模式,允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类.它的实现方式和策略模式相似,目的都是对if...else语句进行优化,只不过,策略模式通过外部传入枚举.条 ...

  7. 极速理解设计模式系列:22.状态模式(State Pattern)

    四个角色:抽象状态类(State).具体状态类(ConcreateState).情景类(Context).客户端(Client) 抽象状态类(State):提供一个与情景类有关的State行为. 具体 ...

  8. 读书笔记_java设计模式深入研究 第八章 状态模式 State

    1,状态模式:事务有n个状态,且维护状态变化. 2,UML模型: -1,上下文环境Context:定义客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete   ...

  9. 状态模式(State Pattern)

    状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类 考虑如下场景,自动售票机: 每一个方格表示自动售票机的一种状态,每一个箭头线表示自动售票机由一个状态转换到另一个状态所需要的 ...

  10. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

最新文章

  1. 列出这周开发工作时间及内容,可以发表各种感想和这周阅读内容。
  2. C++拷贝构造函数(复制构造函数)详解
  3. 我的MAXSCRIPT笔记
  4. 浅析软件工程中的UML建模技术
  5. 小明分享|ESP8266设置STA模式ping包测试
  6. nginx代理人server结合tomcat采用
  7. 使用cloudera manager安装Oozie服务【详细步骤】
  8. 图谱实战 | 面向C端场景的概念图谱构成、建设与应用索引
  9. 六石管理学:座位可以考虑混排
  10. 实施运维企业面试题-5
  11. 【ATSC】 为什么选择ATSC 3.0
  12. Unity mp3转wav
  13. NDoc1.3.1使用手册
  14. RN系列:Android原生与RN如何交互通信
  15. 50%占空比的3分频器(奇数分频)
  16. 转载---Cesium简介
  17. 《Java基础——break与continue用法详解》
  18. f下行到什么形成全音_乐理试题二
  19. Android Spinner控件 显示数据和下拉选中数据分离
  20. 大数据技术在电商的应用

热门文章

  1. 软件测试工程师面试秘籍
  2. 解决fatal: cannot make .repo/repo directory: Permission denied 问题
  3. 操作系统:如何通过 ssh 给远程服务器传输文件
  4. JDBC原理浅析HIVE-JDBC
  5. 新学期 新气象 新目标
  6. SQL Server创建表和添加列
  7. Java中final关键字的作用
  8. 排序 - - -归并排序(二路归并)
  9. 法国Adidas搞怪营销:“绑架”消费者来跑步
  10. 8年前端与众不同的Vue实战系列,助你成为前端顶级开发者