안동민 개발노트 아이콘

안동민 개발노트

10장 : 물리 및 환경 상호작용

물리 시뮬레이션 기본 제어

지금까지 캐릭터 애니메이션, 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: 이 체크박스를 체크하면 해당 컴포넌트가 물리 시뮬레이션의 영향을 받기 시작합니다. (중력의 영향, 다른 물리 오브젝트와의 충돌 등)
  • 주의: Simulate Physics가 활성화되면, 해당 컴포넌트의 트랜스폼(위치, 회전)은 엔진의 물리 계산에 의해 결정됩니다. 따라서 블루프린트에서 직접 Set Relative Location 같은 노드를 사용하여 위치를 강제로 변경하면 물리 시뮬레이션과 충돌하여 부자연스러운 결과를 초래할 수 있습니다.

Simulation Generates Hit Events: 물리 충돌에서 On Hit을 받으려면 보통 이 옵션과 Blocking 충돌 응답이 함께 필요합니다. Overlap 이벤트는 별도로 Generate Overlap Events와 Overlap 응답을 맞춰야 합니다. (다음 절에서 다룸)

예시
  • 떨어지는 상자: Static Mesh ComponentSimulate Physics를 체크하고, Collision PresetsBlock All 또는 PhysicsActor로 설정합니다.
  • 문이 부딪혀 열리는 효과: 문의 Static Mesh Component에 물리 시뮬레이션을 적용하고, 외부 힘에 반응하도록 합니다.

질량 및 물리 특성

오브젝트의 질량, 감쇠, 표면 재질은 물리 시뮬레이션에 큰 영향을 미칩니다. 감쇠는 속도와 회전에 대한 저항이고, 표면 마찰은 Physical Material의 Friction으로 다룹니다.

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

Physics 섹션
  • Mass in Kg: 오브젝트의 질량을 킬로그램 단위로 확인합니다. 질량이 클수록 같은 힘이나 임펄스에 덜 반응합니다.
    • 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를 선택합니다.
  • 디테일 패널의 Physics 섹션에서 Physics Material 드롭다운에 생성한 물리 재질 에셋을 연결합니다.
  • Static Mesh 에셋 자체의 Physics Material 슬롯에도 적용할 수 있습니다.

힘 및 토크 적용

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

  • Add Force: 지정된 방향으로 지속적인 힘을 가합니다. 힘이 유지되어야 하는 동안 반복적으로 호출하는 용도입니다. (예: 바람, 제트 추진)
    • Target: 힘을 가할 Primitive Component
    • Force: 힘의 벡터 (방향과 크기)
    • Bone Name: 스켈레탈 메시의 특정 본에 힘을 가할 경우 지정합니다.
  • Add Impulse: 특정 순간에 한 번의 충격량을 가합니다. (예: 폭발, 총격)
    • Target: 힘을 가할 Primitive Component
    • Impulse: 충격량 벡터
  • Add Torque: 오브젝트를 회전시키는 힘(토크)을 가합니다. (예: 회전하는 바퀴)
    • Target: 토크를 가할 Primitive Component
    • Torque: 토크 벡터
활용 예시
  • 총알이 적에게 맞았을 때: Bullet 액터의 On Hit 이벤트에서 적 캐릭터의 Skeletal Mesh ComponentAdd Impulse를 적용하여 쓰러지거나 뒤로 밀려나게 합니다.
  • 차량이 언덕을 오를 때: 바퀴 컴포넌트에 Add Force를 적용하여 구동력을 시뮬레이션합니다.

아래 점검표는 물리 시뮬레이션을 켜는 순간부터 충돌과 이벤트 반응까지 함께 확인해야 할 항목을 한 흐름으로 정리한 것입니다.


디버깅 물리 시뮬레이션

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

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

  • 성능: 너무 많은 오브젝트에 복잡한 물리 시뮬레이션을 적용하면 성능 저하의 원인이 될 수 있습니다. 필요한 경우에만 물리 시뮬레이션을 활성화하고, 단순화된 콜리전 메시를 사용하며, Sleep 기능을 활용합니다.
  • 결정론적이지 않음: 물리 시뮬레이션은 기본적으로 결정론적이지 않습니다. 즉, 동일한 초기 조건에서도 미세한 차이로 인해 매번 다른 결과가 나올 수 있습니다. 이는 특히 멀티플레이어 게임에서 동기화 문제를 일으킬 수 있으므로, 핵심 게임플레이 로직은 서버에서만 처리해야 합니다.
  • 콜리전 설정: 오브젝트 간의 상호작용은 콜리전 채널 및 프리셋 설정에 따라 크게 달라집니다. (다음 절에서 다룸)
  • 애니메이션과의 조화: 캐릭터의 이동과 같이 애니메이션과 물리 시뮬레이션이 모두 사용되는 경우, 둘 간의 자연스러운 전환과 조화가 중요합니다. (예: 걷다가 총에 맞아 래그돌로 전환)

물리 시뮬레이션은 충돌, 중력, 힘 적용을 통해 플레이어와 오브젝트의 상호작용을 처리하는 기능입니다. 기본적인 물리 제어 방법을 이해하고 적절히 활용하는 것이 중요합니다.

마지막으로 물리 컴포넌트를 켤 때 함께 확인할 설정과 실패 징후를 한 번 더 묶어 봅니다.


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

물리 시뮬레이션 기본 제어은 입력 이벤트, 상태 변경, 실행 위치, 디버그 기준으로 점검합니다.

물리 시뮬레이션 기본 제어에서 놓치기 쉬운 기준은 보충 점검 항목으로 다시 확인합니다.