재현 방법
BehaviorTreeComponent를 상속받아서 void UMDRBehaviorTreeComponent::PauseLogic(const FString& Reason)에 해당 코드를 추가 하였습니다.
for (int32 InstanceIndex = InstanceStack.Num() - 1; InstanceIndex >= 0; --InstanceIndex)
{
FBehaviorTreeInstance& InstanceInfo = InstanceStack[InstanceIndex];
for (int32 TaskIndex = InstanceInfo.ParallelTasks.Num() - 1; TaskIndex >= 0; --TaskIndex)
{
if (InstanceInfo.ParallelTasks.IsValidIndex(TaskIndex))
{
FBehaviorTreeParallelTask& ParallelTask = InstanceInfo.ParallelTasks[TaskIndex];
if (ParallelTask.Status == EBTTaskStatus::Active && !IsPauseSafeTask(ParallelTask.TaskNode))
{
ParallelTask.Status = EBTTaskStatus::Aborting;
uint8* NodeMemory = ParallelTask.TaskNode->GetNodeMemory<uint8>(InstanceInfo);
EBTNodeResult::Type TaskResult = ParallelTask.TaskNode->WrappedAbortTask(*this, NodeMemory);
if (ParallelTask.Status == EBTTaskStatus::Aborting)
{
InstanceInfo.ParallelTasks.RemoveAt(TaskIndex);
}
}
}
}
if (InstanceInfo.ActiveNodeType == EBTActiveNode::ActiveTask)
{
const UBTTaskNode* TaskNode = Cast<const UBTTaskNode>(InstanceInfo.ActiveNode);
if (TaskNode && !IsPauseSafeTask(TaskNode))
{
UnregisterMessageObserversFrom(TaskNode);
InstanceInfo.ActiveNodeType = EBTActiveNode::AbortingTask;
uint8* NodeMemory = TaskNode->GetNodeMemory<uint8>(InstanceInfo);
EBTNodeResult::Type TaskResult = TaskNode->WrappedAbortTask(*this, NodeMemory);
if (InstanceInfo.ActiveNodeType == EBTActiveNode::AbortingTask)
{
OnTaskFinished(TaskNode, TaskResult);
}
}
}
}