예제 #1
0
 /// <summary>
 /// 子状态是否可以影响主状态的切换
 /// </summary>
 /// <param name="state"></param>
 /// <returns></returns>
 private bool IsCauseMian(FSMState state)
 {
     foreach (FSMState item in listSubState)
     {
         if (FSMStateRuleConfig.MutexSubState(item).Contains(state))
         {
             return(false);
         }
     }
     return(true);
 }
예제 #2
0
 public void Change(FSMState state)
 {
     if (state < FSMState.MainSub) // 为主状态 切换
     {
         //状态相同 不切换状态
         if (currentState == state)
         {
             return;
         }
         // 子状态是否影响主状态的切换
         if (IsCauseMian(state))  //true 不影响
         {
             List <FSMState> list = FSMStateRuleConfig.ChangeMain(currentState);
             if (list.Contains(state))
             {
                 // 如果可以切换这个状态 结束当前的状态
                 EndState(currentState);
                 StartState(state);
                 currentState = state;
             }
             else
             {
                 Debug.LogError("state is not change ... ");
             }
         }
         else  //不可切换
         {
             Debug.LogError("state is Mutex ...");
         }
     }
     else  // 是子状态
     {
         if (listSubState.Contains(state))  //目前有这个子状态  要时间上的延续
         {
             ContinueState(state);
         }
         else
         {
             // 当前不存在这个子状态
             // 是否影响当前的主状态
             if (IsCauseCurrent(state, currentState)) // 影响
             {
                 EndState(currentState);
                 StartState(FSMState.Idle);
                 currentState = FSMState.Idle;
             }
             AddSubState(state);
             StartState(state);
         }
     }
 }
예제 #3
0
 /// <summary>
 /// 是否影响当前的主状态
 /// </summary>
 /// <param name="state"></param>
 /// <returns> true 为 影响</returns>
 private bool IsCauseCurrent(FSMState substate, FSMState current)
 {
     return(FSMStateRuleConfig.MutexSubState(substate).Contains(current));
 }