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

동적 환경 상호작용의 기본 구현


지금까지 우리는 오브젝트에 물리 시뮬레이션을 적용하고, 콜리전 이벤트를 처리하며, 환경에 대한 정보를 쿼리하는 방법을 배웠습니다. 또한 낮/밤 주기 및 날씨 시스템을 통해 환경에 동적인 변화를 주는 기초를 다졌습니다. 이제 이러한 지식들을 통합하여 플레이어의 행동이나 게임 이벤트에 따라 반응하고 변화하는 동적 환경 상호작용을 구현하는 기본 방법에 대해 알아보겠습니다.

동적 환경 상호작용은 게임 세계를 더욱 살아있는 것처럼 느끼게 하고, 플레이어에게 깊이 있는 몰입감과 피드백을 제공하는 핵심 요소입니다.


동적 환경 상호작용이란 무엇인가?

동적 환경 상호작용(Dynamic Environment Interaction) 은 게임 월드 내의 오브젝트들이 플레이어의 행동, 물리적 충격, 또는 게임 로직에 의해 실시간으로 변화하고 반응하는 것을 의미합니다. 이는 단순한 물리 시뮬레이션을 넘어, 게임플레이와 직접적으로 연결되어 플레이어에게 결과를 보여주는 것입니다.

예시

  • 파괴 가능한 오브젝트: 총격이나 폭발에 의해 벽, 상자, 유리창 등이 부서지는 것.
  • 움직이는 플랫폼/문: 플레이어가 스위치를 누르거나 특정 위치에 도달하면 문이 열리거나 플랫폼이 움직이는 것.
  • 물리 기반 퍼즐: 특정 오브젝트를 밀거나 던져서 레버를 작동시키거나 길을 막는 것.
  • 환경적 위험 요소: 플레이어가 밟으면 무너지는 바닥, 닿으면 데미지를 입는 용암 등.
  • 상호작용 가능한 오브젝트: 플레이어가 특정 버튼을 누르면 작동하는 기계 등.

동적 환경 상호작용 구현의 기본 원리

대부분의 동적 환경 상호작용은 다음의 기본 단계를 따릅니다.

입력/트리거: 플레이어의 입력, 다른 오브젝트와의 콜리전, 시간 경과, 게임 이벤트 발생 등 상호작용을 시작하는 조건.

판단/로직: 트리거를 감지한 후 어떤 행동을 할지 결정하는 게임 로직.

환경 변화: 결정된 로직에 따라 환경 오브젝트의 물리적 상태, 시각적 표현, 활성 상태 등을 변경.

피드백: 플레이어에게 변화에 대한 시각적(이펙트), 청각적(사운드), 또는 햅틱(진동) 피드백 제공.


기본 구현 예시: 파괴 가능한 상자

플레이어가 총을 쏘면 부서지는 상자를 구현해봅시다. 이 예시는 물리 시뮬레이션, 콜리전, 이벤트 처리를 통합합니다.

파괴 가능한 상자 액터 블루프린트 생성

새 액터 블루프린트 생성: Actor를 부모 클래스로 하는 BP_DestructibleBox를 생성합니다.

컴포넌트 추가

  • Static Mesh Component: 상자의 시각적 형태를 나타냅니다. (예: Cube 스태틱 메시)
  • Box Collision Component: 충돌 감지용으로 사용합니다. Static Mesh와 크기를 맞춥니다.

콜리전 설정

  • Static Mesh ComponentBox Collision Component 모두 Collision PresetsBlockAll 로 설정합니다.
  • Static Mesh ComponentSimulate Physics체크 해제합니다. (처음에는 고정되어 있다가 파괴 시 물리가 적용되도록 할 것임)
  • Generate Hit Events체크합니다. (총알과 충돌 시 On Hit 이벤트를 받기 위함)

데미지 처리 및 파괴 로직 구현

BP_DestructibleBox 블루프린트의 이벤트 그래프에서 다음을 구현합니다.

Event AnyDamage 활용

  • Event AnyDamage 노드를 추가합니다. 이 이벤트는 이 액터가 데미지를 받을 때마다 호출됩니다.
  • Health 변수 추가: Health라는 Float 변수를 추가하고 디폴트 값100.0 등으로 설정합니다.
  • Health에서 Damage 값을 빼고, 결과를 다시 Health 변수에 저장합니다.
  • Branch 노드: Health0보다 작거나 같아지는지 확인합니다.

파괴 로직 (Health <= 0일 때)

  • Branch 노드의 True 핀에서 다음을 실행합니다.
  • Static Mesh ComponentSet Simulate Physics 노드: New Simulate체크합니다. (상자가 물리 시뮬레이션의 영향을 받기 시작)
  • Static Mesh ComponentSet Collision Enabled 노드: New TypeQuery And Physics로 설정합니다. (물리 활성화 시 콜리전도 제대로 작동하도록)
  • Static Mesh ComponentAdd Impulse 노드 (선택 사항): 데미지를 준 방향으로 상자가 튕겨 나가도록 Add Impulse를 적용하여 파괴 효과를 강화합니다.
    • Get Hit Result (데미지 이벤트의 Event Instigator를 기반으로 총알의 Impact Normal 등을 가져올 수 있음) 또는 데미지를 준 위치로부터의 방향 벡터를 계산하여 충격량 벡터를 만듭니다.
  • 파괴 사운드 및 이펙트: Play Sound at Location 노드와 Spawn Emitter at Location (또는 Spawn Niagara System at Location) 노드를 사용하여 파괴 효과를 추가합니다. (이펙트 에셋 미리 준비)
  • 타이머를 이용한 액터 제거 (선택 사항): Set Timer by Event를 사용하여 5초 후 Destroy Actor 노드를 호출하여 부서진 상자가 월드에서 사라지도록 합니다. (정리 목적)

