PART 1 · 강의 3/3

Physics Asset 설정

Skeletal Mesh를 위한 Physics Asset 구성과 Body Setup의 이해

01

Physics Asset이란

Skeletal Mesh의 물리적 표현

Physics Asset (UPhysicsAsset)은 Skeletal Mesh의 각 본(Bone)에 대응하는 물리 바디(Physics Body)와 그 사이의 구속 조건(Constraint)을 정의하는 에셋입니다. 래그돌, 충돌 감지, Physical Animation 등 Skeletal Mesh의 모든 물리 상호작용에 사용됩니다.

Physics Asset 구성 요소
  • Physics Body (UBodySetup) — 각 본에 부착된 콜리전 형상. Sphere, Capsule, Box, Convex Hull 등을 사용합니다.
  • Physics Constraint (UPhysicsConstraintTemplate) — 인접한 바디 간의 관절 제약. 회전 범위, 모터 등을 설정합니다.
  • Physics Profile — 여러 바디의 물리 속성(질량, 감쇠 등)을 프로파일로 묶어 관리합니다.
자동 생성

Skeletal Mesh를 임포트할 때 UE5가 자동으로 Physics Asset을 생성합니다. 하지만 자동 생성된 바디는 보통 최적화되지 않았으므로, 프로덕션에서는 수동으로 조정해야 합니다.

02

Body Setup과 콜리전 형상

UBodySetup의 구조와 형상 선택 기준

각 Physics Body는 UBodySetup으로 정의되며, 하나 이상의 콜리전 형상을 포함합니다. 형상 선택은 정확도와 성능 사이의 트레이드오프입니다.

형상 성능 정확도 적합한 본
Sphere 매우 빠름 낮음 머리, 관절
Capsule 빠름 중간 팔, 다리, 몸통
Box 빠름 중간 상자형 부위, 무기
Convex Hull 보통 높음 복잡한 형상의 방어구, 소품
Tapered Capsule 빠름 중간~높음 허벅지 등 테이퍼 형상
C++ - Physics Asset에서 바디 정보 접근
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를 사용하는 것이 좋습니다. 손가락 관절마다 바디를 추가하면 정밀하지만 성능 비용이 큽니다. 중요하지 않은 본은 바디를 생략하고 부모 바디에 합칩니다.

03

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 기능으로 일괄 처리할 수 있습니다.

04

런타임에서 Physics Asset 제어

C++에서 개별 바디 시뮬레이션 제어하기

C++ - 런타임 Physics Asset 제어
// 래그돌 활성화 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 Profile 활용

Physics Asset 에디터에서 Physical Animation ProfileConstraint Profile을 미리 정의해두면, 런타임에서 프로파일 이름만으로 일괄 전환할 수 있습니다. 이는 Part 06 Physical Animation에서 자세히 다룹니다.

SUMMARY

핵심 요약

  • Physics Asset은 Skeletal Mesh의 물리적 표현으로, 본별 Physics Body와 Constraint로 구성됩니다.
  • UBodySetup은 각 바디의 콜리전 형상(Sphere, Capsule, Box, Convex)을 정의합니다.
  • 래그돌에서는 15~20개 이하의 바디를 권장하며, 인접 바디 간 충돌을 비활성화해야 안정적입니다.
  • SetAllBodiesBelowSimulatePhysics()로 특정 본 이하만 부분 래그돌을 적용할 수 있습니다.
  • Physics Asset 에디터에서 시뮬레이션 미리보기로 래그돌 동작을 실시간 확인할 수 있습니다.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Physics Asset 생성 및 편집

Skeletal Mesh를 임포트하고 Physics Asset을 자동 생성하세요. Physics Asset 에디터에서 각 본의 콜리전 바디(Sphere, Capsule, Box)를 수동으로 조정하고, 시뮬레이션 프리뷰로 래그돌 동작을 확인하세요.

실습 2: 부분 래그돌 구현

캐릭터의 상체만 래그돌을 적용하는 블루프린트를 만드세요. SetAllBodiesBelowSimulatePhysics를 사용하여 Spine 본 이상만 물리 시뮬레이션을 활성화하고, 하체는 애니메이션을 유지하세요.

심화 과제: Physics Profile 전환 시스템

3가지 Physics Profile(Normal, Injured, Dead)을 Physics Asset 에디터에서 정의하고, 게임플레이 상태에 따라 프로파일을 전환하는 시스템을 C++로 구현하세요.