示例#1
0
 /// <summary>
 /// 检查该后继Action 是否满足转换条件
 /// </summary>
 /// <param name="action"></param>
 /// <returns></returns>
 bool CheckTransform(FSMSubsequenceAction action)
 {
     if (_currentState.CheckContain(action._preconditions))
     {
         return(true);
     }
     return(false);
 }
示例#2
0
 /// <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;
         }
     }
 }
示例#3
0
    /// <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);
        }
    }
示例#4
0
    /// <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;
        }
    }