개발일지

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작업은 생략한다.