0. 개요

몬스터가 몬스터 서로의 공격에 대해서 데미지를 받거나, 플레이어 캐릭터가 펫 또는 소환수에 데미지를 주는 것을 방지한다.

 

 

1. 아군 공격(Friendly Fire) 방지하기

(1) AuraAbilitySystemLibrary 클래스에 함수 선언

	// 프렌들리 파이어
	UFUNCTION(BlueprintPure, category = "AuraAbilitySystemLibrary|GameplayMechanics")
	static bool IsNotFriend(AActor* FirstActor, AActor* SecondActor);

블루프린트 순수 함수로 생성한다.

블루프린트 순수 함수는 실행핀이 없다.

bool UAuraAbilitySystemLibrary::IsNotFriend(AActor* FirstActor, AActor* SecondActor)
{
	const bool FirstIsPlayer = FirstActor->ActorHasTag(FName("Player"));
	const bool SecondIsPlayer = SecondActor->ActorHasTag(FName("Player"));
	const bool FirstIsEnemy = FirstActor->ActorHasTag(FName("Enemy"));
	const bool SecondIsEnemy = SecondActor->ActorHasTag(FName("Enemy"));

	const bool BothArePlayers = FirstIsPlayer && SecondIsPlayer;
	const bool BothAreEnemys = FirstIsEnemy && SecondIsEnemy;

	// 둘이 서로 같은 태그라면 프렌들리
	if (BothArePlayers || BothAreEnemys)
		return false;

	return true;
}

다음으로 축소하여 나타낼 수도 있다.

bool UAuraAbilitySystemLibrary::IsNotFriend(AActor* FirstActor, AActor* SecondActor)
{
	const bool bBothArePlayers = FirstActor->ActorHasTag(FName("Player")) && SecondActor->ActorHasTag(FName("Player"));
	const bool bBothAreEnemys = FirstActor->ActorHasTag(FName("Enemy")) && SecondActor->ActorHasTag(FName("Enemy"));

	// 둘이 서로 같은 태그라면 프렌들리
	if (bBothArePlayers || bBothAreEnemys)
		return false;

	return true;
}

 

 

(2) GA_MeleeDamage 블루프린트 이벤트 그래프 수정

두 액터를 비교하여 태그(액터별로 지정한 Player or Enemy 태그)가 다를 때만 데미지를 주도록 지정한다.

 

 

2. 구울에 디졸브 효과 추가

고블린에 대해서 디졸브 머티리얼 인스턴스는 이미 생성되어있었으나 다른 몬스터에 대해서는 생성되어있지 않다.

M_DissolveEffect의 머티리얼 그래프의 노드를 사용하여 구울의 Dissolve Effect를 만든다.

 

(1) M_DissolveEffect에서 복사해올 노드

코멘트를 통해 복사해야할 노드들과 어떤 핀에 연결해야하는지 적혀있다. 해당 노드들을 복사해서 M_Ghoul에 추가한다.

 

 

(2) M_Ghoul에서 머티리얼 디테일 설정

코멘트에 나와있는 것과 같이 설정한다.

 

(3) 머티리얼 인스턴스 생성

핀을 연결하고 머티리얼 인스턴스를 생성한다.

글로벌 스칼라 파라미터 값에 Dissolve를 체크하고 융화되기 전 모습의 값인 -2 정도로 지정한다.

 

 

(4) M_Ghoul에서 디졸브 기본 값 조정

Dissolve 노드의 디폴트 값을 조정한다.

 

 

(5) BP_Ghoul에서 디졸브 효과 추가하기

 

 

(번외) 몬스터가 서로 뭉치지 않게 하기

Strafe(옆으로 걷는 모션)이 있는 몬스터에 대해 RVO 회피를 사용하면 서로 피하면서 플레이어를 향해 다가간다.

이 기능은 서버에서만 작동하므로 AI에 적합하다.

그러나 Strafe 애니메이션이 없으면 다소 위화감있게 작동하므로 이 프로젝트에서는 다른 방법을 사용할 것이다.