동적 환경 상호작용의 기본 구현
지금까지 우리는 오브젝트에 물리 시뮬레이션을 적용하고, 콜리전 이벤트를 처리하며, 환경에 대한 정보를 쿼리하는 방법을 배웠습니다. 또한 낮/밤 주기 및 날씨 시스템을 통해 환경에 동적인 변화를 주는 기초를 다졌습니다. 이제 이러한 지식들을 통합하여 플레이어의 행동이나 게임 이벤트에 따라 반응하고 변화하는 동적 환경 상호작용을 구현하는 기본 방법에 대해 알아보겠습니다.
동적 환경 상호작용은 게임 세계를 더욱 살아있는 것처럼 느끼게 하고, 플레이어에게 깊이 있는 몰입감과 피드백을 제공하는 핵심 요소입니다.
동적 환경 상호작용이란 무엇인가?
동적 환경 상호작용(Dynamic Environment Interaction) 은 게임 월드 내의 오브젝트들이 플레이어의 행동, 물리적 충격, 또는 게임 로직에 의해 실시간으로 변화하고 반응하는 것을 의미합니다. 이는 단순한 물리 시뮬레이션을 넘어, 게임플레이와 직접적으로 연결되어 플레이어에게 결과를 보여주는 것입니다.
예시
- 파괴 가능한 오브젝트: 총격이나 폭발에 의해 벽, 상자, 유리창 등이 부서지는 것.
- 움직이는 플랫폼/문: 플레이어가 스위치를 누르거나 특정 위치에 도달하면 문이 열리거나 플랫폼이 움직이는 것.
- 물리 기반 퍼즐: 특정 오브젝트를 밀거나 던져서 레버를 작동시키거나 길을 막는 것.
- 환경적 위험 요소: 플레이어가 밟으면 무너지는 바닥, 닿으면 데미지를 입는 용암 등.
- 상호작용 가능한 오브젝트: 플레이어가 특정 버튼을 누르면 작동하는 기계 등.
동적 환경 상호작용 구현의 기본 원리
대부분의 동적 환경 상호작용은 다음의 기본 단계를 따릅니다.
입력/트리거: 플레이어의 입력, 다른 오브젝트와의 콜리전, 시간 경과, 게임 이벤트 발생 등 상호작용을 시작하는 조건.
판단/로직: 트리거를 감지한 후 어떤 행동을 할지 결정하는 게임 로직.
환경 변화: 결정된 로직에 따라 환경 오브젝트의 물리적 상태, 시각적 표현, 활성 상태 등을 변경.
피드백: 플레이어에게 변화에 대한 시각적(이펙트), 청각적(사운드), 또는 햅틱(진동) 피드백 제공.
기본 구현 예시: 파괴 가능한 상자
플레이어가 총을 쏘면 부서지는 상자를 구현해봅시다. 이 예시는 물리 시뮬레이션, 콜리전, 이벤트 처리를 통합합니다.
파괴 가능한 상자 액터 블루프린트 생성
새 액터 블루프린트 생성: Actor
를 부모 클래스로 하는 BP_DestructibleBox
를 생성합니다.
컴포넌트 추가
Static Mesh Component
: 상자의 시각적 형태를 나타냅니다. (예:Cube
스태틱 메시)Box Collision Component
: 충돌 감지용으로 사용합니다.Static Mesh
와 크기를 맞춥니다.
콜리전 설정
Static Mesh Component
와Box Collision Component
모두Collision Presets
를BlockAll
로 설정합니다.Static Mesh Component
의Simulate Physics
는 체크 해제합니다. (처음에는 고정되어 있다가 파괴 시 물리가 적용되도록 할 것임)Generate Hit Events
는 체크합니다. (총알과 충돌 시On Hit
이벤트를 받기 위함)
데미지 처리 및 파괴 로직 구현
BP_DestructibleBox
블루프린트의 이벤트 그래프
에서 다음을 구현합니다.
Event AnyDamage
활용
Event AnyDamage
노드를 추가합니다. 이 이벤트는 이 액터가 데미지를 받을 때마다 호출됩니다.Health
변수 추가:Health
라는Float
변수를 추가하고디폴트 값
을100.0
등으로 설정합니다.Health
에서Damage
값을 빼고, 결과를 다시Health
변수에 저장합니다.Branch
노드:Health
가0
보다 작거나 같아지는지 확인합니다.
파괴 로직 (Health <= 0
일 때)
Branch
노드의True
핀에서 다음을 실행합니다.Static Mesh Component
의Set Simulate Physics
노드:New Simulate
를 체크합니다. (상자가 물리 시뮬레이션의 영향을 받기 시작)Static Mesh Component
의Set Collision Enabled
노드:New Type
을Query And Physics
로 설정합니다. (물리 활성화 시 콜리전도 제대로 작동하도록)Static Mesh Component
의Add 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 Collision
의 On Component Hit
이벤트
Other Actor
를Cast 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 Collision
의On Component Begin Overlap
(플레이어가 겹쳤을 때) 이벤트에서Timeline
노드를 사용하여 문Static Mesh
의Set 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 Collision
의Collision Presets
를OverlapAll
로 설정합니다.On Component Begin Overlap
이벤트에서Other Actor
를Cast To BP_PlayerCharacter
로 캐스팅합니다.- 캐스팅 성공 시,
Apply Damage
노드를 주기적으로 호출하는 타이머를 설정합니다. On Component End Overlap
에서 타이머를 해제합니다.
동적 환경 상호작용은 게임 월드를 단순한 배경이 아닌, 플레이어와 끊임없이 소통하는 살아있는 공간으로 만듭니다. 복잡한 시스템을 한 번에 만들려 하기보다는, 간단한 상호작용부터 차근차근 구현하면서 언리얼 엔진의 다양한 기능을 익히는 것이 중요합니다.
이번 절에서는 플레이어의 행동이나 게임 이벤트에 따라 반응하고 변화하는 동적 환경 상호작용의 기본 구현 방법에 대해 알아보았습니다. 파괴 가능한 오브젝트, 움직이는 문, 물리 기반 스위치 등 다양한 예시를 통해 물리, 콜리전, 이벤트 처리의 통합적인 활용법을 살펴보았습니다.