안동민 개발노트

본문 시작

물리 시뮬레이션 기본 제어

컴포넌트의 물리 시뮬레이션과 질량·재질을 설정하고 힘과 토크를 적용해 강체 움직임을 제어합니다.

지금까지 캐릭터 애니메이션, UI, AI, 게임플레이 프레임워크 등 게임의 핵심 요소를 다뤘습니다.

이번에는 게임 세계의 현실감과 몰입감을 높이는 물리(Physics)를 살펴봅니다.

언리얼 엔진은 강력한 물리 엔진을 내장하고 있어 오브젝트 충돌, 중력, 힘 적용 같은 현상을 손쉽게 시뮬레이션할 수 있습니다.

이번 장에서는 물리 시뮬레이션 기본 개념과, 액터/컴포넌트 수준에서 물리 동작을 제어하는 방법을 정리합니다.


물리 시뮬레이션이란 무엇인가?

물리 시뮬레이션(Physics Simulation)은 게임 내의 오브젝트들이 현실 세계의 물리 법칙(중력, 질량, 마찰, 충돌 등)에 따라 상호작용하도록 만드는 과정입니다.

이는 단순히 정해진 애니메이션을 재생하는 것을 넘어, 예측 불가능하고 동적인 상호작용을 가능하게 하여 게임 세계에 생동감을 부여합니다.

물리 시뮬레이션이 필요한 이유
  • 현실감 및 몰입감: 오브젝트들이 물리적으로 반응하면 게임 세계가 더욱 현실적이고 설득력 있게 느껴집니다. (예: 총에 맞은 적이 쓰러지는 방식, 폭발로 인해 오브젝트가 흩어지는 모습)
  • 게임플레이의 동적 변화: 미리 정의되지 않은 상호작용을 통해 매번 다른 게임플레이 경험을 제공합니다. (예: 특정 오브젝트를 밀어서 길을 막거나 새로운 경로를 만드는 퍼즐)
  • 제작 효율성: 모든 물리적 반응을 수동으로 애니메이션하거나 스크립팅할 필요 없이, 물리 엔진이 자동으로 처리해주므로 개발 시간을 절약할 수 있습니다.
  • 예측 불가능성 및 재미: 물리 기반의 상호작용은 때때로 예상치 못한 재미있는 상황을 만들어냅니다.

언리얼 엔진의 물리 엔진

언리얼 엔진의 물리 백엔드는 버전에 따라 다릅니다.

UE4 계열은 주로 NVIDIA의 PhysX를 사용했고, UE5 계열은 Chaos Physics가 기본입니다.

강체(Rigid Body), 충돌, 제약, 파괴, 천 시뮬레이션 같은 물리 기능을 다룰 때는 현재 프로젝트의 엔진 버전과 물리 백엔드를 먼저 확인해야 합니다.


액터 및 컴포넌트의 물리 시뮬레이션 제어

언리얼 엔진에서 물리 시뮬레이션은 주로 Primitive Component (스태틱 메시, 스켈레탈 메시, 캡슐 콜리전 등) 수준에서 제어됩니다.

액터 자체는 물리 시뮬레이션을 직접 수행하지 않고, 포함된 컴포넌트가 물리적 특성을 가집니다.

물리 시뮬레이션 활성화/비활성화

가장 기본적인 제어는 특정 컴포넌트의 물리 시뮬레이션 활성화 여부입니다.

액터 블루프린트 열기: 물리 시뮬레이션을 적용하고 싶은 액터 블루프린트 (예: BP_PhysicsCube, BP_DestructibleWall)를 엽니다.

물리 컴포넌트 선택: 디테일(Details) 패널에서 물리 시뮬레이션을 적용할 Static Mesh Component 또는 다른 Primitive Component를 선택합니다.

