AI Guard Patrol Challenge: C++/Blueprints
AI Guard Patrol Challenge: C++/Blueprints es el tercer reto propuesto por el curso Unreal Engine 4 Mastery: Create Multiplayer Games with C++ de Tom Looman certificado por Epic Games disponible en la plataforma Udemy.
A lo largo del curso se desarrollarán dos juegos con base en C++ y extendiendo la funcionalidad con Blueprints. Los dos juegos son multijugador y se profundizará también en AI y para reforzar los diferentes temas se proponen distintos retos.
En esta ocasión hay que prototipar en BP la patrulla del PNJ a lo largo del nivel para posteriormente implementarlo en C++. He planteado una función recursiva para patrullar entre puntos.
Cosas a destacar .h
class UPawnSensingComponent; UENUM(BlueprintType) enum class EAIState : uint8 { Idle, Suspicious, Alerted }; UPROPERTY(VisibleAnywhere, Category = "Components") UPawnSensingComponent* PawnSensingComp; UFUNCTION() void OnPawnSeen(APawn* SeenPawn); UFUNCTION() void OnNoiseHeard(APawn* NoiseInstigator, const FVector& Location, float Volumne); FRotator OriginalRotaiton; UFUNCTION() void ResetOrientation(); FTimerHandle TimeHandle_ResetOrientation; EAIState GuardState; void SetGuardState(EAIState NewState); UFUNCTION(BlueprintImplementableEvent, Category = "AI") void OnstateChanged(EAIState NewState); // Guards patrol UPROPERTY(EditDefaultsOnly, Category = "TargetClass") TSubclassOf TargetClass; TArray<AActor*> PatrolPoints; // Recursive iteration int ActualIteration; FTimerHandle TimeHandle_DoIteration; UFUNCTION() void ExecuteIteration(); bool bGameEnded;
Cosas a destacar .cpp
void AAIGuard::BeginPlay() { Super::BeginPlay(); OriginalRotaiton = GetActorRotation(); if (TargetClass) { UGameplayStatics::GetAllActorsOfClass(this, TargetClass, PatrolPoints); GetWorldTimerManager().SetTimer(TimeHandle_DoIteration, this, &AAIGuard::ExecuteIteration, 3.0f); } } void AAIGuard::OnPawnSeen(APawn * SeenPawn) { if (SeenPawn == nullptr) { return; } DrawDebugSphere(GetWorld(), SeenPawn->GetActorLocation(), 32.0f, 12, FColor::Red, false, 10.0f); AFPSGameMode* GM = Cast(GetWorld()->GetAuthGameMode()); if (GM) { GM->CompleteMission(SeenPawn, false); } SetGuardState(EAIState::Alerted); bGameEnded = true; } void AAIGuard::ExecuteIteration() { if (bGameEnded) { UE_LOG(LogTemp, Warning, TEXT("Last Iteration")); return; } UE_LOG(LogTemp, Warning, TEXT("Iteration")); if (PatrolPoints.Num() > 0) { UAIBlueprintHelperLibrary::SimpleMoveToLocation(GetController(), PatrolPoints[ActualIteration]->GetActorLocation()); if (PatrolPoints.Num() == (ActualIteration + 1)) { ActualIteration = 0; } else { ActualIteration += 1; } GetWorldTimerManager().ClearTimer(TimeHandle_DoIteration); GetWorldTimerManager().SetTimer(TimeHandle_DoIteration, this, &AAIGuard::ExecuteIteration, 3.0f); } }
A continuación os dejaré los enlaces al código, demo y al video en youtube para que podáis ver más. De momento me está gustando el curso pero al final compartiré una valoración general por si a alguien le pueda interesar que sepa más o menos que esperar del mismo.
Repositorio: AI Guard Patrol Challenge: C++/Blueprints [project]
Demo: AI Guard Patrol Challenge: C++/Blueprints [demo]
Curso: Unreal Engine 4 Mastery: Create Multiplayer Games with C++
Lvl 35 | #Porting #GameDev en Catness Game Studios | Ex #AI #GameDev en The Crown of Wu de Red Mountain | Padre de Baby T-Rex.