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