Physics 섹션
  • Simulate Physics: Movable 컴포넌트에 유효한 물리 바디와 물리 충돌을 허용하는 Collision Enabled 설정을 준비한 뒤 켭니다. Static Mesh는 적절한 단순 충돌, Skeletal Mesh는 Physics Asset의 바디를 확인합니다.
  • 주의: Simulate Physics가 활성화되면, 해당 컴포넌트의 트랜스폼(위치, 회전)은 엔진의 물리 계산에 의해 결정됩니다. 따라서 블루프린트에서 직접 Set Relative Location 같은 노드를 사용하여 위치를 강제로 변경하면 물리 시뮬레이션과 충돌하여 부자연스러운 결과를 초래할 수 있습니다.

Simulation Generates Hit Events: 물리 충돌에서 On Hit을 받으려면 보통 이 옵션과 Blocking 충돌 응답이 함께 필요합니다.

Overlap 이벤트는 별도로 Generate Overlap Events와 Overlap 응답을 맞춰야 합니다. (다음 절에서 다룸)

예시
  • 떨어지는 상자: 물리 메시를 루트로 두고 Simulate Physics와 적절한 충돌 프리셋을 설정합니다. 단일 바디의 자식 컴포넌트는 시뮬레이션을 켤 때 부모에서 분리될 수 있고, 끈다고 자동 재부착되지는 않습니다.
  • 문이 부딪혀 열리는 효과: 문에 물리 시뮬레이션과 경첩 역할의 Physics Constraint를 함께 설정합니다. 시뮬레이션만 켜면 문 전체가 떨어질 수 있습니다.

질량 및 물리 특성

오브젝트의 질량, 감쇠, 표면 재질은 물리 시뮬레이션에 큰 영향을 미칩니다.

감쇠는 속도와 회전에 대한 저항이고, 표면 마찰은 Physical Material의 Friction으로 다룹니다.

컴포넌트 선택: Simulate Physics가 활성화된 컴포넌트를 선택합니다.

Physics 섹션
  • Mass in Kg: 오브젝트의 질량을 킬로그램 단위로 확인합니다. 기본 힘·임펄스 계산에서는 질량이 클수록 같은 입력에 덜 반응합니다. Accel Change/Vel Change처럼 질량을 무시하는 옵션을 사용하면 이 설명과 구분해야 합니다.
    • Mass Scale: 계산된 질량을 배율로 조정합니다.
    • Set Mass Override in Kg / Override Mass 계열: 필요한 경우 질량을 직접 지정합니다.
  • Linear Damping: 직선 속도를 줄이는 저항입니다. 값이 높을수록 이동 속도가 더 빨리 줄어듭니다.
  • Angular Damping: 회전 속도를 줄이는 저항입니다. 값이 높을수록 회전이 더 빨리 멈춥니다.
  • Enable Gravity: 이 컴포넌트에 중력을 적용할지 여부를 설정합니다. (체크 해제 시 중력의 영향을 받지 않음)

물리적 재질

오브젝트 표면의 마찰력(Friction)과 반발력(Restitution)을 정의하여 충돌 및 슬라이딩 반응을 제어합니다.

물리 재질 에셋 생성
  • 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 물리(Physics) > 물리 재질(Physics Material)을 선택합니다.
  • 이름을 지정합니다. (예: PM_Ice, PM_Rubber)

물리 재질 설정: PM_Ice 같은 Physical Material 에셋을 열고 디테일 패널에서 다음을 설정합니다.

  • Friction: 표면의 마찰 계수 (높을수록 마찰이 강해 잘 미끄러지지 않음)
    • 프로젝트와 버전에 따라 Friction Combine Mode로 다른 재질과의 결합 방식을 조정할 수 있습니다.
  • Restitution: 오브젝트가 다른 오브젝트와 충돌할 때의 반발 계수 (높을수록 더 많이 튕겨 나감)
  • Density: 물질의 밀도 (질량 계산에 사용될 수 있음)
스태틱 메시에 물리 재질 적용
  • 물리 시뮬레이션을 적용할 Static Mesh Component를 선택합니다.
  • 컴포넌트의 Phys Material Override에 생성한 Physical Material을 연결합니다.
  • Static Mesh 에셋의 Simple Collision Physical Material로 단순 충돌의 재질을 지정하는 방법도 있습니다. 사용 중인 충돌 형상과 재질 적용 경로를 함께 확인합니다.

