MOBA源码的状态机分析

抽象场景中活动的物体,添加上一个叫做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。


首页 我的博客
粤ICP备17103704号