void AEnemyBase::BeginPlay()
{
Super::BeginPlay();
EnemyController = Cast<AAIController>(GetController());
MoveToTarget(PatrolTarget);
if (PawnSensing)
{
PawnSensing->OnSeePawn.AddDynamic(this, &AEnemyBase::PawnSeen);
}
AttachDefaultWeapon();
}
void AEnemyBase::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (EnemyState > EEnemyState::EES_Patrolling)
{
CheckCombatTarget();
}
else
{
CheckPatrolTarget();
}
}
void AEnemyBase::PawnSeen(APawn* SeenPawn)
{
if (EnemyState == EEnemyState::EES_Chasing) return;
if (SeenPawn->ActorHasTag(FName("ShooterCharacter")))
{
EnemyState = EEnemyState::EES_Chasing;
GetCharacterMovement()->MaxWalkSpeed = 150.f;
MoveToTarget(SeenPawn);
UE_LOG(LogTemp, Warning, TEXT("Chasing U"));
}
}
void AEnemyBase::MoveToTarget(AActor* Target)
{
if (!IsValid(EnemyController) || !IsValid(Target)) return;
FAIMoveRequest MoveRequest;
MoveRequest.SetGoalActor(Target);
MoveRequest.SetAcceptanceRadius(15.f);
FNavPathSharedPtr NavPath;
EnemyController->MoveTo(MoveRequest, &NavPath);
TArray<FNavPathPoint> PathPoints = NavPath->GetPathPoints();
for (auto& Point : PathPoints)
{
const FVector& Location = Point.Location;
DrawDebugSphere(GetWorld(), Location, 12.f, 12, FColor::Green, false, 10.f);
}
}
bool AEnemyBase::InTargetRange(AActor* Target, double Radius)
{
const double DistanceToTarget = (Target->GetActorLocation() - GetActorLocation()).Size();
return DistanceToTarget <= Radius;
}
void AEnemyBase::CheckCombatTarget()
{
if (CombatTarget)
{
if (!InTargetRange(CombatTarget, CombatRadius))
{
CombatTarget = nullptr;
EnemyState = EEnemyState::EES_Patrolling;
GetCharacterMovement()->MaxWalkSpeed = 400.f;
MoveToTarget(PatrolTarget);
UE_LOG(LogTemp, Warning, TEXT("Shes Gone"));
}
else if (!InTargetRange(CombatTarget, AttackRadius) && EnemyState != EEnemyState::EES_Chasing)
{
EnemyState = EEnemyState::EES_Chasing;
GetCharacterMovement()->MaxWalkSpeed = 300.f;
MoveToTarget(CombatTarget);
UE_LOG(LogTemp, Warning, TEXT("Out OF Range"));
}
else if (InTargetRange(CombatTarget, CombatRadius) && EnemyState != EEnemyState::EES_Attacing)
{
EnemyState = EEnemyState::EES_Attacing;
UE_LOG(LogTemp, Warning, TEXT("ATK!"));
}
}
}
void AEnemyBase::CheckPatrolTarget()
{
if (InTargetRange(PatrolTarget, PatrolRadius) && EnemyController)
{
EnemyState = EEnemyState::EES_Patrolling;
FAIMoveRequest MoveRequest;
MoveRequest.SetGoalActor(PatrolTarget);
MoveRequest.SetAcceptanceRadius(15.f);
EnemyController->MoveTo(MoveRequest);
}
}