protected void RemoveState(FiniteState state)
 {
     if (_allStates.ContainsKey(state.Name))
     {
         _allStates.Remove(state.Name);
     }
 }
 protected void AddState(FiniteState state, bool bDefault = false)
 {
     _allStates[state.Name] = state;
     state.Owner            = this;
     if (bDefault)
     {
         _defaultState = state;
     }
 }
 public void OnFixUpdate()
 {
     if (NextState != null)
     {
         ChangeState(NextState);
         NextState = null;
     }
     if (CurrentState != null)
     {
         CurrentState.OnFixUpdate(_context);
     }
 }
        // 发送事件,触发状态迁移
        public void SendEvent(string eventName)
        {
            Debug.Assert(NextState == null, "Next State already exist!");
            foreach (FiniteStateTransition transition in _allTransitions)
            {
                FiniteState nextState;
                if (TryGetNextStateByEventName(eventName, transition, out nextState))
                {
//					ChangeState(nextState);
                    NextState = nextState;
                    break;
                }
            }
        }
        // 状态迁移
        private void ChangeState(FiniteState newState)
        {
            if (newState == CurrentState)
            {
                return;
            }

            if (CurrentState != null)
            {
                CurrentState.OnExit(_context);
            }
            CurrentState = newState;
            if (CurrentState != null)
            {
                CurrentState.OnEnter(_context);
            }
        }
        // 根据事件名称,从状态迁移表中,取出下一个状态
        private bool TryGetNextStateByEventName(string eventName, FiniteStateTransition transition, out FiniteState state)
        {
            state = null;
            if (!eventName.Equals(transition.EventName))
            {
                return(false);
            }
            if (CurrentState == null || !CurrentState.Name.Equals(transition.LastStateName))
            {
                return(false);
            }

            return(_allStates.TryGetValue(transition.NextStateName, out state));
        }