개발일지
08-28~ 08-29 버그수정, 이팩트 Sound작업
ksw8596
2024. 9. 2. 16:49
BP_EnemyCharacterBase.cpp
void AFEnemyCharacterBase::HitLogic()
{
AFEnemyAIController* EnemyController = Cast<AFEnemyAIController>(GetController());
if (EnemyController)
{
EnemyController->BrainComponent->RestartLogic();
}
}
void AFEnemyCharacterBase::DeathLogic()
{
AFEnemyAIController* EnemyController = Cast<AFEnemyAIController>(GetController());
if (EnemyController)
{
GetMovementComponent()->StopMovementImmediately();
//현재 BehaviorTree를 멈추고
EnemyController->BrainComponent->StopLogic("");
EnemyController->BrainComponent->PauseLogic("");
//Controller에 할당된 Focus를 초기화
EnemyController->ClearFocus(EAIFocusPriority::Gameplay);
}
}
======================생략===========================
void AFEnemyCharacterBase::OnHealthChanged(AActor* InstigatorActor, UFAttributeComponent* OwningComp, float Delta, float NewHealth)
{
AFEnemyAIController* EnemyController = Cast<AFEnemyAIController>(GetController());
if (bDeath)
{
return;
}
int32 RevivalCount = AttributeComp->CharacterStatusInfo.RevivalCount;
//AISense에 데미지 받은 것을 알림
UAISense_Damage::ReportDamageEvent(GetWorld(), InstigatorActor, UGameplayStatics::GetPlayerCharacter(GetWorld(), 0), Delta, InstigatorActor->GetActorLocation(), GetActorLocation());
if (AttributeComp->IsAlive())
{
//Super Armor상태가 아니면
if (!bSuperArmor)
{
//GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red, TEXT("SuperArmor Off"));
if(EnemyController)
{
GetMovementComponent()->StopMovementImmediately();
ActionComp->StopAllActions(this);
EnemyController->BrainComponent->StopLogic("");
}
Hit();
FTimerHandle TimerHandle;
GetWorldTimerManager().SetTimer(TimerHandle, this, &AFEnemyCharacterBase::HitLogic, 1.0f, false);
}
if (ActivatedHealthUI == nullptr)
{
ActivatedHealthUI = CreateWidget<UFEnemyHealthUI>(GetWorld(), HealthUI);
if (ActivatedHealthUI)
{
ActivatedHealthUI->AttachedActor = this;
ActivatedHealthUI->AddToViewport();
}
}
if (ActivatedHealthUI)
{
HealthRatio = AttributeComp->GetCurrentHealth() / AttributeComp->GetMaxHealth();
ActivatedHealthUI->HealthBar->SetPercent(HealthRatio);
}
}
else if (!AttributeComp->IsAlive() && RevivalCount > 0)
{
return;
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 3.0f, FColor::Red, TEXT("Death"));
DeathLogic();
bDeath = true;
ActionComp->StopAllActions(this);
//Death Animation
if (bBoom)
{
//이팩트
ActionComp->StartActionByName(this, "BoomTimer");
FTimerHandle EnemyTimer;
//죽음
GetWorldTimerManager().SetTimer(EnemyTimer, this, &AFEnemyCharacterBase::Death, BoomTimer, false);
}
else
{
Death();
}
if (ActivatedHealthUI)
{
ActivatedHealthUI->RemoveFromParent();
}
}
}
버그 : hit상태일때 공격 Action이 그대로 실행되는 현상 발생, Death시 hit 및 공격 Action이 발동되는 상태가 나타났다.
Hit 당했을때
-ActionComponent에 있는 StopAllActions을 실행하여 현재 실행중인 Action을 중단시키고
-AIController에 있는 BrainComponent에 StopLogic으로 현재 로직을 멈추고
-1초뒤 RestartLogic을 사용하여 Tree가 재실행 될 수 있도록 하였다.
Death상태일 때
-현재 로직 전부를 멈추고
-StopLogic, PauseLogic을 사용하여 Tree를 멈추고
-ClearFocus를 통해 Focus또한 초기화 시켜준다.
-StopAllActions을 실행하여 현재 실행중인 Action을 전부 중단시킨다.
BT_Boss
위 Selector의 조건은 삭제되었다.
- Both로 바로 패턴으로 넘어가게 하려했으나, 중간에 끈키는 버그가 발견되어 조건을 삭제하였다.



Effect 및 Sound작업은 생략한다.