동적 환경 상호작용의 기본 구현
입력·충돌·데미지 이벤트를 환경 변화와 피드백에 연결해 파괴 가능한 상자와 반응형 오브젝트를 구현합니다.
지금까지 우리는 오브젝트에 물리 시뮬레이션을 적용하고, 콜리전 이벤트를 처리하며, 환경에 대한 정보를 쿼리하는 방법을 배웠습니다.
또한 낮/밤 주기 및 날씨 시스템을 통해 환경에 동적인 변화를 주는 기초를 다졌습니다.
이제 이러한 지식들을 통합하여 플레이어의 행동이나 게임 이벤트에 따라 반응하고 변화하는 동적 환경 상호작용을 구현하는 기본 방법에 대해 알아보겠습니다.
동적 환경 상호작용은 플레이어 입력, 물리 반응, 콜리전, 피드백을 연결하는 구현 영역입니다.
플레이어 입력, 충돌, 데미지, 시간 이벤트를 받아 판단하고, 물리·상태·이펙트로 결과를 보여준다.
- Trigger
OnComponentHit, Overlap, 입력, 게임 이벤트가 시작점이다.
- Logic
Cast, Branch, Health 감소처럼 조건을 판정한다.
- Change
Simulate Physics, 이동, 파괴, 활성 상태를 바꾼다.
- Feedback
사운드, Niagara, 카메라 흔들림, 타이머 정리로 반응을 완성한다.
- 파괴 상자
AnyDamage 후 Health가 0이면 물리 활성화
- 움직이는 문
Overlap과 Timeline으로 위치 보간
- 위험 지형
Begin/End Overlap으로 데미지 타이머 관리
동적 환경 상호작용이란 무엇인가?
동적 환경 상호작용(Dynamic Environment Interaction)은 게임 월드 내의 오브젝트들이 플레이어의 행동, 물리적 충격, 또는 게임 로직에 의해 실시간으로 변화하고 반응하는 것을 의미합니다.
이는 단순한 물리 시뮬레이션을 넘어, 게임플레이와 직접적으로 연결되어 플레이어에게 결과를 보여주는 것입니다.
예시- 파괴 가능한 오브젝트: 총격이나 폭발에 의해 벽, 상자, 유리창 등이 부서지는 것.
- 움직이는 플랫폼/문: 플레이어가 스위치를 누르거나 특정 위치에 도달하면 문이 열리거나 플랫폼이 움직이는 것.
- 물리 기반 퍼즐: 특정 오브젝트를 밀거나 던져서 레버를 작동시키거나 길을 막는 것.
- 환경적 위험 요소: 플레이어가 밟으면 무너지는 바닥, 닿으면 데미지를 입는 용암 등.
- 상호작용 가능한 오브젝트: 플레이어가 특정 버튼을 누르면 작동하는 기계 등.
동적 환경 상호작용 구현의 기본 원리
파괴 가능한 오브젝트는 입력, 데미지, 상태 전환, 시각 효과, 저장 여부가 하나의 체인으로 이어집니다.
- 감지
트레이스, 오버랩, 데미지 이벤트 중 어떤 입력으로 시작할지 정합니다. Trigger
- 상태 변경
체력, 잠금, 재사용 대기시간 같은 상태 값을 먼저 갱신합니다. State
- 표현 전환
메시 교체, 물리 활성화, 파티클, 사운드를 한 번에 묶어 실행합니다. Feedback
- 후처리
아이템 드롭, 진행 플래그, 저장 데이터 반영을 필요할 때만 수행합니다. Persist
- 반응 지연
입력 뒤 시각 피드백이 늦지 않게 이벤트 순서를 조정합니다.
- 상태 중복
파괴 후에도 데미지가 반복 적용되지 않도록 게이트를 둡니다.
- 저장 정책
상호작용 결과가 세션 한정인지 영구 저장인지 명확히 나눕니다.
대부분의 동적 환경 상호작용은 다음의 기본 단계를 따릅니다.
입력/트리거: 플레이어의 입력, 다른 오브젝트와의 콜리전, 시간 경과, 게임 이벤트 발생 등 상호작용을 시작하는 조건.
판단/로직: 트리거를 감지한 후 어떤 행동을 할지 결정하는 게임 로직.
환경 변화: 결정된 로직에 따라 환경 오브젝트의 물리적 상태, 시각적 표현, 활성 상태 등을 변경.
피드백: 플레이어에게 변화에 대한 시각적(이펙트), 청각적(사운드), 또는 햅틱(진동) 피드백 제공.
움직이는 문, 파괴 가능한 상자, 위험 바닥은 모두 입력 감지, 판단, 환경 변화, 피드백, 정리 순서로 읽으면 블루프린트 구조가 선명해집니다.
- 시작 조건 감지
Trigger 시작 조건 감지 충돌, 입력, 시간, 게임 이벤트가 실행선을 만듭니다.
- 분기와 상태 확인
Decide 분기와 상태 확인 캐스팅, Branch, 체력, 태그 조건으로 행동을 고릅니다.
- 환경 오브젝트 변경
Change 환경 오브젝트 변경 물리 활성화, 위치 이동, 가시성, 콜리전을 조정합니다.
- 플레이어에게 결과 전달
Feedback 플레이어에게 결과 전달 Niagara, Sound, UI, 카메라 흔들림을 변화와 연결합니다.
- 수명과 재사용 정리
Cleanup 수명과 재사용 정리 Timer, Destroy Actor, Object Pool로 남은 액터를 관리합니다.
기본 구현 예시: 파괴 가능한 상자
플레이어가 총을 쏘면 부서지는 상자를 구현해봅시다.
이 예시는 물리 시뮬레이션, 콜리전, 이벤트 처리를 통합합니다.
파괴 가능한 상자 액터 블루프린트 생성
새 액터 블루프린트 생성: 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 (총알 액터) 블루프린트 열기: 총알 블루프린트가 없다면 Actor 기반 BP_Bullet을 생성하고, 최소 구성으로 Sphere Collision + Projectile Movement 컴포넌트를 추가한 뒤 진행합니다.
Sphere Collision의 On Component Hit 이벤트Other Actor를Cast To BP_DestructibleBox로 캐스팅합니다.- 캐스팅 성공 시,
Apply Damage노드를 호출합니다.Damaged Actor: 캐스팅된BP_DestructibleBoxBase Damage:25.0등으로 설정합니다.Damage Causer: 총알 액터(Self)Instigated By: 총알을 발사한 플레이어 컨트롤러 (Get Controller등)
- 총알 파괴: 데미지 적용 후
Destroy Actor노드를 호출하여 총알 액터를 파괴합니다.
노드 흐름 표준 표현
- 입력 이벤트:
Sphere Collision -> OnComponentHit - 분기:
Cast To BP_DestructibleBox성공 여부 - 핵심 노드:
Apply Damage(Base Damage=25.0)->Destroy Actor(Self) - 결과:
BP_DestructibleBox의Health가 감소하고,Health <= 0이면 물리 파괴/이펙트/정리 로직이 실행됩니다.
투사체가 박스에 닿으면 Hit/Overlap이 발생하고, 데미지 적용 뒤 체력이 0 이하이면 파괴 효과를 실행한다.
- Projectile hit 총알 컴포넌트
박스와 충돌
- Cast/Interface 데미지
받을 대상인지 확인
- Apply Damage 체력
damage 차감
- Break 0 이하이면 mesh/FX/sound
처리
| 점검 | 기준 |
|---|---|
| 중복 방지 | 이미 파괴된 상태에서는 추가 데미지 무시 |
| 피드백 | 피격 위치 기준 FX와 impulse |
| 핵심 | 충돌 이벤트와 상태 변경을 분리해서 읽는다 |
테스트 및 개선
레벨에 BP_DestructibleBox를 여러 개 배치하고 플레이어 캐릭터가 총을 쏘아 파괴되는 것을 확인합니다.
- 데미지 유형: 다른 종류의 데미지(폭발 데미지, 근접 데미지)에 따라 다르게 반응하도록
Damage Type Class를 활용합니다. - 다양한 파괴 단계: 상자가 한 번에 부서지지 않고, 금이 가거나 일부가 떨어져 나가는 등 여러 단계의 파괴 상태를 구현할 수 있습니다. (여러 개의 스태틱 메시 컴포넌트 사용 또는 머티리얼 변화)
- 파티클 시스템 연동: 총알이 닿을 때마다 스파크 이펙트를 생성하고, 파괴 시 연기 및 파편 이펙트를 추가합니다. (10장 2절 파티클 시스템 참조)
- 최적화: 너무 많은 파편 액터가 생성되지 않도록 수명을 제한하거나,
Object Pool패턴을 사용하여 재활용합니다.
실패 증상과 복구
-
증상: 총알이 상자를 맞췄는데 데미지가 적용되지 않음
- 원인:
OnComponentHit가 발생하지 않거나Cast To BP_DestructibleBox실패 - 복구:
BP_Bullet의Sphere Collision에서Simulation Generates Hit Events를 켜고, 상자 클래스가 실제로BP_DestructibleBox인지 확인합니다.
- 원인:
-
증상: 상자가 0 체력인데도 부서지지 않음
- 원인:
Branch(Health <= 0)경로 미연결 또는Set Simulate Physics미설정 - 복구:
Event AnyDamage -> Health 갱신 -> Branch -> True흐름이 끊기지 않았는지 점검하고Set Simulate Physics(true)를 확인합니다.
- 원인:
-
증상: 파괴 후 상자가 공중으로 과도하게 튀어오름
- 원인:
Add Impulse강도 과다 - 복구: 충격 벡터 크기를 절반 이하로 줄여 시작하고(
예: 1200 -> 600), 최종 게임 카메라 거리에서 다시 보정합니다.
- 원인:
총알, 스위치, 바닥 트랩은 시작 조건이 다르지만 입력 확인, 상태 판단, 환경 변화, 피드백이라는 같은 골격으로 설계할 수 있습니다.
- 감지
Hit, Overlap, 입력, Timer 중 가장 적은 빈도로 정확히 잡히는 이벤트를 고릅니다. 총알은 Hit, 발판은 Overlap, 자동 장치는 Timer가 자연스럽습니다.
- 대상 구분
Cast, Interface, Tag, Damage Type 중 대상 구분 방식 하나를 정하고 실패 경로도 둡니다. 실패하면 아무 일도 안 하는지, 안내 피드백을 줄지까지 결정합니다.
- 상태 변경
Health 감소, 문 열림, 물리 활성화처럼 저장해야 할 상태를 변수로 남깁니다. 한 번만 실행할 로직은 bDestroyed, bOpened 같은 가드가 필요합니다.
- 피드백
사운드, 이펙트, 카메라 흔들림, 제거 타이머를 결과와 같은 위치에서 호출합니다. 플레이어가 원인과 결과를 연결해 볼 수 있어야 합니다.
- 이벤트가 안 뜸
Generate Hit Events, Overlap 설정, 충돌 채널 응답을 먼저 봅니다.
- 판정이 실패함
실제 Other Actor 클래스와 Cast 대상, Tag 오타를 Print String으로 확인합니다.
- 결과가 약함
Impulse 크기, 물리 질량, 이펙트 위치, Destroy 타이밍을 분리해 조정합니다.
다른 동적 환경 상호작용 예시
-
움직이는 문/플랫폼
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에서 타이머를 해제합니다.
동적 환경 상호작용은 게임 월드가 플레이어 입력과 게임 이벤트에 반응하도록 만드는 방식입니다.
복잡한 시스템보다 작은 상호작용 단위부터 구현하고 확장하는 편이 안정적입니다.
상호작용 액터는 시작 조건, 상태 변화, 피드백, 정리 시점을 분리하면 테스트와 확장이 쉬워집니다.
파괴 상자·문·위험 구역은 같은 네 단계를 지나지만 끝나는 방식이 다릅니다. 진입과 정리를 한 쌍으로 설계해야 재사용해도 상태가 남지 않습니다.
- 1시작 사건
ENTRY Hit·BeginOverlap·입력 중 하나
- 2상태 잠금
GUARD 조건·DoOnce·Active로 중복 차단
- 3변화와 피드백
EFFECT 월드 상태·Niagara·사운드를 실행
- 4종료·정리
EXIT Timer·Collision·비동기 작업을 닫음
- 5파괴 상자
ONE-SHOT 진입 Damage → Health ≤ 0 종료 피드백 1회 → Destroy / 비활성
- 6움직이는 문
REVERSIBLE 진입 BeginOverlap → Timeline Play 종료 EndOverlap → Reverse → Idle
- 7위험 구역
SUSTAINED 진입 BeginOverlap → Timer Handle 저장 종료 EndOverlap → 같은 Handle Clear
이번 절에서는 플레이어의 행동이나 게임 이벤트에 따라 반응하고 변화하는 동적 환경 상호작용의 기본 구현 방법에 대해 알아보았습니다.
파괴 가능한 오브젝트, 움직이는 문, 물리 기반 스위치 등 다양한 예시를 통해 물리, 콜리전, 이벤트 처리의 통합적인 활용법을 살펴보았습니다.
파괴, 문, 스위치, 플랫폼 같은 상호작용은 감지, 조건, 상태 변경, 피드백 순서로 안정화합니다.
- 감지 기준
감지 Hit, Overlap, Trace 중 플레이어 행동과 가장 직접적인 입력 신호를 선택합니다.
- 조건 기준
Trigger 실행 조건 체력, 키 보유, 쿨다운처럼 실행 가능 여부를 Branch 앞에서 정리합니다.
- 피드백 기준
피드백 메시, 사운드, 파티클, UI를 상태 변경 뒤에 묶어 결과를 명확히 표시합니다.