힘 및 토크 적용

블루프린트에서 물리 시뮬레이션 중인 오브젝트에 직접 힘을 가하여 움직임을 제어할 수 있습니다.

  • Add Force: 지정된 방향으로 지속적인 힘을 가합니다. 힘이 유지되어야 하는 동안 반복적으로 호출하는 용도입니다. (예: 바람, 제트 추진)
    • Target: 힘을 가할 Primitive Component
    • Force: 힘의 벡터 (방향과 크기)
    • Bone Name: 스켈레탈 메시의 특정 본에 힘을 가할 경우 지정합니다.
  • Add Impulse: 특정 순간에 한 번의 충격량을 가합니다. (예: 폭발, 총격)
    • Target: 힘을 가할 Primitive Component
    • Impulse: 충격량 벡터
  • Add Torque in Radians: 오브젝트를 회전시키는 힘(토크)을 가합니다. (예: 회전하는 바퀴)
    • Target: 토크를 가할 Primitive Component
    • Torque: 토크 벡터
활용 예시
  • 총알이 적에게 맞았을 때: 래그돌 등 실제 시뮬레이션 중인 Skeletal Mesh 바디에 Add Impulse를 적용합니다. 일반 CharacterMovement 상태에서 캐릭터를 밀려면 Launch Character 같은 이동 경로와 구분합니다.
  • 차량이 언덕을 오를 때: 바퀴 컴포넌트에 Add Force를 적용하여 구동력을 시뮬레이션합니다.

디버깅 물리 시뮬레이션

  • Show Collision / Collision 시각화: 게임 플레이 중 콜리전 형상과 응답이 의도와 맞는지 확인합니다.
  • Chaos Visual Debugger: UE5 Chaos 프로젝트에서는 물리 바디, 제약, 충돌 이벤트를 추적하는 데 활용합니다.
  • PhysX 시각화 명령: UE4/PhysX 프로젝트에서는 pxvis collision, pxvis joints, pxvis bodies 같은 명령을 사용할 수 있습니다. UE5 Chaos 문맥에서는 그대로 적용되지 않을 수 있습니다.
  • ~ (콘솔) > stat physics: 물리 엔진의 성능 통계를 표시합니다.

물리 시뮬레이션 사용 시 고려사항

  • 성능: 너무 많은 오브젝트에 복잡한 물리 시뮬레이션을 적용하면 성능 저하의 원인이 될 수 있습니다. 필요한 경우에만 물리 시뮬레이션을 활성화하고, 단순화된 콜리전 메시를 사용하며, Sleep 기능을 활용합니다.
  • 재현과 동기화: 플랫폼, 시간 간격, 설정이 다른 실행에서 비트 단위로 같은 물리 결과가 나온다고 가정하지 않습니다. 멀티플레이의 최종 게임 상태는 서버에서 결정하고 물리 복제·예측·보정 정책을 별도로 설계합니다.
  • 콜리전 설정: 오브젝트 간의 상호작용은 콜리전 채널 및 프리셋 설정에 따라 크게 달라집니다. (다음 절에서 다룸)
  • 애니메이션과의 조화: 캐릭터의 이동과 같이 애니메이션과 물리 시뮬레이션이 모두 사용되는 경우, 둘 간의 자연스러운 전환과 조화가 중요합니다. (예: 걷다가 총에 맞아 래그돌로 전환)

물리 시뮬레이션은 충돌, 중력, 힘 적용을 통해 플레이어와 오브젝트의 상호작용을 처리하는 기능입니다.

기본적인 물리 제어 방법을 이해하고 적절히 활용하는 것이 중요합니다.


이번 절에서는 언리얼 엔진에서 물리 시뮬레이션을 활성화하고, 오브젝트의 질량, 마찰력, 반발력 등을 제어하며, 블루프린트에서 힘을 가하는 기본적인 방법에 대해 알아보았습니다.