/// <summary> /// 检查该后继Action 是否满足转换条件 /// </summary> /// <param name="action"></param> /// <returns></returns> bool CheckTransform(FSMSubsequenceAction action) { if (_currentState.CheckContain(action._preconditions)) { return(true); } return(false); }
/// <summary> /// 更新当前Action的所有后继Action /// </summary> /// <param name="action"></param> /// <param name="tempAction"></param> /// <param name="priority"></param> void UpdateSubAction(FSMSubsequenceAction action, ref FSMSubsequenceAction tempAction) { action._action.Listen(); if (CheckTransform(action)) { if (tempAction == null || tempAction._priority < action._priority) { tempAction = action; } } }
/// <summary> /// 添加Action 切换关系 /// </summary> /// <param name="nowState">前一个状态</param> /// <param name="nextState">下一个状态</param> /// <param name="preconditions">过度条件</param> /// <param name="priority">优先级</param> public void AddRelation(E_ActionTYpe nowState, E_ActionTYpe nextState, FSMWorldState preconditions, int priority) { if (_actionSet.ContainsKey(nowState) && _actionSet.ContainsKey(nextState)) { FSMSubsequenceAction subAction = new FSMSubsequenceAction(_actionSet[nextState], preconditions, priority); if (!_nextActions.ContainsKey(nowState)) { _nextActions.Add(nowState, new List <FSMSubsequenceAction>()); } _nextActions[nowState].Add(subAction); } }
/// <summary> /// 根据世界条件判断从当前Action 是否可以有过渡的Action 如果有就过渡 /// </summary> void TryGotoNextAction() { if (!_nextActions.ContainsKey(_currentAction.GetActionType())) { return; } List <FSMSubsequenceAction> nextactions = _nextActions[_currentAction.GetActionType()]; FSMSubsequenceAction tempAction = null; foreach (FSMSubsequenceAction sub in nextactions) { UpdateSubAction(sub, ref tempAction); } if (tempAction != null) { DeactiveAction(_currentAction); _currentAction = null; ActiveAction(tempAction._action); _currentAction = tempAction._action; } }