Why does the dynamic OnComponentBeginOverlop doen't fire sometimes?

Hallo together, I have a weird problem with the OnComponentBeginOverlap.AddDynamic… I want to shoot projectiles to a specific target. The projectile should follow the target and when it hits it it gets some damage. The way I have implemented this seems to work fine, if there weren’t some projectiles (1 of 30) moving forward and backward inside the target npc in rare cases, which means that the beginoverlap didn’t fire.

Perhaps someone can help me. That’s the way I implemented this:

.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameFramework/Actor.h"
#include "NPC.h"
#include "Projectile.generated.h"

UCLASS()
class EPICDEFENSE_API AProjectile : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AProjectile(const FObjectInitializer& ObjectInitializer);

	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
	
	// Called every frame
	virtual void Tick( float DeltaSeconds ) override;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProjectilePropoerties")
	USphereComponent* rangeSphere;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProjectilePropoerties")
	float range = 17;
	UPROPERTY(EditAnywhere,BlueprintReadWrite, Category = "ProjectilePropoerties")
	ANPC* target;
	void setTarget(ANPC* Target);
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProjectilePropoerties")
	float speed = 700.f;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "ProjectilePropoerties")
	float impactDamage = 50;

	/** called when something enters the sphere component */
	UFUNCTION()
		void OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

	/** called when something leaves the sphere component */
	UFUNCTION()
		void OnOverlapEnd(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
};

.cpp

// Fill out your copyright notice in the Description page of Project Settings.

#include "EpicDefense.h"
#include "Kismet/KismetMathLibrary.h"
#include "Projectile.h"


// Sets default values
AProjectile::AProjectile(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	//Initalize Range Sphere
	rangeSphere = ObjectInitializer.CreateDefaultSubobject<USphereComponent>(this, TEXT("rangeSphere"));
	rangeSphere->AttachTo(RootComponent);
	rangeSphere->SetSphereRadius(range);
	rangeSphere->OnComponentBeginOverlap.AddDynamic(this, &AProjectile::OnOverlapBegin);   // set up a notification for when this component overlaps something
	rangeSphere->OnComponentEndOverlap.AddDynamic(this, &AProjectile::OnOverlapEnd);       // set up a notification for when this component overlaps something
}

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

// Called every frame
void AProjectile::Tick( float DeltaTime )
{
	Super::Tick( DeltaTime );
	if (IsValid(target)) {
		//Move Projectile towards target
		bool result = SetActorLocation(GetActorLocation() + DeltaTime*speed*(target->GetActorLocation() - GetActorLocation())   / (target->GetActorLocation() - GetActorLocation()).Size());
		//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, result ? TEXT("True") : TEXT("False"));
		//rotate projectile
		SetActorRotation(UKismetMathLibrary::MakeRotFromX(target->GetActorLocation() - this->GetActorLocation()));
	}
	else {
		this->Destroy();
	}
}

void AProjectile::setTarget(ANPC* Target) {
	target = Target;
}


void AProjectile::OnOverlapBegin(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) {
	ANPC* npc = Cast<ANPC>(OtherActor);
	
	if (npc && npc == target && OtherActor && OtherComp && (OtherActor != this)) {
		//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, npc->GetName());
		npc->dealDamage(impactDamage);
		//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, TEXT("got hit"));
	}
}

void AProjectile::OnOverlapEnd(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex) {

}