public virtual void InitStateMachine() { fsm = new FiniteStateMachine(); fsm.SetStatePermit( FiniteStateMachine.States.Empty, FiniteStateMachine.Events.Start, FiniteStateMachine.States.Idle ); fsm.SetStateEntery( FiniteStateMachine.States.Path, StartMove ); fsm.AddStateUpdate( FiniteStateMachine.States.Path, UpdateFindGroundPosition, 0.1f ); fsm.SetStatePermit( FiniteStateMachine.States.Path, FiniteStateMachine.Events.TargetApproached, FiniteStateMachine.States.Idle ); fsm.SetStatePermit( FiniteStateMachine.States.Path, FiniteStateMachine.Events.TargetFound, FiniteStateMachine.States.FollowTarget ); fsm.SetStatePermit( FiniteStateMachine.States.Path, FiniteStateMachine.Events.GoToPosition, FiniteStateMachine.States.Path ); fsm.SetStatePermit( FiniteStateMachine.States.Path, FiniteStateMachine.Events.Dead, FiniteStateMachine.States.Dead ); fsm.SetStateExit( FiniteStateMachine.States.Path, StopMoving ); fsm.SetStateEntery( FiniteStateMachine.States.Idle, StartIdle ); fsm.AddStateUpdate( FiniteStateMachine.States.Idle, UpdateFindTarget, 0.5f ); fsm.SetStatePermit( FiniteStateMachine.States.Idle, FiniteStateMachine.Events.GoToPosition, FiniteStateMachine.States.Path ); fsm.SetStatePermit( FiniteStateMachine.States.Idle, FiniteStateMachine.Events.TargetFound, FiniteStateMachine.States.FollowTarget ); fsm.SetStatePermit( FiniteStateMachine.States.Idle, FiniteStateMachine.Events.Dead, FiniteStateMachine.States.Dead ); fsm.SetStateExit( FiniteStateMachine.States.Idle, StopMoving ); fsm.SetStateEntery( FiniteStateMachine.States.FollowTarget, StartFollowTarget ); fsm.AddStateUpdate( FiniteStateMachine.States.FollowTarget, UpdateFindTarget, 0.5f ); fsm.AddStateUpdate( FiniteStateMachine.States.FollowTarget, UpdateFollowTarget, 0.1f ); fsm.SetStatePermit( FiniteStateMachine.States.FollowTarget, FiniteStateMachine.Events.GoToPosition, FiniteStateMachine.States.Path ); fsm.SetStatePermit( FiniteStateMachine.States.FollowTarget, FiniteStateMachine.Events.TargetLost, FiniteStateMachine.States.Idle ); fsm.SetStatePermit( FiniteStateMachine.States.FollowTarget, FiniteStateMachine.Events.TargetApproached, FiniteStateMachine.States.Action ); fsm.SetStatePermit( FiniteStateMachine.States.FollowTarget, FiniteStateMachine.Events.Dead, FiniteStateMachine.States.Dead ); fsm.SetStateExit( FiniteStateMachine.States.FollowTarget, StopMoving ); fsm.SetStateEntery( FiniteStateMachine.States.Action, StartAttack ); fsm.AddStateUpdate( FiniteStateMachine.States.Action, UpdateAttack, 0.1f ); fsm.SetStatePermit( FiniteStateMachine.States.Action, FiniteStateMachine.Events.GoToPosition, FiniteStateMachine.States.Path ); fsm.SetStatePermit( FiniteStateMachine.States.Action, FiniteStateMachine.Events.TargetLost, FiniteStateMachine.States.Idle ); fsm.SetStatePermit( FiniteStateMachine.States.Action, FiniteStateMachine.Events.Dead, FiniteStateMachine.States.Dead ); fsm.SetStateExit( FiniteStateMachine.States.Action, StopAttack ); fsm.SetStateEntery( FiniteStateMachine.States.Dead, OnDeadEnter ); fsm.SetStatePermit( FiniteStateMachine.States.Dead, FiniteStateMachine.Events.Dead, FiniteStateMachine.States.Dead ); fsm.CallEvent( FiniteStateMachine.Events.Start ); }