파괴 이벤트와 필드
Field System으로 파괴를 제어하고, 이벤트로 게임 로직을 연결하기
Field System 개요
물리 영향력 필드로 파괴 제어하기
Field System은 공간에 물리적 영향력을 정의하는 시스템입니다. 폭발, 바람, 앵커, 비활성화 등 다양한 필드를 배치하여 Geometry Collection의 파괴를 정밀하게 제어할 수 있습니다.
| Field 유형 | 클래스 | 효과 |
|---|---|---|
| External Strain | URadialFalloff | 방사형으로 Strain(응력)을 적용하여 파괴 유발 |
| Linear Force | UUniformVector | 균일한 방향 힘 (바람, 폭풍) |
| Radial Force | URadialVector | 중심에서 방사형 힘 (폭발) |
| Disable | URadialIntMask | 영역 내 파편 비활성화/제거 |
| Anchor | UAnchorField | 파편을 공간에 고정 |
| Kill | UKillField | 영역 내 파편 즉시 제거 |
// Field System 액터를 사용한 폭발 구현
UCLASS()
class AExplosionField : public AFieldSystemActor
{
GENERATED_BODY()
public:
AExplosionField()
{
// Radial Falloff: 중심에서 멀어질수록 감소하는 Strain
RadialFalloff = CreateDefaultSubobject<URadialFalloff>("RadialFalloff");
RadialFalloff->Magnitude = 1500.0f; // Strain 강도
RadialFalloff->MinRange = 0.0f;
RadialFalloff->MaxRange = 500.0f; // 영향 반경
RadialFalloff->Default = 0.0f;
RadialFalloff->Radius = 500.0f;
RadialFalloff->Falloff = EFieldFalloffType::Field_FallOff_Linear;
// Radial Vector: 방사형 힘
RadialVector = CreateDefaultSubobject<URadialVector>("RadialVector");
RadialVector->Magnitude = 8000.0f; // 힘의 크기
}
void TriggerExplosion()
{
// 메타 데이터를 통해 필드 적용 대상 지정
GetFieldSystemComponent()->ApplyStrain(RadialFalloff);
GetFieldSystemComponent()->ApplyExternalForce(RadialVector);
}
};
Chaos 이벤트 시스템
Breaking, Collision, Trailing, Removal 이벤트
Chaos Destruction은 네 가지 주요 이벤트를 제공합니다. 이벤트를 게임 로직, 이펙트, 사운드와 연결하여 풍부한 파괴 연출을 만듭니다.
| 이벤트 | 델리게이트 | 발생 시점 | 제공 정보 |
|---|---|---|---|
| Break | OnChaosBreakEvent | 파편이 클러스터에서 분리될 때 | 위치, 속도, 질량, 크기 |
| Collision | OnChaosPhysicsCollision | 파편이 다른 물체와 충돌할 때 | 위치, 법선, 임펄스, 속도 |
| Trailing | OnChaosTrailingEvent | 파편이 이동할 때 (궤적) | 위치, 속도, 각속도 |
| Removal | OnChaosRemovalEvent | 파편이 제거될 때 | 위치, 질량 |
void ADestructibleBuilding::BeginPlay()
{
Super::BeginPlay();
UGeometryCollectionComponent* GC = GetGCComponent();
// Breaking 이벤트
GC->OnChaosBreakEvent.AddDynamic(this, &ADestructibleBuilding::HandleBreak);
// Collision 이벤트 (파편 충돌)
GC->OnChaosPhysicsCollision.AddDynamic(this, &ADestructibleBuilding::HandleCollision);
// Removal 이벤트 (파편 제거)
GC->OnChaosRemovalEvent.AddDynamic(this, &ADestructibleBuilding::HandleRemoval);
}
void ADestructibleBuilding::HandleBreak(const FChaosBreakEvent& Event)
{
// 파편 크기에 따라 다른 이펙트
if (Event.Mass > 100.0f)
{
// 큰 파편: 먼지 구름 + 카메라 쉐이크
UGameplayStatics::SpawnEmitterAtLocation(
GetWorld(), LargeDustFX, Event.Location
);
UGameplayStatics::PlayWorldCameraShake(
GetWorld(), HeavyShake, Event.Location, 500.0f, 2000.0f
);
}
else
{
// 작은 파편: 가벼운 먼지
UGameplayStatics::SpawnEmitterAtLocation(
GetWorld(), SmallDustFX, Event.Location
);
}
// 사운드 재생 (질량 기반 볼륨)
float Volume = FMath::Clamp(Event.Mass / 200.0f, 0.1f, 1.0f);
UGameplayStatics::PlaySoundAtLocation(
GetWorld(), BreakSound, Event.Location, Volume
);
}
Anchor Field와 구조적 무결성
고정점 기반의 현실적 파괴 시뮬레이션
Anchor Field는 파편을 공간에 고정시키는 필드입니다. 건물의 기초, 벽의 하단 등을 앵커로 설정하면, 앵커된 파편과 연결된 클러스터만 유지되고 나머지는 중력에 의해 떨어지는 구조적 무결성(Structural Integrity) 시뮬레이션이 가능합니다.
- 건물 벽 — 바닥에 닿는 부분을 Anchored로 설정. 중간을 파괴하면 위쪽이 무너짐.
- 다리 — 양쪽 끝을 Anchored. 중앙을 파괴하면 지지력을 잃고 붕괴.
- 천장 — 기둥과 연결된 부분을 Anchored. 기둥 파괴 시 천장 붕괴.
- 나무 — 뿌리 부분을 Anchored. 줄기를 파괴하면 위쪽이 넘어짐.
Fracture Mode 에디터에서 개별 bone을 선택한 후, Initial Dynamic State를 Anchored로 변경하면 됩니다. 또는 Selection > Set Initial Dynamic State 메뉴에서 일괄 설정할 수 있습니다.
파괴 최적화 전략
대규모 파괴에서 성능 유지하기
| 최적화 기법 | 설정 | 효과 |
|---|---|---|
| 파편 수명 제한 | Removal > Max Cluster Level / Removal Timer | 오래된 파편 자동 제거 |
| 크기 기반 제거 | Removal > Min Size | 작은 파편 즉시 제거 |
| 거리 기반 비활성화 | Clustering > Max Cluster Level by Distance | 원거리에서 세밀한 파괴 비활성화 |
| Sleep 설정 | Physics > Sleep Threshold | 정지된 파편 시뮬레이션 중단 |
| Damage Threshold | Damage > Damage Threshold | 약한 충격은 무시 |
| Object Pool | C++ 커스텀 구현 | 파편 액터 재사용 |
화면에 동시에 존재하는 활성 파편 수가 1000개를 넘지 않도록 관리하세요. 콘솔 명령 stat Chaos로 현재 활성 파티클 수를 모니터링할 수 있습니다. 파편 수명을 3~5초로 제한하고, 페이드아웃 후 제거하는 것이 일반적입니다.
핵심 요약
- Field System은 공간에 물리적 영향력(Strain, Force, Anchor, Kill)을 정의하여 파괴를 제어합니다.
- Chaos는 Break, Collision, Trailing, Removal 네 가지 이벤트를 제공합니다.
- 이벤트의 질량/속도 정보를 활용해 파편 크기에 비례하는 이펙트와 사운드를 연출합니다.
- Anchor Field로 구조적 무결성 시뮬레이션을 구현합니다 (기둥 파괴 → 천장 붕괴).
- 파편 수명 제한, 크기 기반 제거, Sleep 등으로 대규모 파괴 성능을 관리합니다.
도전 과제
배운 내용을 직접 실습해보세요
Radial Falloff Field를 레벨에 배치하고 Geometry Collection과 연결하세요. Magnitude와 Radius를 조정하여 폭발 효과를 시뮬레이션하고, External Strain Field로 서서히 무너지는 구조물을 만드세요.
Geometry Collection의 OnChaosBreakEvent를 바인딩하여 파괴 시 파편 위치에 파티클 이펙트와 사운드를 생성하세요. 파편 크기에 따라 다른 강도의 이펙트가 재생되도록 구현하세요.
여러 Geometry Collection과 Field System을 조합하여 기둥 파괴 → 천장 낙하 → 벽 붕괴의 연쇄 파괴 시퀀스를 구현하세요. 카메라 셰이크와 먼지 파티클도 연동하세요.