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); }
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); }
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); }