123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- namespace BehaviorDesigner.Runtime.Tasks
- {
- [TaskDescription("Similar to the parallel selector task, except the parallel complete task will return the child status as soon as the child returns success or failure." +
- "The child tasks are executed simultaneously.")]
- [TaskIcon("{SkinColor}ParallelCompleteIcon.png")]
- public class ParallelComplete : Composite
- {
- // The index of the child that is currently running or is about to run.
- private int currentChildIndex;
- // The task status of every child task.
- private TaskStatus[] executionStatus;
- public override void OnAwake()
- {
- // Create a new task status array that will hold the execution status of all of the children tasks.
- executionStatus = new TaskStatus[children.Count];
- }
- public override void OnChildStarted(int childIndex)
- {
- // One of the children has started to run. Increment the child index and set the current task status of that child to running.
- currentChildIndex++;
- executionStatus[childIndex] = TaskStatus.Running;
- }
- public override bool CanRunParallelChildren()
- {
- // This task can run parallel children.
- return true;
- }
- public override int CurrentChildIndex()
- {
- return currentChildIndex;
- }
- public override bool CanExecute()
- {
- // We can continue executing if we have more children that haven't been started yet.
- return currentChildIndex < children.Count;
- }
- public override void OnChildExecuted(int childIndex, TaskStatus childStatus)
- {
- // One of the children has finished running. Set the task status.
- executionStatus[childIndex] = childStatus;
- }
- public override void OnConditionalAbort(int childIndex)
- {
- // Start from the beginning on an abort
- currentChildIndex = 0;
- for (int i = 0; i < executionStatus.Length; ++i) {
- executionStatus[i] = TaskStatus.Inactive;
- }
- }
- public override TaskStatus OverrideStatus(TaskStatus status)
- {
- if (currentChildIndex == 0) {
- return TaskStatus.Success;
- }
- // Return the child task's status as soon as a child task returns success or failure.
- for (int i = 0; i < currentChildIndex; ++i) {
- if (executionStatus[i] == TaskStatus.Success || executionStatus[i] == TaskStatus.Failure) {
- return executionStatus[i];
- }
- }
- return TaskStatus.Running;
- }
- public override void OnEnd()
- {
- // Reset the execution status and the child index back to their starting values.
- for (int i = 0; i < executionStatus.Length; ++i) {
- executionStatus[i] = TaskStatus.Inactive;
- }
- currentChildIndex = 0;
- }
- }
- }
|