//----------------------------------------------------------------------// // Priority and resources handling //----------------------------------------------------------------------// void UGameplayTasksComponent::AddTaskReadyForActivation(UGameplayTask& NewTask) { UE_VLOG(this, LogGameplayTasks, Log, TEXT("AddTaskReadyForActivation %s"), *NewTask.GetName()); ensure(NewTask.RequiresPriorityOrResourceManagement() == true); TaskEvents.Add(FGameplayTaskEventData(EGameplayTaskEvent::Add, NewTask)); // trigger the actual processing only if it was the first event added to the list if (TaskEvents.Num() == 1 && CanProcessEvents()) { ProcessTaskEvents(); } }
void UGameplayTasksComponent::OnGameplayTaskDeactivated(UGameplayTask& Task) { // process events after finishing all operations FEventLock ScopeEventLock(this); const bool bIsFinished = (Task.GetState() == EGameplayTaskState::Finished); if (Task.GetChildTask() && bIsFinished) { if (Task.HasOwnerFinished()) { Task.GetChildTask()->TaskOwnerEnded(); } else { Task.GetChildTask()->EndTask(); } } if (Task.IsTickingTask()) { // If we are removing our last ticking task, set this component as inactive so it stops ticking TickingTasks.RemoveSingleSwap(&Task); } if (Task.IsSimulatedTask()) { SimulatedTasks.RemoveSingleSwap(&Task); } // Resource-using task if (Task.RequiresPriorityOrResourceManagement() && bIsFinished) { OnTaskEnded(Task); } IGameplayTaskOwnerInterface* TaskOwner = Task.GetTaskOwner(); if (!Task.IsOwnedByTasksComponent() && !Task.HasOwnerFinished() && TaskOwner) { TaskOwner->OnGameplayTaskDeactivated(Task); } UpdateShouldTick(); }
void UGameplayTasksComponent::OnTaskEnded(UGameplayTask& Task) { ensure(Task.RequiresPriorityOrResourceManagement() == true); RemoveResourceConsumingTask(Task); }