天天看点

基于ECS架构下的状态机设计

状态机也叫有限状态机是一种模型,可以模拟生活游戏中的大部分事物,如红绿灯、汽车的行驶状态、游戏角色的状态等

比如生活中的红绿灯,把红绿灯看成状态机的话,那它有三种状态,绿、黄、红

通常情况下绿灯只能转变成黄灯、黄灯只能变成红灯、而红灯只能变成绿灯

基于ECS架构下的状态机设计

可用下面的结构表示:

{name = "green", turn = "yellow"}

{name = "yellow", turn = "red"}

{name = "red" , turn = "green"}

对于游戏中的角色来说,它会有跑(走、飞)run、待机idle、战斗battle、死亡die、复活birth等状态

当角色处于出生的的状态时,可以转换为待机状态,也可以转换为死亡状态(刚出生就被打死)、也可以转换为跑动状态

当角色处于跑动状态时,他可以转换为待机状态,死亡状态,这里要注意不能变为出生状态,因为玩家本来就没死

......

玩家的状态虽然很多,但是终归是有限的,状态间虽然可以转换,但也是有转换类别的限制

基于ECS架构下的状态机设计
基于ECS架构下的状态机设计

正在上传…重新上传取消

可用下面的结构表示:

{name = "birth", turn = {"idle", "die", "run"},

{name = "run", turn = {"idle","die"},

{name = "idle", turn = {"run","die"},

{name = "die", turn = {"birth"},

状态机特征

1、状态(state)总数有限

2、任一时刻只会处在一种状态

3、在某种条件下状态会从某种状态变换成另外一种状态

在ECS架构下的设计

StateBase 类, 为state的基类,设置一些id、owner、dict(状态转换的关系)

StateXXX state类,继承自StateBase实现各个状态下要做的事情

StateMachine 对state对象管理的类、对state的增删改查、state状态转换的管理(退出当前state进入下一个state)

FsmComponent 附在实体(player、monster、NPC等)上的组件

用于创建StateMachine对象,并对StateMachine对象添加state的对象,设置currState, 并且对当前的state执行enter操作,以及获取currState等操作

FSMHelper state类的管理器 dofile 所有的State类 并把其存储起来 这这里面可以创建StateMachine 和state 给那些没法加载FsmComponent的情形用

继续阅读