안동민 개발노트

본문 시작

물리 기반 캐릭터 제어

Character Movement의 이동·가속·마찰·중력·충돌 설정을 익히고 입력과 물리 반응이 충돌하지 않게 제어합니다.

표면 특성을 정리했다면, 이제는 그 물리 규칙을 플레이어 캐릭터 제어로 확장할 차례입니다.

핵심은 플레이어 캐릭터(Player Character)를 물리 기반으로 제어하는 방법입니다.

캐릭터 무브먼트 컴포넌트는 강력하지만 설정 항목이 많기 때문에, 물리 엔진과의 상호작용 원리를 이해하고 적용해야 현실감과 반응성을 동시에 확보할 수 있습니다.


캐릭터 무브먼트 컴포넌트의 이해

언리얼 엔진의 Character 클래스(PlayerCharacter, AICharacter 포함)는 기본적으로 Character Movement Component를 포함합니다.

이 컴포넌트는 3D 캐릭터 제어에 필요한 로직을 대부분 내장하고 있으며 물리 엔진과 밀접하게 연동됩니다.

다만 일반 리지드바디 물리와는 동작 방식이 일부 다르므로 설정 의도를 이해한 상태에서 조정하는 것이 중요합니다.

물리 시뮬레이션, 캐릭터 무브먼트 컴포넌트

  • 물리 시뮬레이션 (Simulate Physics): 액터의 질량, 중력, 힘 등에 따라 엔진이 움직임을 전적으로 계산합니다. 충돌 시 오브젝트가 튕겨 나가거나 굴러떨어지는 등 예측 불가능한 물리 반응이 나타납니다.
  • 캐릭터 무브먼트 컴포넌트
    • 플레이어의 입력을 받아 정해진 규칙(걷기, 뛰기, 점프, 떨어지기)에 따라 캐릭터를 이동시키며, 캡슐 컴포넌트(Capsule Component)를 사용하여 충돌을 처리합니다.
    • 완전한 물리 시뮬레이션과는 다르게, 캐릭터가 물리 법칙(예: 마찰)의 영향을 받지만, 입력과 충돌 제약에 따른 예측 가능한 이동을 제공하는 데 중점을 둡니다.
    • 벽을 미끄러지듯 걷거나, 계단을 부드럽게 오르내리는 등의 복잡한 움직임을 자동으로 처리합니다.
    • 일반 보행 캐릭터는 캡슐을 강체로 시뮬레이션하는 방식이 아닙니다. 물리 오브젝트에 힘을 가하는 기능과 캐릭터의 충돌·이동 처리는 구분합니다.

물리 기반 캐릭터 제어가 필요한 경우

대부분의 게임에서 Character Movement Component는 그 자체로 충분히 훌륭합니다.

하지만 다음과 같은 경우에는 물리 기반 제어의 개념을 이해하고 활용하는 것이 중요합니다.

  • 진정한 물리 기반 캐릭터: 완전한 래그돌(Ragdoll) 물리 캐릭터를 구현하거나, 차량처럼 물리 엔진에 의해 구동되는 캐릭터.
  • 환경과의 상호작용 강화: 미끄러운 얼음 위를 걷거나, 움직이는 플랫폼 위에서 균형을 잡는 등 환경의 물리적 특성이 캐릭터 움직임에 직접적으로 영향을 미치게 할 때.
  • 특수 이동 능력: 중력 역전, 고정된 지점에서 매달리기 등 표준 Character Movement Component로는 구현하기 어려운 독특한 이동 방식을 만들 때.

캐릭터 무브먼트 컴포넌트의 물리 관련 설정

Character Movement Component는 물리 엔진과의 상호작용을 제어하는 다양한 설정을 가지고 있습니다.

PlayerCharacter 블루프린트를 열고 Character Movement (Inherited) 컴포넌트를 선택한 후, 디테일 패널을 확인합니다.

