게임 개발 (언리얼 엔진)

UE4 게임 개발 EscapeGame - 6 : 디스트럭터블 메시(Destructible Mesh)

종황이 2020. 12. 1. 01:37

바닥에 빠지는 함정을 만들기 위해 디스트럭터블 메시를 이용해봤습니다.

원하는 스태틱 메시를 우클릭하여 디스트럭터블 메시 생성을 합니다.

프랙처 세팅에 Cell Site Count와 Random Seed값을 조절하여 원하는 디스트럭터블 메시를 만들고, 꼭 디스트럭터블 세팅 탭의 Damage에 Enable Impact Damage를 true로 체크해줍니다.

프랙처 메시를 누르고, 폭발량을 조절해서 확인해보고 저장해줍니다.

월드에 배치하고 잘 동작하는지 확인해봅니다.

벽이나 일반 액터의 경우 플레이어가 닿았을 때, 제대로 적용되는걸 볼 수 있었습니다.

하지만 저는 바닥이 부숴져야하는데 바닥은 적용되지않았습니다. 이유를 생각해보니 힘의 방향때문인듯하여, TakeDamage 함수를 이용하기로 했습니다.

1. TakeDamage

// TriggerDestroy.cpp

void ATriggerDestroy::TriggerBeginOverlap(
	UPrimitiveComponent* OverlappedComponent,
	AActor* OtherActor,
	UPrimitiveComponent* OtherComp,
	int32 OtherBodyIndex,
	bool bFromSweep,
	const FHitResult& SweepResult)
{
	if (IsValid(DestroyPoint))
	{
		AMyPlayerController* Controller = Cast<AMyPlayerController>(DestroyPoint->GetWorld()->GetFirstPlayerController());

		if (IsValid(Controller))
		{
			FDamageEvent DamageEvent;
			DestroyPoint->TakeDamage(100.f, DamageEvent, Controller, DestroyPoint);
		}
	}
}

트리거와 오버랩이되면 DestroyPoint의 TakeDamage 함수를 호출해주었습니다.

하지만 여기서 또 한가지 문제가 발생했습니다. 로그를 찍어보니 함수 호출은 제대로 되었으나 데미지 전달이 안된듯합니다.

2. ApplyDamage

// ObstacleFloor.cpp

float AObstacleFloor::TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* DamageCauser)
{
	float fDamage = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
	
	if (IsValid(Mesh))
	{
		Mesh->ApplyDamage(DamageAmount, GetActorLocation(), FVector(0.f, 0.f, -1.f), 100.f);
	}

	return fDamage;
}

ApplyDamage 함수를 호출하여, 데미지를 적용해주니 드디어 디스트럭터블 메시가 깨진것을 확인할 수 있었습니다. 매개변수의 FVector Z값을 -1.f인 반대 방향을 주어야 합니다.