Пример #1
0
        protected override bool OnEvaluate(BtWorkingData workData)
        {
            BtActionParallelContext thisContext = GetContext <BtActionParallelContext>(workData);

            _init_list_to(thisContext._evaluationStatus, false);
            bool finalResult = false;

            for (int i = 0; i < GetChildCount(); ++i)
            {
                BtAction node = GetChild <BtAction>(i);
                bool     ret  = node.Evaluate(workData);
                //early break
                if (_evaluationRelationship == E_ChildrenRelationShip.and && ret == false)
                {
                    finalResult = false;
                    break;
                }
                if (ret)
                {
                    finalResult = true;
                }
                thisContext._evaluationStatus[i] = ret;
            }
            return(finalResult);
        }
Пример #2
0
        protected override void OnTransition(BtWorkingData workData)
        {
            BtActionParallelContext thisContext = GetContext <BtActionParallelContext>(workData);

            for (int i = 0; i < GetChildCount(); ++i)
            {
                BtAction node = GetChild <BtAction>(i);
                node.Transition(workData);
            }
            //clear running status
            _init_list_to(thisContext._runningStatus, BtRunningStatus.EXECUTING);
        }
Пример #3
0
        protected override int OnUpdate(BtWorkingData workData)
        {
            BtActionParallelContext thisContext = GetContext <BtActionParallelContext>(workData);

            //first time initialization
            if (thisContext._runningStatus.Count != GetChildCount())
            {
                _init_list_to(thisContext._runningStatus, BtRunningStatus.EXECUTING);
            }
            bool hasFinished  = false;
            bool hasExecuting = false;

            for (int i = 0; i < GetChildCount(); ++i)
            {
                if (thisContext._evaluationStatus[i] == false)
                {
                    continue;
                }
                if (BtRunningStatus.IsFinished(thisContext._runningStatus[i]))
                {
                    hasFinished = true;
                    continue;
                }
                BtAction node          = GetChild <BtAction>(i);
                int      runningStatus = node.Update(workData);
                if (BtRunningStatus.IsFinished(runningStatus))
                {
                    hasFinished = true;
                }
                else
                {
                    hasExecuting = true;
                }
                thisContext._runningStatus[i] = runningStatus;
            }
            if (_runningstatusRelationship == E_ChildrenRelationShip.or && hasFinished || _runningstatusRelationship == E_ChildrenRelationShip.and && hasExecuting == false)
            {
                _init_list_to(thisContext._runningStatus, BtRunningStatus.EXECUTING);
                return(BtRunningStatus.FINISHED);
            }
            return(BtRunningStatus.EXECUTING);
        }