Neste artigo vamos adicionar uma contagem de hits à classe EnemyCannon. Quando o número de Hits alcançar um valor máximo especificado, a instância do EnemyCannon será destruída.
Usaremos duas variáveis inteiras. A NumHits armazenará o número de vezes que um EnemyCannon foi atingido e a MaxHits armazenará o número de hits necessário para destruir um EnemyCannon.
Usaremos o evento/função NotifyHit() para incrementar o NumHits. Este evento é chamado quando um EnemyCannon é atingido.
A destruição do canhão é feita pela função DestroyCannon(). Ela é uma UFUNCTION() do tipo BlueprintNativeEvent que permite uma implementação padrão em C++ que será usada se não for implementada a versão em Blueprint da função. Para mais informações sobre UFUNCTION(), acesse este link.
A 1ª versão do arquivo EnemyCannon.h foi criada neste link.
Adicione a declaração das novas variáveis e funções no arquivo EnemyCannon.h abaixo da função ShootCannon():
...
FTimerHandle ShotTimerHandle;
void ShootCannon();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Cannon)
int32 MaxHits;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = Cannon)
int32 NumHits;
UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = Cannon)
void DestroyCannon();
virtual void NotifyHit(class UPrimitiveComponent* MyComp, class AActor* Other,
class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation,
FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit) override;
};
O próximo passo é modificar o arquivo EnemyCannon.cpp que foi criado neste link.
No construtor, inicialize a variável MaxHits com o valor 5:
FireRate = 5.f;
MaxHits = 5;
Adicione a implementação das funções NotifyHit() e DestroyCannon_Implementation() no final do arquivo EnemyCannon.cpp:
void AEnemyCannon::NotifyHit(class UPrimitiveComponent* MyComp, class AActor* Other,
class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation,
FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit)
{
Super::NotifyHit(MyComp, Other, OtherComp, bSelfMoved, HitLocation, HitNormal,
NormalImpulse, Hit);
if (Cast<APlayerProjectile>(Other) != nullptr)
{
NumHits++;
if( NumHits == MaxHits )
{
DestroyCannon();
}
}
}
void AEnemyCannon::DestroyCannon_Implementation()
{
Destroy();
}
Na função NotifyHit() é usado um Cast<APlayerProjectile>(Other) porque só vamos contar um Hit se o EnemyCannon for atingido por um projétil do tipo APlayerProjectile (ou classes filhas).
Quando o valor da variável NumHits for igual à MaxHits, será chamada a função DestroyCannon().
Observe que a implementação da função DestroyCannon() tem o sufixo _Implementation. Este sufixo é necessário porque ela é uma BlueprintNativeEvent.