/** called when a task gets ended with an external call, meaning not coming from UGameplayTasksComponent mechanics */ private void OnTaskEnded(UGameplayTask Task) { if (Task.RequiresPriorityOrResourceManagement()) { RemoveResourceConsumingTask(Task); } }
public virtual void OnGameplayTaskDeactivated(UGameplayTask Task) { bool bIsFinished = Task.IsFinished(); var childTask = Task.GetChildTask(); if (childTask != null && bIsFinished) { if (Task.HasOwnerFinished()) { childTask.TaskOwnerEnded(); } else { childTask.EndTask(); } } if (Task.IsTickingTask()) { // If we are removing our last ticking task, set this component as inactive so it stops ticking TickingTasks.Remove(Task); } if (bIsFinished) { // using RemoveSwap rather than RemoveSingleSwap since a Task can be added // to KnownTasks both when activating as well as unpausing // while removal happens only once. It's cheaper to handle it here. KnownTasks.Remove(Task); } // Resource-using task if (Task.RequiresPriorityOrResourceManagement() && bIsFinished) { OnTaskEnded(Task); } if (!Task.IsOwnedByTasksComponent() && !Task.HasOwnerFinished()) { var TaskOwner = Task.GetTaskOwner(); TaskOwner.OnGameplayTaskDeactivated(Task); } UpdateShouldTick(); }
//处理 优先级 和 资源 /// <summary> /// 处理传入的task, 如果本task没有优先级或者资源依赖就不处理 /// </summary> public void AddTaskReadyForActivation(UGameplayTask NewTask) { if (!NewTask.RequiresPriorityOrResourceManagement()) { return; } var e = new FGameplayTaskEventData(EGameplayTaskEvent.Add, NewTask); TaskEvents.Add(e); // trigger the actual processing only if it was the first event added to the list if (TaskEvents.Count == 1 && CanProcessEvents()) { ProcessTaskEvents(); } }