抽象场景中活动的物体,添加上一个叫做Entity的脚本的,Entity是一个继承自MonoBehaviour的脚本组件,用来控制播放动画和检测进入泉水,Entity拥有一个ientity或则是继承自ientity的iplayer和iselfplayer,ientity用来保存同步信息(Transform组件,血值,攻击,模型id等)和提取了一些公共的方法(进入站立,进入移动,移动中,释放技能(进入,前摇,释放),击飞,下落,更新数据,打开商店,创建和显示隐藏血条等),如果是特殊的会声明为virtual在player那里重写并可以扩展新的方法。ientity已经有了很多的行为了,现在就需要在某种情况调用某种行为了,所以ientity会拥有一个EntityFSM状态机,这些状态机状态其实是一个工具类,他们直接调用的还是具体某个ientity的某个方法,只要将ientity的状态设置为具体的某个EntityFSM
public interface EntityFSM { bool CanNotStateChange{set;get;} FsmState State { get; } void Enter(Ientity entity , float stateLast); bool StateChange(Ientity entity , EntityFSM state); void Execute(Ientity entity); void Exit(Ientity Ientity); } public class EntityIdleFSM : EntityFSM { public static readonly EntityFSM Instance = new EntityIdleFSM(); public FsmState State { get { return FsmState.FSM_STATE_IDLE; } } public bool CanNotStateChange{ set;get; } public bool StateChange(Ientity entity , EntityFSM fsm) { return CanNotStateChange; } public void Enter(Ientity entity , float last) { entity.OnEnterIdle(); } public void Execute(Ientity entity) { if (EntityStrategyHelper.IsTick(entity, 3.0f)) { entity.OnFSMStateChange(EntityFreeFSM.Instance); } } public void Exit(Ientity entity){ } }
在ientity中维护这一个EntityFSM,提供了转换的接口,在转换时修改这个EntityFSM的引用实例并调用这个EntityFSM的Enter方法,随后在Entity组件的Update方法中调用的ientity的Update方法再调用的EntityFSM的Update方法,而实际Update和Enter方法都会传入ientity,然后调用的实际还是ientity里的具体方法,只是EntityFSM的不同,调用的不同!
EntityFSM的状态有:EntityFSM、EntityDeadFSM、EntityForceMoveFSM、EntityFreeFSM、EntityIdleFSM、EntityLastingFSM、EntityLeadingFSM、EntityReleaseSkillFSM、EntityReliveFSM、EntityRunFSM、EntitySingFSM。