8장 : 환경 상호작용 구현
동적 오브젝트 및 상호작용
UI로 상호작용 신호를 전달했다면, 이제는 그 결과를 월드 안에서 직접 체감하게 만들어야 합니다.
이번 절의 주제는 동적 오브젝트 반응입니다. 문이 열리고, 스위치가 움직이고, 플랫폼이 올라가는 변화는 단순한 연출을 넘어 플레이어에게 입력한 행동이 실제로 반영됐다는 확신을 줍니다.
여기서는 언리얼 엔진에서 동적 반응을 안정적으로 구현하는 흐름을 다룹니다. 적용이 끝나면 레벨은 정적인 배경이 아니라 플레이어 행동에 응답하는 공간으로 바뀝니다.
동적 오브젝트 변화의 중요성
플레이어의 상호작용에 대한 환경의 동적 반응은 게임 플레이와 몰입감에 핵심적인 영향을 미칩니다.
- 즉각적인 피드백: 플레이어의 행동이 게임 세계에 즉각적인 영향을 미쳐, 자신의 행동에 대한 보상을 느끼고 만족감을 얻습니다.
- 게임 플레이의 흐름: 문이 열리거나 플랫폼이 움직이는 것은 단순히 시각적 효과를 넘어, 플레이어가 다음 지역으로 이동하거나 새로운 퍼즐을 해결하는 게임 플레이의 흐름을 만듭니다.
- 세계의 생명력 부여: 정적인 배경이 아닌, 플레이어의 행동에 반응하는 살아있는 세계라는 인상을 줍니다.
- 내러티브 전달: 특정 오브젝트의 변화가 스토리 진행의 단서가 되거나, 세계의 비밀을 드러내는 역할을 할 수 있습니다.
동적 오브젝트 변화를 위한 핵심 기술
언리얼 엔진에서 오브젝트의 동적 변화를 구현할 때 주로 사용되는 기술들입니다.
타임라인 (Timeline)
- 역할: 시간에 따른 값의 변화를 그래픽적으로 정의하여, 오브젝트의 위치, 회전, 스케일, 또는 머티리얼 파라미터 등을 부드럽게 보간(Lerp)하는 데 사용됩니다.
- 장점: 복잡한 애니메이션 코딩 없이 직관적으로 오브젝트의 움직임을 제어할 수 있습니다.
-
주요 기능
- Float Track: 시간에 따른 단일 부동 소수점 값(예: 0.0에서 1.0까지) 변화를 정의합니다.
- Vector Track: 시간에 따른 3D 벡터 값(위치, 스케일 등) 변화를 정의합니다.
- Event Track: 특정 시간 지점에 이벤트를 발생시켜 사운드 재생, 파티클 스폰 등을 트리거할 수 있습니다.
Play: 타임라인을 처음부터 재생합니다.Reverse: 타임라인을 현재 위치에서 역재생합니다.Stop: 타임라인 재생을 멈춥니다.Update: 매 프레임마다 현재 타임라인의 값을 출력하여 오브젝트 속성에 적용할 수 있도록 합니다.Finished: 타임라인 재생이 끝났을 때 이벤트를 발생시킵니다.
- 활용 예시: 문 열기/닫기, 플랫폼 이동, 조명 밝기 변화, 깃발 흔들림 등.
머티리얼 파라미터 (Material Parameters) 제어
- 역할: 오브젝트에 적용된 재질(Material)의 특정 값을 블루프린트에서 동적으로 변경하여 시각적 효과를 부여합니다.
-
주요 노드
Set Scalar Parameter Value on Materials: 단일Float값 파라미터 변경.Set Vector Parameter Value on Materials:Vector(색상, 위치 등) 값 파라미터 변경.Set Material: 오브젝트의 재질 자체를 변경합니다.
-
활용 예시
- 상호작용 시 오브젝트의 색상 변경 (하이라이트, 활성화/비활성화 상태 표시)
- 스위치를 누르면 불빛이 켜지는 효과 (Emissive 파라미터 조절)
- 벽이 파괴될 때 금이 가거나 텍스처가 변하는 효과
- 물에 젖었을 때 오브젝트의 러프니스(Roughness) 변경 (8장 4절 날씨 효과 참조)
다. 물리 시뮬레이션 제어
- 역할: 오브젝트에 힘을 가하거나, 물리 시뮬레이션 상태를 변경하여 동적인 움직임을 유발합니다.
-
주요 노드
Add Impulse: 오브젝트에 순간적인 힘을 가합니다. (예: 총알에 맞거나 폭발로 날아감)Add Force: 오브젝트에 지속적인 힘을 가합니다. (예: 바람에 의해 움직이는 오브젝트)Set Simulate Physics: 오브젝트의 물리 시뮬레이션 활성화/비활성화.Set Physics Linear/Angular Velocity: 오브젝트의 선형/각속도를 직접 설정합니다.
-
활용 예시
- 플레이어가 스위치를 누르면 특정 오브젝트가 밀려나거나 떨어지는 퍼즐.
- 문이 파괴될 때 잔해가 물리 시뮬레이션되어 흩어지는 효과.
- 특정 조건 만족 시 캐릭터가 래그돌 상태로 전환.
스폰/디스폰 및 가시성 제어
- 역할: 특정 조건에 따라 오브젝트를 생성하거나 제거하고, 보이거나 보이지 않게 하여 환경을 동적으로 변화시킵니다.
-
주요 노드
Spawn Actor From Class: 새로운 액터를 레벨에 생성합니다. (예: 파괴 시 파편 생성, 특정 시간에 몬스터 스폰)Destroy Actor: 액터를 레벨에서 제거합니다. (예: 주운 아이템 제거, 파괴된 오브젝트 제거)Set Visibility: 액터나 컴포넌트의 가시성을 토글합니다. (예: 숨겨진 길 나타내기, 아이템 숨기기)
-
활용 예시
- 플레이어가 퍼즐을 풀면 숨겨진 길이 나타나는 효과.
- 트리거 영역에 진입 시 함정이 나타나는 효과.
- 아이템 획득 시 해당 아이템 메시를 제거.
동적 오브젝트 및 상호작용 구현 예시
이동하는 플랫폼을 만들어 플레이어 상호작용으로 제어해 봅시다.
새로운 액터 블루프린트 생성: BP_MovingPlatform 이라는 이름의 액터 블루프린트를 생성합니다.
컴포넌트 추가
Static Mesh (PlatformMesh): 플랫폼이 될 스태틱 메시를 할당합니다. (예:Cube또는SM_Platform)Box Collision (InteractionTrigger): 플랫폼을 작동시킬 트리거 볼륨.Collision Presets를OverlapOnlyPawn,Generate Overlap Events활성화.
변수 추가
StartLocation(Vector): 플랫폼의 시작 위치. (EditAnywhere로 설정하여 레벨에서 직접 설정 가능)EndLocation(Vector): 플랫폼의 목표 위치. (EditAnywhere)MoveSpeed(Float): 플랫폼 이동 속도. (EditAnywhere)bIsMoving(Boolean): 플랫폼이 현재 움직이는지 여부.TargetLocation(Vector): 현재 플랫폼이 향하고 있는 목표 위치.
이벤트 그래프 로직
-
Event BeginPlayStartLocation변수에Get Actor Location(Self)의 현재 위치를 저장합니다.TargetLocation을StartLocation으로 초기화합니다.
-
InteractionTrigger오버랩 이벤트OnComponentBeginOverlap (InteractionTrigger)시Cast To PlayerCharacter로 플레이어 감지.OnComponentEndOverlap (InteractionTrigger)시 플레이어 이탈 감지.- 오버랩 중인 동안 UI 프롬프트 표시 (8장 2절 참고).
-
상호작용 입력 이벤트
- 플레이어 캐릭터 블루프린트에서
Input Action Interact이벤트가 발생했을 때,Get Overlapping Actors(InteractionTrigger) 노드를 사용하여 플레이어가 오버랩 중인지 확인합니다. - 만약 오버랩 중이고
bIsMoving이False라면-
Set bIsMoving을True로 설정합니다. TargetLocation을StartLocation과EndLocation중 현재 위치에서 먼 쪽으로 전환합니다. (Distance노드를 사용하여 현재 위치와StartLocation,EndLocation중 어느 것이 더 가까운지 판단하여TargetLocation을 설정합니다.)
-
- 플레이어 캐릭터 블루프린트에서
-
Event Tick에서 플랫폼 이동 로직Branch노드를 사용하여bIsMoving이True일 때만 이동 로직을 실행합니다.-
Lerp (Vector)A핀:Get Actor Location (Self)B핀:TargetLocationAlpha핀:Get World Delta Seconds * MoveSpeed(또는MoveSpeed변수를 직접 사용하여Alpha에Timeline연결)- 결과를
Set Actor Location (Self)노드에 연결합니다.
- 도착 감지:
Get Distance To(Self와 TargetLocation) 노드를 사용하여 플랫폼이 목표 위치에 충분히 가까워졌는지 확인합니다. (예: 거리가 10.0cm 미만) - 도착했다면
Set bIsMoving을False로 설정하고, 필요하다면TargetLocation을 다음 목적지로 설정합니다. (단방향/양방향 이동 로직에 따라 다름)
- 사운드 및 파티클: 플랫폼이 움직이기 시작할 때 사운드를 재생하고, 움직이는 동안 먼지 파티클을 생성하는 등의 효과를 추가합니다.
텍스트 기반 재현 기준
시각 자료 없이 동일한 결과를 재현하려면 아래 값부터 고정하고 시작하는 것이 좋습니다.
- 에디터 경로:
BP_MovingPlatform열기 ->Components에서InteractionTrigger선택 ->Details > Collision -
필수 입력값
InteractionTrigger > Collision Presets:OverlapOnlyPawnInteractionTrigger > Generate Overlap Events:TrueMoveSpeed:1.5EndLocation:StartLocation기준Z + 300- 도착 판정 거리:
10.0cm
-
기대 결과
- 상호작용 키를 1회 누르면 플랫폼이 약 2~3초 동안 상승합니다.
- 목표 위치 도달 후
bIsMoving이False로 전환되어 추가 이동이 멈춥니다. - 다시 상호작용하면 시작 위치로 역방향 이동합니다.
라이트맵 실패 증상과 복구
-
증상: 상호작용 키를 눌러도 플랫폼이 안 움직임
- 원인: 오버랩 감지 실패 또는
bIsMoving분기 연결 누락 - 복구:
OnComponentBeginOverlap의 캐스팅 성공 핀이Input Action Interact조건 분기로 이어지는지 확인합니다.
- 원인: 오버랩 감지 실패 또는
-
증상: 플랫폼이 떨리면서 목표점에 수렴하지 않음
- 원인:
Lerp의Alpha가 과도하거나 도착 판정 거리 값이 0에 가까움 - 복구:
MoveSpeed를1.0~2.0범위에서 다시 맞추고, 도착 판정 거리를10.0cm이상으로 설정합니다.
- 원인:
-
증상: 플랫폼이 너무 빠르게 순간이동함
- 원인:
Set Actor Location입력이Lerp결과가 아닌TargetLocation직접 연결 - 복구:
Set Actor Location의New Location핀이 반드시Lerp(Vector)결과를 받도록 노드 연결을 정리합니다.
- 원인:
동적 오브젝트 및 상호작용 최적화
-
타임라인의 효율적 사용
- 너무 많은 타임라인을 동시에 재생하지 않도록 합니다.
- 불필요하게 긴 타임라인이나 복잡한 키프레임은 피합니다.
-
물리 시뮬레이션 제한
- 오브젝트가 반드시 물리 시뮬레이션될 필요가 없다면
Set Actor Location/Rotation/Scale등 직접적인 트랜스폼(Transform) 조작을 사용합니다. 물리 시뮬레이션은 성능 비용이 더 큽니다. - 파괴 가능한 오브젝트의 경우, 파편의 물리 시뮬레이션 시간을 제한하거나, 일정 시간이 지나면 파편을 제거(
Destroy Actor)하여 성능 부하를 줄입니다.
- 오브젝트가 반드시 물리 시뮬레이션될 필요가 없다면
-
가시성 (Visibility) 및 컬링 (Culling)
- 화면에 보이지 않는 동적 오브젝트는 애니메이션이나 물리 시뮬레이션을 일시 중지하여 성능을 최적화합니다. 언리얼 엔진은 기본적으로 시야 밖의 오브젝트를 컬링하지만, 복잡한 블루프린트 로직은 직접 최적화해야 할 수 있습니다.
- 컴포넌트 분리: 복잡한 상호작용 로직은 여러 개의 컴포넌트나 자식 블루프린트로 나누어 관리하면 가독성과 최적화에 용이합니다.
- 네트워크 레플리케이션 고려: 멀티플레이어 게임에서는 동적 오브젝트의 상태(위치, 움직임, 활성화 여부)가 모든 클라이언트에 정확하게 동기화되어야 합니다.
Replication설정을 신중하게 구성해야 합니다.
동적 오브젝트 상호작용은 레벨을 살아 있는 공간으로 보이게 만드는 핵심 요소입니다.
타임라인 애니메이션, 머티리얼 파라미터 제어, 물리 시뮬레이션, 스폰/디스폰과 가시성 제어를 함께 적용하면 반응의 밀도를 높일 수 있습니다. 플레이어가 탐험 중에 행동하면 세계가 바뀐다는 경험을 계속 받도록 설계해 보세요.