Explosive Barrel Challenge: C++/Blueprints

Explosive Barrel Challenge: C++/Blueprints

Explosive Barrel Challenge: C++/Blueprints

Explosive Barrel Challenge: C++/Blueprints es el sexto 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.

Antes de este reto y para complear el tema anterior sobre las armas se ha implementado un zoom pulsando el botón derecho del ratón, se ha añadido efecto de movimiento al disparar el arma, disparo automático, tipos de superficies y colisiones personalizadas para seleccionar el efecto que reproducir o el daño que hacer.

Se ha añadido un componente de salud al jugador y enlazado el evento para que cuando muera se reproduzca la animación de muerte además de añadir una pequeña UI estilo Gears of War para saber cuanto le queda de vida al jugador.

Para hacer el barril explosivo se ha reutilizado el componente de salud y:

  • Añadido el efecto de explosión.
  • Aplicado un impulso hacia arriba.
  • Cambiado el material de forma dinámica de rojo a negro.
  • Aplicado un impuslo radial de fuerza que afecta a los elementos que simulan físicas a su alrededor.

Destacado .h

UPROPERTY(VisibleAnywhere, Category = "Components")
UStaticMeshComponent* MeshComp;

UPROPERTY(VisibleAnywhere, Category = "Components")
URadialForceComponent* RadialForceComp;

UPROPERTY(EditDefaultsOnly, Category = "Effects")
UParticleSystem* BoomFX;

UPROPERTY(EditDefaultsOnly, Category = "Effects")
UMaterialInstanceDynamic* DynamicMaterial;

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Components")
USHealthComponent* HealthComp;

/* Barrel use previously */
UPROPERTY(BlueprintReadOnly, Category = "Player")
bool bUse;

UFUNCTION()
void OnHealthChanged(USHealthComponent* OwningHealthComp, float Health, float HealthDelta, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);

Destacado .cpp

void AExplosiveBarrel::OnHealthChanged(USHealthComponent * OwningHealthComp, float Health, float HealthDelta, const UDamageType * DamageType, AController * InstigatedBy, AActor * DamageCauser)
{
  if (Health <= 0.0f && !bUse)
  {
    // Die!
    bUse = true;
    UE_LOG(LogTemp, Log, TEXT("BOOM!!!"));
    UGameplayStatics::SpawnEmitterAtLocation(this, BoomFX, GetActorLocation());
    RadialForceComp->FireImpulse();
    MeshComp->AddImpulse(FVector(0, 0, 600), NAME_None, true);
    DynamicMaterial->SetVectorParameterValue("WallColor",FLinearColor::Black);
    DynamicMaterial->SetVectorParameterValue("FloorColor", FLinearColor::Black);
  }
}

Destacado .h

// On Health Change Event
DECLARE_DYNAMIC_MULTICAST_DELEGATE_SixParams(FOnHealthChangedSignature, USHealthComponent*, HealthComp, float, Health, float, HealthDelta, const class UDamageType*, DamageType, class AController*, InstigatedBy, AActor*, DamageCauser);

UFUNCTION()
void HandleTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser);

UPROPERTY(BlueprintAssignable, Category = "Events")
FOnHealthChangedSignature OnHealthChanged;

Destacado .cpp

// Called when the game starts
void USHealthComponent::BeginPlay()
{
  Super::BeginPlay();

  AActor* MyOwner = GetOwner();

  if (MyOwner)
  {
    MyOwner->OnTakeAnyDamage.AddDynamic(this, &USHealthComponent::HandleTakeAnyDamage);
  }
  
  Health = DefaultHealth;
}

void USHealthComponent::HandleTakeAnyDamage(AActor* DamagedActor, float Damage, const class UDamageType* DamageType, class AController* InstigatedBy, AActor* DamageCauser)
{
  if (Damage <= 0.0f)
  {
    return;
  }

  // Update Health Clamped
  Health = FMath::Clamp(Health - Damage, 0.0f, DefaultHealth);

  UE_LOG(LogTemp, Log, TEXT("Health Changed: %s"), *FString::SanitizeFloat(Health));

  OnHealthChanged.Broadcast(this, Health, Damage, DamageType, InstigatedBy, DamageCauser);
}

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: Explosive Barrel Challenge: C++/Blueprints [project]

Demo: Explosive Barrel Challenge: C++/Blueprints [demo]

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