void UCrowdManager::RegisterAgent(ICrowdAgentInterface* Agent) { UpdateNavData(); FCrowdAgentData AgentData; #if WITH_RECAST if (DetourCrowd) { AddAgent(Agent, AgentData); } #endif ActiveAgents.Add(Agent, AgentData); }
void ANavigationTestingActor::UpdatePathfinding() { PathfindingTime = 0.0f; PathCost = 0.0f; bPathSearchOutOfNodes = false; bPathIsPartial = false; bPathExist = false; LastPath.Reset(); ShowStepIndex = -1; PathfindingSteps = 0; #if WITH_EDITORONLY_DATA DebugSteps.Reset(); #endif UpdateNavData(); if (bSearchStart == false && (OtherActor == NULL || OtherActor->bSearchStart == false)) { #if WITH_EDITORONLY_DATA if (EdRenderComp) { EdRenderComp->MarkRenderStateDirty(); } #endif // WITH_EDITORONLY_DATA return; } if (OtherActor == NULL) { ANavigationTestingActor* AlternativeOtherActor = NULL; for (TActorIterator<ANavigationTestingActor> It(GetWorld()); It; ++It) { ANavigationTestingActor* TestActor = *It; if (TestActor && TestActor != this) { if( TestActor->OtherActor == this ) { OtherActor = TestActor; break; } // the other one doesn't have anything set - potential end for us else if (bSearchStart && TestActor->OtherActor == NULL) { AlternativeOtherActor = TestActor; } } } // if still empty maybe AlternativeOtherActor can fill in if (OtherActor == NULL && AlternativeOtherActor != NULL) { OtherActor = AlternativeOtherActor; AlternativeOtherActor->OtherActor = this; } } if (OtherActor) { if (bSearchStart) { SearchPathTo(OtherActor); } else if (OtherActor) { OtherActor->SearchPathTo(this); } } }
void ANavigationTestingActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) { static const FName NAME_ShouldBeVisibleInGame = GET_MEMBER_NAME_CHECKED(ANavigationTestingActor, bShouldBeVisibleInGame); static const FName NAME_OtherActor = GET_MEMBER_NAME_CHECKED(ANavigationTestingActor, OtherActor); static const FName NAME_IsSearchStart = GET_MEMBER_NAME_CHECKED(ANavigationTestingActor, bSearchStart); static const FName NAME_InvokerComponent = GET_MEMBER_NAME_CHECKED(ANavigationTestingActor, InvokerComponent); Super::PostEditChangeProperty(PropertyChangedEvent); if (PropertyChangedEvent.Property) { const FName ChangedPropName = PropertyChangedEvent.Property->GetFName(); const FName ChangedCategory = FObjectEditorUtils::GetCategoryFName(PropertyChangedEvent.Property); if (ChangedPropName == GET_MEMBER_NAME_CHECKED(FNavAgentProperties,AgentRadius) || ChangedPropName == GET_MEMBER_NAME_CHECKED(FNavAgentProperties,AgentHeight)) { MyNavData = NULL; UpdateNavData(); CapsuleComponent->SetCapsuleSize(NavAgentProps.AgentRadius, NavAgentProps.AgentHeight/2); } else if (ChangedPropName == GET_MEMBER_NAME_CHECKED(ANavigationTestingActor,QueryingExtent)) { UpdateNavData(); FNavLocation NavLoc; bProjectedLocationValid = GetWorld()->GetNavigationSystem()->ProjectPointToNavigation(GetActorLocation(), NavLoc, QueryingExtent, MyNavData); ProjectedLocation = NavLoc.Location; } else if (ChangedPropName == NAME_ShouldBeVisibleInGame) { bHidden = !bShouldBeVisibleInGame; } else if (ChangedCategory == TEXT("Debug")) { #if WITH_EDITORONLY_DATA EdRenderComp->MarkRenderStateDirty(); #endif } else if (ChangedCategory == TEXT("Pathfinding")) { if (ChangedPropName == NAME_OtherActor) { if (OtherActor != NULL) { ANavigationTestingActor* OtherActorsOldOtherActor = OtherActor->OtherActor; OtherActor->OtherActor = this; bSearchStart = !OtherActor->bSearchStart; #if WITH_EDITORONLY_DATA if (bSearchStart) { OtherActor->EdRenderComp->MarkRenderStateDirty(); } else { EdRenderComp->MarkRenderStateDirty(); } #endif if (OtherActorsOldOtherActor) { OtherActorsOldOtherActor->OtherActor = NULL; OtherActorsOldOtherActor->LastPath.Reset(); #if WITH_EDITORONLY_DATA OtherActorsOldOtherActor->EdRenderComp->MarkRenderStateDirty(); #endif } } } else if (ChangedPropName == NAME_IsSearchStart) { if (OtherActor != NULL) { OtherActor->bSearchStart = !bSearchStart; } } UpdatePathfinding(); } else if (NAME_InvokerComponent == ChangedPropName) { InvokerComponent->SetActive(bActAsNavigationInvoker); } } }