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

물리 시뮬레이션 기본 제어


지금까지 캐릭터의 애니메이션, UI, AI, 그리고 게임플레이 프레임워크에 이르기까지 게임의 다양한 핵심 요소들을 다루어왔습니다. 이제 게임 세계에 더욱 현실감과 몰입감을 불어넣는 중요한 요소인 물리(Physics) 에 대해 알아볼 차례입니다. 언리얼 엔진은 강력한 물리 엔진을 내장하고 있어 오브젝트 간의 충돌, 중력, 힘의 적용 등 다양한 물리 현상을 손쉽게 시뮬레이션할 수 있습니다.

이번 장에서는 언리얼 엔진의 물리 시뮬레이션 기본 개념과 액터 및 컴포넌트 수준에서 물리 시뮬레이션을 제어하는 방법에 대해 자세히 알아보겠습니다.


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

물리 시뮬레이션(Physics Simulation) 은 게임 내의 오브젝트들이 현실 세계의 물리 법칙(중력, 질량, 마찰, 충돌 등)에 따라 상호작용하도록 만드는 과정입니다. 이는 단순히 정해진 애니메이션을 재생하는 것을 넘어, 예측 불가능하고 동적인 상호작용을 가능하게 하여 게임 세계에 생동감을 부여합니다.

물리 시뮬레이션이 필요한 이유

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

언리얼 엔진의 물리 엔진 (PhysX)

언리얼 엔진은 기본적으로 NVIDIA의 PhysX 물리 엔진을 사용합니다. 이 엔진은 복잡한 충돌 감지, 강체(Rigid Body) 시뮬레이션, 천(Cloth) 시뮬레이션, 액체(Fluid) 시뮬레이션(일부 버전) 등 다양한 물리 현상을 처리합니다.


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

언리얼 엔진에서 물리 시뮬레이션은 주로 Primitive Component (스태틱 메시, 스켈레탈 메시, 캡슐 콜리전 등) 수준에서 제어됩니다. 액터 자체는 물리 시뮬레이션을 직접 수행하지 않고, 포함된 컴포넌트가 물리적 특성을 가집니다.

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

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

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

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

Physics 섹션

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

Generate Hit Events: 이 체크박스를 체크하면 해당 컴포넌트가 다른 오브젝트와 충돌했을 때 On Hit 이벤트가 발생합니다. (다음 절에서 다룸)

예시

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

질량 및 물리 특성

오브젝트의 질량과 감쇠(마찰)는 물리 시뮬레이션에 큰 영향을 미칩니다.

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

Physics 섹션

  • Mass in Kg: 오브젝트의 질량을 킬로그램 단위로 설정합니다. 질량이 클수록 외부 힘에 덜 반응하고, 다른 오브젝트에 더 큰 영향을 줍니다.
    • Mass Scale: Use Damping or Custom Mass가 체크되어 있지 않다면, 이 값을 통해 컴포넌트의 질량을 스케일링할 수 있습니다.
    • Use Custom Mass: 체크 시 Mass in Kg 값을 직접 입력할 수 있습니다.
  • Linear Damping: 오브젝트가 직선 운동을 할 때 적용되는 마찰력입니다. 값이 높을수록 빠르게 멈춥니다.
  • Angular Damping: 오브젝트가 회전 운동을 할 때 적용되는 마찰력입니다. 값이 높을수록 빠르게 회전을 멈춥니다.
  • Enable Gravity: 이 컴포넌트에 중력을 적용할지 여부를 설정합니다. (체크 해제 시 중력의 영향을 받지 않음)

물리적 재질

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

물리 재질 에셋 생성

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

물리 재질 설정: PM_Ice 블루프린트를 열고 디테일 패널에서 다음을 설정합니다.

  • Friction: 표면의 마찰 계수 (높을수록 마찰이 강해 잘 미끄러지지 않음)
    • Static Friction: 정지 마찰 계수
    • Dynamic Friction: 운동 마찰 계수
  • 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를 적용하여 구동력을 시뮬레이션합니다.

디버깅 물리 시뮬레이션

  • P 키 (내비메시 토글): 물리 디버깅과는 직접 관련 없지만, 간혹 오브젝트가 엉뚱하게 떨어지는 경우 내비메시나 다른 콜리전과의 상호작용 때문일 수 있습니다.
  • ~ (콘솔) > pxvis collision: 게임 플레이 중 콜리전 메시를 시각적으로 표시합니다.
  • ~ (콘솔) > pxvis joints: 래그돌 등의 조인트를 시각적으로 표시합니다.
  • ~ (콘솔) > pxvis bodies: 물리 시뮬레이션 중인 바디를 시각적으로 표시합니다.
  • ~ (콘솔) > stat physics: 물리 엔진의 성능 통계를 표시합니다.

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

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

물리 시뮬레이션은 게임 세계에 생명력을 불어넣고 플레이어에게 깊이 있는 상호작용 경험을 제공하는 강력한 도구입니다. 기본적인 물리 제어 방법을 이해하고 적절히 활용하는 것이 중요합니다.


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