Basic AI + Networking Challenge: C++/Blueprints

Basic AI + Networking Challenge: C++/Blueprints

Basic AI + Networking Challenge: C++/Blueprints

Basic AI + Networking Challenge: C++/Blueprints es el octavo 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 se ha implementado un pequeño robot que busca al jugador con funciones de pathfinder de UE4 y se mueve aplicandole fuerza. Las principales características del bot son:

  • Cuando está cerca del jugador explota.
  • La explosión se ve amplificada si hay cerca más bots.
  • Se produce un cambio a nivel visual ya que al haber más bots cerca además de aplicar más daño se iluminan en rojo.
  • Se pueden destruir disparándoles.
  • Se aplica un impulso radial a los elementos físicos cercanos.
  • El sonido de rodamiento se amplifica utilizando la velocidad del objeto dándo la sensación de que para y empieza a sonar al moverse.

Destacado .h

// Next point in navigation path
FVector NextPathPoint;

void SelfDesctruct();

void DamageSelf();

// Find nearby enemies and grow in 'power level' based on the amount
void onCheckNearbyBots();

// The power boost of the bot, affects damged caused to enemies and color of the bot (range: 1 to 4)
int32 PowerLevel;

Destacado .cpp

// Called when the game starts or when spawned
void ASTrackerBot::BeginPlay()
{
  Super::BeginPlay();

  MatInst = MeshComp->CreateAndSetMaterialInstanceDynamicFromMaterial(0, MeshComp->GetMaterial(0));

  FTimerHandle TimerHandle_CheckPowerLevel;
  GetWorldTimerManager().SetTimer(TimerHandle_CheckPowerLevel, this, &ASTrackerBot::onCheckNearbyBots, 1.0f, true);

  if (Role == ROLE_Authority)
  {
    // Find initial move to
    NextPathPoint = GetNextPathPoint();
  }
}

void ASTrackerBot::onCheckNearbyBots()
{

  TArray<AActor*> OverlapingBots;
  SphereNearBotComp->GetOverlappingActors(OverlapingBots);


  //if (DebugTrackerBotDrawing > 0) UE_LOG(LogTemp, Log, TEXT("Nearby bots: BotName= %s - NearbyBots=%s"), *GetName(), *FString::SanitizeFloat(OverlapingBots.Num()));

  int32 NrOfBots = OverlapingBots.Num();
  const int32 MaxPowerLevel = 4;
  PowerLevel = FMath::Clamp(NrOfBots, 0, MaxPowerLevel);

  float Alpha = PowerLevel / (float)MaxPowerLevel;

  if (MatInst) {
    MatInst->SetScalarParameterValue("PowerLevelAlpha", Alpha);
  }
}

void ASTrackerBot::SelfDesctruct()
{
  if (bExploded)
  {
    return;
  }

  bExploded = true;

  UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ExplosionEffect, GetActorLocation());

  UGameplayStatics::PlaySoundAtLocation(this, ExplodeSound, GetActorLocation());

  MeshComp->SetVisibility(false,true);
  MeshComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);

  if (Role == ROLE_Authority)
  {

    // Apply Damage!
    if (DebugTrackerBotDrawing > 0) UE_LOG(LogTemp, Log, TEXT("Execute destruction,Base %s - PowerLevelUp : %s"), *FString::SanitizeFloat(ExplosionDamage), *FString::SanitizeFloat(PowerLevel));
    
    TArray<AActor*> IgnoredActors;
    IgnoredActors.Add(this);
    float FinalDamage = ExplosionDamage + (ExplosionDamage * PowerLevel);
    UGameplayStatics::ApplyRadialDamage(this, FinalDamage, GetActorLocation(), ExplosionRadius, nullptr, IgnoredActors, this, GetInstigatorController(), true);
    
    RadialForceComp->FireImpulse();

    // Delete Actor inmediately
    SetLifeSpan(2.0f);

    if (DebugTrackerBotDrawing > 0)DrawDebugSphere(GetWorld(), GetActorLocation(), ExplosionRadius, 12, FColor::Red, false, 2.0f, 0, 1.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: Basic AI + Networking Challenge: C++/Blueprints [project]

Demo: Basic AI + Networking Challenge: C++/Blueprints [demo]

Curso: Unreal Engine 4 Mastery: Create Multiplayer Games with C++