총알에 데미지 적용 로직 추가

이제 플레이어의 총알이 BP_DestructibleBox에 닿으면 데미지를 주도록 구현합니다.

BP_Bullet (총알 액터) 블루프린트 열기: (총알 블루프린트가 없으면 새로 만들거나 임시로 다른 액터에 구현)

Sphere CollisionOn Component Hit 이벤트

  • Other ActorCast To BP_DestructibleBox로 캐스팅합니다.
  • 캐스팅 성공 시, Apply Damage 노드를 호출합니다.
    • Damaged Actor: 캐스팅된 BP_DestructibleBox
    • Base Damage: 25.0 등으로 설정합니다.
    • Damage Causer: 총알 액터(Self)
    • Instigated By: 총알을 발사한 플레이어 컨트롤러 (Get Controller 등)
  • 총알 파괴: 데미지 적용 후 Destroy Actor 노드를 호출하여 총알 액터를 파괴합니다.

테스트 및 개선

레벨에 BP_DestructibleBox를 여러 개 배치하고 플레이어 캐릭터가 총을 쏘아 파괴되는 것을 확인합니다.

개선 사항

  • 데미지 유형: 다른 종류의 데미지(폭발 데미지, 근접 데미지)에 따라 다르게 반응하도록 Damage Type Class를 활용합니다.
  • 다양한 파괴 단계: 상자가 한 번에 부서지지 않고, 금이 가거나 일부가 떨어져 나가는 등 여러 단계의 파괴 상태를 구현할 수 있습니다. (여러 개의 스태틱 메시 컴포넌트 사용 또는 머티리얼 변화)
  • 파티클 시스템 연동: 총알이 닿을 때마다 스파크 이펙트를 생성하고, 파괴 시 연기 및 파편 이펙트를 추가합니다. (10장 2절 파티클 시스템 참조)
  • 최적화: 너무 많은 파편 액터가 생성되지 않도록 수명을 제한하거나, Object Pool 패턴을 사용하여 재활용합니다.

다른 동적 환경 상호작용 예시

  • 움직이는 문/플랫폼
    • BP_MovingDoor 액터에 Static Mesh Component (문)를 추가합니다.
    • 문 앞에 Box Collision 컴포넌트를 배치하여 트리거 볼륨으로 사용합니다.
    • Box CollisionOn Component Begin Overlap (플레이어가 겹쳤을 때) 이벤트에서 Timeline 노드를 사용하여 문 Static MeshSet Relative Location을 애니메이션합니다.
    • On Component End Overlap에서 Timeline을 역재생하여 문을 닫습니다.
  • 물리 기반 스위치/레버
    • BP_Lever 액터에 Static Mesh Component (레버)를 추가하고 Simulate Physics를 활성화합니다.
    • Physics Constraint Component를 추가하여 레버가 한 축으로만 회전하도록 제한합니다.
    • 레버의 On Component Hit 또는 On Component Begin Overlap 이벤트를 사용하여 플레이어가 레버를 조작하거나 특정 오브젝트가 닿았을 때 Get Physics Angular Velocity 등으로 레버의 회전 각도를 감지하고, 특정 각도에 도달하면 문을 열거나 다른 이벤트를 발생시킵니다.
  • 환경적 위험 요소 (용암)
    • BP_Lava 액터에 Static Mesh Component (용암 시각 표현)와 Box Collision Component (트리거)를 추가합니다.
    • Box CollisionCollision PresetsOverlapAll로 설정합니다.
    • On Component Begin Overlap 이벤트에서 Other ActorCast To BP_PlayerCharacter로 캐스팅합니다.
    • 캐스팅 성공 시, Apply Damage 노드를 주기적으로 호출하는 타이머를 설정합니다.
    • On Component End Overlap에서 타이머를 해제합니다.

동적 환경 상호작용은 게임 월드를 단순한 배경이 아닌, 플레이어와 끊임없이 소통하는 살아있는 공간으로 만듭니다. 복잡한 시스템을 한 번에 만들려 하기보다는, 간단한 상호작용부터 차근차근 구현하면서 언리얼 엔진의 다양한 기능을 익히는 것이 중요합니다.


이번 절에서는 플레이어의 행동이나 게임 이벤트에 따라 반응하고 변화하는 동적 환경 상호작용의 기본 구현 방법에 대해 알아보았습니다. 파괴 가능한 오브젝트, 움직이는 문, 물리 기반 스위치 등 다양한 예시를 통해 물리, 콜리전, 이벤트 처리의 통합적인 활용법을 살펴보았습니다.