0. 개요

몬스터가 AI에 의해 움직이면서 물약 병을 먹거나 화염 지대에 대미지를 입고 있다.

이펙트 액터를 수정하여 몬스터에게 작동하는지 여부를 선택할 수 있게 한다.

 

 

1. 몬스터를 부드럽게 돌리기

- BP_EnemyBase의 디테일 설정에서 컨트롤러 회전 요 사용 체크 해제

- 컨트롤러 선호 회전 사용 체크

위의 옵션을 C++에서도 설정 가능하다.

AAuraEnemy::AAuraEnemy()
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    bUseControllerRotationPitch = false;
    bUseControllerRotationRoll = false;
    bUseControllerRotationYaw = false;
    GetCharacterMovement()->bUseControllerDesiredRotation = true;

 

 

2. AuraEffectActor - 몬스터에 이펙트 액터를 적용?

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Applied Effects")
	bool bApplyEffectsToEnemy = false;

bApplyEffectsToEnemy 불리언을 이용해 해당 이펙트 액터를 몬스터에게도 적용시킬지 선택할 수 있게 한다.

void AAuraEffectActor::ApplyEffectToTarget(AActor *TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass)
{
	// 몬스터인지 확인
	if (TargetActor->ActorHasTag(FName("Enemy")) && !bApplyEffectsToEnemy)
		return;
void AAuraEffectActor::OnOverlap(AActor *TargetActor)
{
	// 몬스터인지 확인
	if (TargetActor->ActorHasTag(FName("Enemy")) && !bApplyEffectsToEnemy)
		return;
void AAuraEffectActor::OnEndOverlap(AActor *TargetActor)
{
	// 몬스터인지 확인
	if (TargetActor->ActorHasTag(FName("Enemy")) && !bApplyEffectsToEnemy)
		return;

게임플레이 이펙트 적용, 겹침 시작, 겹침 끝 판정에서 Enemy 태그와 불리언을 체크한다.

 

 

3. 게임플레이 이펙트 적용 시 바로 파괴

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Applied Effects")
	bool bDestroyOnEffectApplication = false;
void AAuraEffectActor::ApplyEffectToTarget(AActor *TargetActor, TSubclassOf<UGameplayEffect> GameplayEffectClass)
{
	// 몬스터인지 확인
	if (TargetActor->ActorHasTag(FName("Enemy")) && !bApplyEffectsToEnemy)
		return;
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	if (bDestroyOnEffectApplication && EffectSpecHandle.Data.Get()->Def.Get()->DurationPolicy == EGameplayEffectDurationType::Instant)
		Destroy();
}

해당 이펙트가 Instant 타입이고 bDestroyOnEffectApplication이 true이면 이펙트 적용 후 액터를 파괴한다.

 

 

4. EffectActor 블루프린트 수정

(1) BP_FireArea 화염지대에 몬스터도 체력을 잃게하기

 

 

(2) BP_HealthPotion, ManaPotion, HealthCrystal, ManaCrystal 설정

이제 파괴를 C++ 코드에서 수행하므로 해당 노드는 삭제한다.

이제 테스트를 하면 몬스터가 포션과 크리스탈을 획득하진 않지만 플레이어가 크리스탈을 획득해도 크리스탈이 파괴되지 않는 버그가 발생한다.

이는 크리스탈에 적용되는 게임플레이 이펙트가 Duration 타입이기 때문이다.

	if (bDestroyOnEffectApplication && EffectSpecHandle.Data.Get()->Def.Get()->DurationPolicy != EGameplayEffectDurationType::Infinite)
		Destroy();

Infinite 타입이 아닐때 파괴되도록 설정한다.