이동 설정 (Movement Capabilities)

  • Walkable Floor Angle (걸을 수 있는 바닥 각도): 캐릭터가 걸을 수 있는 최대 경사 각도입니다. 이 값을 넘어서는 경사면에서는 미끄러지거나 더 이상 올라갈 수 없습니다.
  • Ground Friction (지면 마찰): 캐릭터가 지면 위에서 움직일 때 적용되는 마찰력입니다. 값이 높으면 방향을 더 빨리 바꿀 수 있습니다. Use Separate Braking Friction이 꺼진 경우 제동에도 사용되며, Braking Deceleration Walking과 함께 정지 거리를 결정합니다.
    • 활용: 얼음 위에서 Ground Friction을 낮추면 캐릭터가 미끄러지는 효과를 낼 수 있습니다.
  • Braking Deceleration Walking (제동 감속 보행): 캐릭터가 걷기를 멈출 때 얼마나 빨리 감속하는지 결정합니다.

점프 및 낙하 설정

  • Gravity Scale (중력 배율): 캐릭터에만 적용되는 중력의 강도를 조절합니다. 이 값을 변경하여 캐릭터의 점프 높이나 낙하 속도를 조절할 수 있습니다.
    • 0.5: 낮은 중력 (더 높이 점프하고 천천히 떨어짐)
    • 2.0: 높은 중력 (더 낮게 점프하고 빠르게 떨어짐)
  • Air Control (공중 제어): 캐릭터가 공중에 있을 때 얼마나 움직임을 제어할 수 있는지 결정합니다. 값이 높을수록 공중에서 방향 전환이 자유롭습니다.

충돌 설정 (Collision)

Character Movement Component는 자체적으로 충돌 박스나 캡슐을 가지지 않고, 부모 Character 클래스에 포함된 Capsule Component를 충돌에 사용합니다.

  • Capsule Component
    • Collision Presets: 캡슐은 보통 Pawn을 사용합니다. CharacterMesh는 스켈레탈 메시용 프리셋이므로 캡슐과 구분합니다.
  • 환경 컴포넌트의 Can Character Step Up On: 부딪힌 캐릭터가 그 컴포넌트를 밟고 올라설 수 있는지 제어합니다. 충돌 채널이 아니며, 경사 판정은 Walkable Floor Angle과 표면의 Walkable Slope Override로 구분합니다.
  • Character Movement (Inherited) 컴포넌트의 Navigation 섹션:
    • Can Crouch / Can Jump / Can Walk / Can Swim / Can Fly: 해당 이동 모드를 허용할지 설정합니다.

물리 상호작용 설정 (Physics Interaction)

Character Movement Component에서 Physics 섹션이나 Movement 섹션을 확인합니다.

  • Physics Interaction
    • Push Force Factor: 캐릭터가 다른 물리 시뮬레이션 오브젝트를 밀어낼 때 적용되는 힘의 배율.
    • Push Force Point ZOffset Factor: 물체 높이를 기준으로 힘의 적용 위치를 조절합니다. Push Force Using ZOffset을 사용하는 경우에 적용됩니다.
  • Enable Physics Interaction: 이 옵션을 활성화하면 캐릭터가 물리 시뮬레이션되는 오브젝트와 상호작용할 때 해당 오브젝트를 밀어낼 수 있습니다. 이 옵션은 모든 충돌을 끄거나 잡아당기기 기능을 구현하는 스위치가 아닙니다. 실제 기본값은 사용 중인 캐릭터 클래스에서 확인합니다.

물리 기반 캐릭터 제어 구현 예시 (블루프린트 활용)

캐릭터 무브먼트 컴포넌트의 설정을 블루프린트에서 동적으로 변경하여 물리 기반 상호작용을 구현할 수 있습니다.

미끄러운 바닥 구현 (Ground Friction 조절)

물리 재질 생성: PM_Ice (Friction: 0.05) 물리 재질을 생성합니다.

바닥에 적용: 단순 충돌 바닥 컴포넌트의 Phys Material Override에 PM_Ice를 할당합니다. 캐릭터 제어를 위해 같은 범위를 덮는 별도 Box Collision 트리거를 둡니다.

