바닥에 빠지는 함정을 만들기 위해 디스트럭터블 메시를 이용해봤습니다.
원하는 스태틱 메시를 우클릭하여 디스트럭터블 메시 생성을 합니다.
프랙처 세팅에 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인 반대 방향을 주어야 합니다.
'게임 개발 (언리얼 엔진)' 카테고리의 다른 글
UE4 게임 개발 EscapeGame - 8 : 애니메이션 블루프린트와 재질기반사운드 (0) | 2020.12.07 |
---|---|
UE4 게임 개발 EscapeGame - 7 : 카메라쉐이크(CameraShake) (0) | 2020.12.04 |
UE4 게임 개발 EscapeGame - 5 : 트리거 클래스 구성 (0) | 2020.11.26 |
UE4 게임 개발 EscapeGame - 4 : 트리거 활용 (0) | 2020.11.23 |
UE4 게임 개발 EscapeGame - 3 : TriggerBox와 BeginOverlap/EndOverlap (0) | 2020.11.12 |