/// <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); }
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); } } }
/// <summary> /// 是否影响当前的主状态 /// </summary> /// <param name="state"></param> /// <returns> true 为 影响</returns> private bool IsCauseCurrent(FSMState substate, FSMState current) { return(FSMStateRuleConfig.MutexSubState(substate).Contains(current)); }