캐릭터 블루프린트 설정: PlayerCharacter 블루프린트를 열고 Character Movement (Inherited) 컴포넌트를 선택합니다.

  • 시작 시 캐릭터의 Ground Friction과 제동 설정을 변수에 저장합니다. 8.0은 예시값이며 프로젝트의 값을 기준으로 합니다.
  • 플레이어가 얼음 위에 올라갔을 때 Ground Friction을 낮추는 로직을 구현합니다.
    • 블루프린트 로직
      • 트리거와 플레이어 캡슐의 Overlap 설정을 맞추고 Other Actor뿐 아니라 Other Comp가 플레이어 캡슐인지 확인합니다.
      • BeginOverlap에서 Get Character Movement로 참조를 얻어 Set Ground Friction을 낮춥니다. 별도 제동 마찰을 켰다면 그 값과 Braking Deceleration Walking도 따로 조정해야 합니다.
      • EndOverlap에서 처음 저장한 값으로 복원합니다. 이 예시는 하나의 얼음 구간만 사용합니다. 구간이 겹치면 현재 활성 구간을 모아 우선순위를 정하고, 하나를 나갈 때 나머지 구간의 값을 다시 적용합니다.

중력 변화 구간 구현 (Gravity Scale 조절)

트리거 준비: Actor Blueprint에 Box Collision 또는 Sphere Collision 컴포넌트를 추가합니다. Custom 응답으로 Pawn만 Overlap, 나머지는 Ignore로 두고 양쪽 Generate Overlap Events를 켭니다.

블루프린트 로직
  • 이 트리거 볼륨 액터의 이벤트 그래프를 엽니다.
  • OnComponentBeginOverlap 이벤트를 추가합니다.
  • Other Actor 핀을 Cast To PlayerCharacter (또는 여러분의 캐릭터 블루프린트 클래스)로 연결합니다.
  • 캐스트 성공 후 Other Comp가 플레이어 캡슐인지 확인합니다. 시작 시 저장한 Gravity Scale을 복원값으로 사용하고, As PlayerCharacter 핀에서 Get Character Movement 노드를 가져옵니다.
  • Set Gravity Scale 노드를 사용하여 원하는 중력 배율(예: 0.2로 낮추어 점프력 증가)을 설정합니다.
  • 동일한 캡슐의 OnComponentEndOverlap에서 저장한 Gravity Scale로 복원합니다. 중첩 구간은 앞의 우선순위 방식으로 처리합니다.
  • 팁: 중력 변화 시 시각적 효과(화면 색상 변경, HUD 아이콘)나 사운드 효과를 함께 연출하면 몰입감이 높아집니다.

물리 기반 캐릭터 제어의 최적화 및 고려 사항

  • Character Movement Component의 역할 이해: 대부분의 경우 이 컴포넌트가 캐릭터 움직임을 효율적으로 처리합니다. 물리 시뮬레이션을 완전히 활성화하는 것은 특정 상황(래그돌, 차량)에만 적용하고, 일반적인 보행/점프에는 컴포넌트의 설정을 활용합니다.
  • 충돌 설정의 중요성: 캐릭터의 Capsule Component와 환경 오브젝트 간의 충돌 설정이 정확해야 합니다. 불필요한 Complex Collision 사용은 피해야 합니다.
  • 네트워크 레플리케이션: 멀티플레이어 게임에서는 물리 기반 캐릭터 제어가 네트워크 대기 시간(Latency)에 민감할 수 있습니다. Character Movement Component는 네트워크 레플리케이션에 최적화되어 있지만, 커스텀 물리 로직을 구현할 때는 네트워크 동기화에 대한 고려가 필수적입니다.
  • 디버깅: 캐릭터가 예상치 못하게 미끄러지거나, 벽에 끼이거나, 충돌이 발생하지 않는다면 Character Movement Component의 설정(Ground Friction, Walkable Floor Angle, Max Step Height)과 충돌 오브젝트의 물리 재질, 충돌 프리셋을 꼼꼼히 확인해야 합니다.
  • 성능: Set Ground Friction, Set Gravity Scale 등의 블루프린트 노드는 성능에 큰 부담을 주지 않습니다. 하지만 너무 자주 복잡한 물리 계산을 강제하는 로직은 피해야 합니다.

물리 기반 캐릭터 제어는 Character Movement Component의 규칙과 블루프린트 제어를 함께 조정하는 작업입니다.

이동감, 충돌 반응, 물리 오브젝트 상호작용을 분리해 테스트합니다.