Physics Asset 설정
Skeletal Mesh를 위한 Physics Asset 구성과 Body Setup의 이해
Physics Asset이란
Skeletal Mesh의 물리적 표현
Physics Asset (UPhysicsAsset)은 Skeletal Mesh의 각 본(Bone)에 대응하는 물리 바디(Physics Body)와 그 사이의 구속 조건(Constraint)을 정의하는 에셋입니다. 래그돌, 충돌 감지, Physical Animation 등 Skeletal Mesh의 모든 물리 상호작용에 사용됩니다.
- Physics Body (UBodySetup) — 각 본에 부착된 콜리전 형상. Sphere, Capsule, Box, Convex Hull 등을 사용합니다.
- Physics Constraint (UPhysicsConstraintTemplate) — 인접한 바디 간의 관절 제약. 회전 범위, 모터 등을 설정합니다.
- Physics Profile — 여러 바디의 물리 속성(질량, 감쇠 등)을 프로파일로 묶어 관리합니다.
Skeletal Mesh를 임포트할 때 UE5가 자동으로 Physics Asset을 생성합니다. 하지만 자동 생성된 바디는 보통 최적화되지 않았으므로, 프로덕션에서는 수동으로 조정해야 합니다.
Body Setup과 콜리전 형상
UBodySetup의 구조와 형상 선택 기준
각 Physics Body는 UBodySetup으로 정의되며, 하나 이상의 콜리전 형상을 포함합니다. 형상 선택은 정확도와 성능 사이의 트레이드오프입니다.
| 형상 | 성능 | 정확도 | 적합한 본 |
|---|---|---|---|
| Sphere | 매우 빠름 | 낮음 | 머리, 관절 |
| Capsule | 빠름 | 중간 | 팔, 다리, 몸통 |
| Box | 빠름 | 중간 | 상자형 부위, 무기 |
| Convex Hull | 보통 | 높음 | 복잡한 형상의 방어구, 소품 |
| Tapered Capsule | 빠름 | 중간~높음 | 허벅지 등 테이퍼 형상 |
void AMyCharacter::InspectPhysicsAsset()
{
USkeletalMeshComponent* SkelMesh = GetMesh();
UPhysicsAsset* PhysAsset = SkelMesh->GetPhysicsAsset();
if (!PhysAsset) return;
// 모든 바디 순회
for (int32 i = 0; i < PhysAsset->SkeletalBodySetups.Num(); ++i)
{
UBodySetup* BodySetup = PhysAsset->SkeletalBodySetups[i];
FName BoneName = BodySetup->BoneName;
// 형상 정보 확인
int32 NumSpheres = BodySetup->AggGeom.SphereElems.Num();
int32 NumCapsules = BodySetup->AggGeom.SphylElems.Num();
int32 NumBoxes = BodySetup->AggGeom.BoxElems.Num();
int32 NumConvex = BodySetup->AggGeom.ConvexElems.Num();
UE_LOG(LogTemp, Log, TEXT("Bone: %s - Spheres:%d Capsules:%d Boxes:%d Convex:%d"),
*BoneName.ToString(), NumSpheres, NumCapsules, NumBoxes, NumConvex);
}
}
캐릭터 래그돌에서는 보통 15~20개 이하의 Physics Body를 사용하는 것이 좋습니다. 손가락 관절마다 바디를 추가하면 정밀하지만 성능 비용이 큽니다. 중요하지 않은 본은 바디를 생략하고 부모 바디에 합칩니다.
Physics Asset 에디터 활용
에디터에서 바디와 컨스트레인트 편집하기
Physics Asset 에디터는 Skeletal Mesh의 물리 바디를 시각적으로 편집할 수 있는 전용 도구입니다. Content Browser에서 Physics Asset을 더블클릭하면 열립니다.
- Body 추가/삭제 — 본 선택 후 우클릭으로 새 바디를 추가하거나 불필요한 바디를 삭제합니다.
- 형상 편집 — 바디의 크기, 위치, 회전을 직접 조절합니다. 복수의 형상을 조합할 수도 있습니다.
- Constraint 편집 — 두 바디 사이의 회전 제한, 트위스트 범위, 스윙 범위를 설정합니다.
- 시뮬레이션 미리보기 — 에디터에서 실시간으로 래그돌 시뮬레이션을 미리볼 수 있습니다.
- Collision 비활성화 — 인접한 바디 간의 충돌을 비활성화하여 자가 교차를 방지합니다.
| Body 속성 | 설명 | 래그돌 권장값 |
|---|---|---|
Physics Type |
Kinematic / Simulated / Default | Simulated (래그돌 시) |
Mass in Kg |
바디별 질량 | 몸통: 40, 팔: 5, 다리: 10 |
Linear Damping |
이동 감쇠 | 0.1 ~ 0.5 |
Angular Damping |
회전 감쇠 | 0.5 ~ 2.0 |
Collision Response |
충돌 반응 방식 | Block All Dynamic |
래그돌에서 인접한 바디(예: 상완-하완)끼리 충돌하면 불안정한 jitter가 발생합니다. Physics Asset 에디터에서 Collision 탭에서 인접 바디 간 충돌을 비활성화하세요. 에디터의 Disable Collision Below 기능으로 일괄 처리할 수 있습니다.
런타임에서 Physics Asset 제어
C++에서 개별 바디 시뮬레이션 제어하기
// 래그돌 활성화
void AMyCharacter::EnableRagdoll()
{
USkeletalMeshComponent* Mesh = GetMesh();
// 전체 바디 시뮬레이션 활성화
Mesh->SetAllBodiesSimulatePhysics(true);
Mesh->SetSimulatePhysics(true);
Mesh->SetAllBodiesPhysicsBlendWeight(1.0f);
// 캡슐 충돌 비활성화
GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
// 이동 컴포넌트 비활성화
GetCharacterMovement()->DisableMovement();
}
// 부분 래그돌 (특정 본 이하만 시뮬레이션)
void AMyCharacter::EnablePartialRagdoll(FName BoneName)
{
USkeletalMeshComponent* Mesh = GetMesh();
// 지정 본 이하 시뮬레이션 활성화
Mesh->SetAllBodiesBelowSimulatePhysics(
BoneName,
true, // bNewSimulate
true // bIncludeSelf
);
}
// 개별 바디 속성 변경
void AMyCharacter::SetBonePhysics(FName BoneName, float NewMass)
{
USkeletalMeshComponent* Mesh = GetMesh();
FBodyInstance* Body = Mesh->GetBodyInstance(BoneName);
if (Body)
{
Body->SetMassOverrideInKg(BoneName, NewMass, true);
Body->LinearDamping = 0.5f;
Body->AngularDamping = 1.0f;
Body->UpdateMassProperties();
}
}
Physics Asset 에디터에서 Physical Animation Profile과 Constraint Profile을 미리 정의해두면, 런타임에서 프로파일 이름만으로 일괄 전환할 수 있습니다. 이는 Part 06 Physical Animation에서 자세히 다룹니다.
핵심 요약
- Physics Asset은 Skeletal Mesh의 물리적 표현으로, 본별 Physics Body와 Constraint로 구성됩니다.
UBodySetup은 각 바디의 콜리전 형상(Sphere, Capsule, Box, Convex)을 정의합니다.- 래그돌에서는 15~20개 이하의 바디를 권장하며, 인접 바디 간 충돌을 비활성화해야 안정적입니다.
SetAllBodiesBelowSimulatePhysics()로 특정 본 이하만 부분 래그돌을 적용할 수 있습니다.- Physics Asset 에디터에서 시뮬레이션 미리보기로 래그돌 동작을 실시간 확인할 수 있습니다.
도전 과제
배운 내용을 직접 실습해보세요
Skeletal Mesh를 임포트하고 Physics Asset을 자동 생성하세요. Physics Asset 에디터에서 각 본의 콜리전 바디(Sphere, Capsule, Box)를 수동으로 조정하고, 시뮬레이션 프리뷰로 래그돌 동작을 확인하세요.
캐릭터의 상체만 래그돌을 적용하는 블루프린트를 만드세요. SetAllBodiesBelowSimulatePhysics를 사용하여 Spine 본 이상만 물리 시뮬레이션을 활성화하고, 하체는 애니메이션을 유지하세요.
3가지 Physics Profile(Normal, Injured, Dead)을 Physics Asset 에디터에서 정의하고, 게임플레이 상태에 따라 프로파일을 전환하는 시스템을 C++로 구현하세요.