C++와 Unreal Engine으로 3D 게임 개발 팀프로젝트

드롭 아이템 획득 기준으로 적 처지 / 도자기 파괴 가 있다.
그래서 총을 통해 물체가 파괴되도록 Chaos destruction로 구현해보았다.
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/destruction-quick-start
디스트럭션 퀵스타트 | 언리얼 엔진 5.7 문서 | Epic Developer Community
언리얼 엔진 디스트럭션 시스템 퀵스타트 가이드
dev.epicgames.com
먼저 프랙처 모드(Fracture Mode) 에서 지오메트리 컬렉션(Geometry Collection)을 생성한다.

균등(Uniform)으로 프랙처 해준다.
아래 영상을 따라하면 Play시 바로 파괴되면서 효과까지 연출 할 수 있다.

Damage Threshold 이 낮으면 바닥에 닿으면서 부서진다.. 적절하게 조절하자.
하지만 지금 필요한건 총에 히트 판정이 나면 물체가 파괴되어야한다.

간단한 구현을 위해 GC를 BP 클래스로 만들었다.




많은 시행착오...
위 영상을 응용해서 데미지가 들어가면 파괴되도록 하려고 했으나 파괴되지않았다.
성공한 방법은 해당 영상을 참고했다. 아주 쉽게 잘 설명이 되어있다 👍
이는 필드 블루프린트를 사용하는 방법이다.

- FS_MasterField: 가장 핵심적인 에셋. 물리 시스템에서 발생하는 다양한 힘(Radial Falloff, Magnitude 등)을 종합적으로 조절하는 마스터 컨트롤러 역할.
- FS_RadialField: 원형(구체) 범위 내에 힘을 가함. 폭발 시 물체가 사방으로 밀려나가는 충격파를 구현할 때 주로 사용.
- FS_AnchorField_Generic: 파괴 가능한 물체의 특정 부분을 고정(Anchor)하는 데 사용. 예를 들어, 건물이 무너질 때 바닥과 닿은 부분은 고정되어 공중에 뜨지 않게 잡아주는 역할.
- FS_BombField_Prototype: 이름에서 알 수 있듯 폭발(Bomb) 효과를 테스트하기 위한 프로토타입.
- FS_SleepDisable_Generic: 물리 연산 최적화를 위해 사용. 특정 영역 안에 있는 물체의 물리 시뮬레이션을 잠재우거나(Sleep) 비활성화하여 CPU 부하를 줄임.
- FS_BaseField: 다른 필드들이 공통적으로 사용하는 부모 클래스이거나, 가장 기본적인 설정을 담고 있는 기초 필드.
라고 한다.
아무튼 AnchorField는 특정부분을 고정하여 파괴를 막아주는 역할,
MasterField는 해당 부분을 파괴시키는 역할 정도로 이해했다.
void ASanzoWeaponBase::ApplyDamageToTarget(AActor* TargetActor, FHitResult HitInfo, float DamageToApply)
{
if (!TargetActor) return;
// 맞은 대상이 SanzoEnemyBase 클래스인지 확인용
ASanzoEnemyBase* HitEnemy = Cast<ASanzoEnemyBase>(TargetActor);
float FinalDamage = DamageToApply;
// 맞은 액터가 SanzoEnemyBase가 맞다면 데미지 적용
if (HitEnemy)
{
if (HitInfo.BoneName == HeadBoneName)
{
FinalDamage *= HeadshotMultiplier;
}
APawn* OwnerPawn = Cast<APawn>(GetOwner());
if (!OwnerPawn) return;
AController* OwnerController = OwnerPawn->GetController();
UGameplayStatics::ApplyDamage(
TargetActor,
FinalDamage,
OwnerController,
this,
UDamageType::StaticClass()
);
}
#pragma region DestructibleItem
// 부숴지는 물체 태그 확인
else if (TargetActor->ActorHasTag(FName("Destructible")))
{
APawn* OwnerPawn = Cast<APawn>(GetOwner());
AController* OwnerController = OwnerPawn ? OwnerPawn->GetController() : nullptr;
// 데미지 전달
UGameplayStatics::ApplyDamage(TargetActor, FinalDamage, OwnerController, this, UDamageType::StaticClass());
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, TEXT("WB: Hit Destructible Object"));
}
#pragma endregion Yoon
if (HitEnemy)
{
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, TEXT("Hit Enemy"));
}
}
팀원이 구현한 무기의 데미지 판정은 Enemy class 판정을 하여 ApplyDamage를 주는 방식이다.
그래서 파괴해야하는 물체에 "Destructible" 태그를 붙여 판정을 할 수 있도록 코드를 추가했다.

그리고 BP에서 물체에 데미지 이벤트가 실행되면 FS Master Field 가 스폰되어 파괴가 실행되도록 했다.
부숴지면서 파티클과 효과음이 재생되고 2초 후 물체는 사라지도록 했다.
FS Master Field 는 기본 셋팅이 1초 후 실행이라 바로 파괴될 수 있도록 Delay Amount를 0으로 값을 수정해준다.
그리고 플레이어의 몸통 박치기로 부숴지지 않도록 Damage Threshold 값도 높게 잡아줬다.
그럼 총으로 물체 파괴 끝!

'내배캠Unreal_TIL > 팀프로젝트' 카테고리의 다른 글
| [TIL] 2026-02-27 | Nav Mesh 계단 처리하기 (0) | 2026.02.27 |
|---|---|
| [TIL] 2026-02-25 | 오늘의 실수 (0) | 2026.02.25 |
| [TIL] 2026-02-20 | 전투 흐름 (0) | 2026.02.21 |
| [TIL] 2026-02-20 | 레벨 최적화 (2) | 2026.02.20 |
| [TIL] 2026-02-12 | 협업하기 (0) | 2026.02.12 |