환경과 상호작용하는 오브젝트 설정
이전 챕터들에서 조명, 날씨, 시간 같은 시각 요소와 물리 엔진, 충돌 같은 물리 요소를 다듬어 레벨의 기반을 만들었습니다.
이제는 그 기반 위에 플레이어의 행동이 실제로 세계를 바꾸는 환경 상호작용(Environmental Interaction)을 올릴 차례입니다. 문을 열고, 스위치를 누르고, 아이템을 줍는 순간처럼 월드가 즉시 반응할 때 게임은 훨씬 더 살아 있게 느껴집니다.
이번 절에서는 언리얼 엔진에서 이런 상호작용을 안정적으로 구성하는 방법을 단계적으로 다룹니다. 이 흐름을 익히고 나면 플레이어가 내가 세계에 영향을 주고 있다는 감각을 자연스럽게 전달할 수 있습니다.
환경 상호작용의 중요성
환경 상호작용은 게임 플레이의 핵심이자 레벨 디자인의 중요한 부분입니다.
- 몰입감 증대: 플레이어가 주변 환경에 영향을 미치고, 환경이 플레이어의 행동에 반응할 때 게임 세계는 더욱 현실적이고 몰입감 있게 느껴집니다.
- 게임 플레이 다양성: 스위치 조작, 문 열기, 퍼즐 풀이, 아이템 획득 등 다양한 상호작용은 게임 플레이에 깊이와 다양성을 더합니다.
- 내러티브 강화: 환경과의 상호작용은 스토리를 진행하거나, 세계관에 대한 정보를 제공하는 중요한 수단이 될 수 있습니다.
- 문제 해결 및 탐험 유도: 잠긴 문을 열거나 숨겨진 스위치를 찾는 등의 상호작용은 플레이어에게 문제 해결과 탐험의 동기를 부여합니다.
기본적인 환경 상호작용 구현 요소
언리얼 엔진에서 환경 상호작용을 구현하기 위해 주로 사용되는 액터, 컴포넌트, 그리고 개념들은 다음과 같습니다.
트리거 (Triggers)
트리거는 플레이어(또는 다른 액터)가 특정 영역에 진입하거나 이탈했을 때 이벤트를 발생시키는 투명한 볼륨입니다. 상호작용의 시작을 감지하는 가장 기본적인 방법입니다.
-
종류
- Box Collision (박스 충돌): 가장 흔히 사용되는 사각형 형태의 트리거.
- Sphere Collision (구 충돌): 원형 또는 구 형태의 트리거.
- Capsule Collision (캡슐 충돌): 캐릭터 충돌에 주로 사용되는 캡슐 형태의 트리거.
-
생성 및 설정
레벨 에디터의 모드(Modes) 패널에서
기본(Basic)탭을 선택하고,Box Trigger나Sphere Trigger를 레벨로 드래그 앤 드롭합니다. 또는 기존 액터에Box Collision등의 컴포넌트를 추가할 수도 있습니다.Details패널에서Collision섹션을 찾습니다.Collision PresetsOverlapOnlyPawn: 플레이어 캐릭터(Pawn)와만 오버랩 이벤트를 발생시킵니다.OverlapAll: 모든 오브젝트와 오버랩 이벤트를 발생시킵니다.Custom...: 특정 오브젝트 타입과만 오버랩하도록 세부 설정할 수 있습니다.
Generate Overlap Events: 이 옵션이 반드시 활성화되어 있어야 오버랩 이벤트가 발생합니다. -
블루프린트 활용
- 트리거 액터를 선택한 상태에서
Details패널 하단의Add Event버튼을 클릭하여OnComponentBeginOverlap(오버랩 시작)과OnComponentEndOverlap(오버랩 종료) 이벤트를 추가합니다. - 이벤트 그래프에서
Other Actor핀을Cast To PlayerCharacter(또는 여러분의 플레이어 클래스)로 연결하여, 오직 플레이어에 의해서만 이벤트가 발생하도록 필터링합니다.
- 트리거 액터를 선택한 상태에서
상호작용 가능한 오브젝트
문, 스위치, 아이템 등 플레이어가 직접 행동하여 조작하는 오브젝트입니다.
-
기본 구조
Static Mesh Component: 오브젝트의 시각적인 형태를 제공합니다. (예: 문의 뼈대, 스위치의 버튼 모델)
Collision Component: 플레이어가 상호작용 영역에 들어왔는지 감지하거나, 오브젝트와 물리적으로 충돌하는 역할을 합니다. (자세한 내용은 7장 2절 충돌 참고)
블루프린트 로직: 상호작용 시 실행될 행동을 정의합니다. (예: 문 열기 애니메이션 재생, 스위치 상태 변경)
-
상호작용 방식
- 트리거 기반: 플레이어가 오브젝트 근처의 특정 트리거 영역에 진입했을 때 상호작용 메시(예: E 키를 눌러 상호작용)를 표시하고, 플레이어가 키를 누르면 상호작용이 발생합니다.
- 시선 기반 (Line Trace): 플레이어의 카메라 시선이 오브젝트에 닿았을 때 상호작용 가능 여부를 판단하고, 키를 누르면 상호작용합니다. (자세한 내용은 8장 2절에서 다룸)
- 충돌 기반 (Hit Events): 오브젝트에 직접 부딪혔을 때 상호작용이 발생하는 경우. (예: 발로 차서 문 열기)
블루프린트 (Blueprints)
환경 상호작용 로직의 대부분은 블루프린트를 통해 구현됩니다.
- 액터 블루프린트: 문, 스위치, 아이템 등 각 상호작용 가능한 오브젝트를 개별적인 액터 블루프린트(
BP_Door,BP_Switch,BP_Item)로 만듭니다. - 이벤트 그래프:
OnComponentBeginOverlap,OnComponentEndOverlap, 그리고 플레이어 입력 이벤트(예:Input Action Interact)를 사용하여 상호작용 로직을 구현합니다. - 컴포넌트 조작:
Static Mesh컴포넌트의 가시성/위치/회전 변경,Timeline을 이용한 애니메이션,Play Sound at Location등의 노드를 사용하여 상호작용 결과를 시각적/청각적으로 표현합니다.
상호작용 가능한 오브젝트 구현 예시 (문 열기)
가장 기본적인 환경 상호작용인 문 오브젝트를 만들어 봅시다.
- 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭
블루프린트 클래스(Blueprint Class)선택. - 부모 클래스는
Actor로, 이름은BP_Door로 지정합니다.
컴포넌트 추가: BP_Door 블루프린트를 열고 컴포넌트(Components) 패널에서 다음을 추가합니다.
Static Mesh (DoorFrame): 문틀이 될 메시를 할당합니다. (예:SM_DoorFrame)Static Mesh (Door): 문짝이 될 메시를 할당합니다. (예:SM_Door)Door메시의 피벗(Pivot)이 문이 회전할 경첩 부분에 위치하도록 스태틱 메시 에디터에서 조정해야 합니다.
Box Collision (InteractionVolume): 문 앞에 놓일 트리거 볼륨입니다. 문이 열리는 영역이 됩니다.Details패널에서Collision Presets를OverlapOnlyPawn으로 설정하고Generate Overlap Events를 활성화합니다.
-
변수 추가
bIsOpen(Boolean): 문이 열려 있는지 닫혀 있는지 상태를 나타내는 변수.DoorMesh(Static Mesh Component Reference):DoorStatic Mesh 컴포넌트를 이 변수에 할당합니다.
-
오버랩 이벤트
InteractionVolume컴포넌트를 선택하고OnComponentBeginOverlap (InteractionVolume)이벤트를 추가합니다.OnComponentEndOverlap (InteractionVolume)이벤트를 추가합니다.- 두 이벤트 모두
Other Actor핀을Cast To PlayerCharacter로 연결하여 플레이어에 의해서만 작동하도록 합니다.
-
상호작용 UI 표시/숨김 (선택 사항)
OnComponentBeginOverlap시 플레이어 HUD에 E 키를 눌러 문 열기 같은 텍스트 위젯을 표시하는 로직을 추가합니다. (이때 위젯 블루프린트와 연결해야 합니다.)OnComponentEndOverlap시 해당 위젯을 제거합니다.
-
문 열림/닫힘 로직 (Input Event)
Input섹션에서 미리 정의된Interact액션 이벤트를 추가합니다. (또는 키보드E키 이벤트를 직접 사용)Interact이벤트가 발생했을 때,InteractionVolume에 플레이어가 오버랩되어 있는지 확인합니다. (Is Overlapping Actor노드 사용)- 만약 오버랩 상태이고,
bIsOpen변수가False라면 문을 여는 로직을 실행합니다.True라면 문을 닫는 로직을 실행합니다. (Branch노드와FlipFlop노드를 조합하면 편리합니다.) -
문 회전 (Timeline 사용)
Timeline노드를 추가하고 이름을DoorAnimation으로 지정합니다.DoorAnimation더블클릭하여 타임라인 에디터를 엽니다.Track에Add Float Track을 추가하고 이름을Alpha로 지정합니다.Alpha트랙에 키를 추가합니다. (예: 시간 0.0, 값 0.0)두 번째 키를 추가합니다. (예: 시간 1.0, 값 1.0)
Use Curve옵션을 사용하여 부드러운 애니메이션 커브를 선택합니다.Timeline노드의Update핀에서Lerp (Rotator)노드를 사용합니다.A핀: 닫힌 문의 회전 (Get Relative Rotation (Door))B핀: 열린 문의 회전 (예:Y축을90도 회전한 값)Alpha핀: 타임라인의Alpha출력 핀 연결
Lerp (Rotator)의 결과를Set Relative Rotation (Door)노드의New Rotation핀에 연결합니다.DoorAnimation타임라인의Play핀을 문 여는 로직에,Reverse핀을 문 닫는 로직에 연결합니다.문이 완전히 열리거나 닫혔을 때
bIsOpen변수 값을 토글합니다. (Finished핀에서.)
- 사운드 추가:
Play Sound at Location노드를 사용하여 문이 열리거나 닫힐 때 적절한 사운드를 재생합니다.
상호작용 구현의 최적화 및 고려 사항
- 블루프린트 vs C++: 복잡하고 성능에 민감한 상호작용은 C++로 구현하는 것이 유리할 수 있지만, 대부분의 기본적인 상호작용은 블루프린트로 충분합니다.
- 충돌 설정의 중요성:
Trigger Volume과 상호작용 오브젝트의 충돌 설정이 정확해야 합니다. 불필요한Block설정은 피하고, 필요한 곳에만Overlap을 사용합니다. - 컴포넌트 구조화: 상호작용 로직이 복잡해질수록 블루프린트 내의 컴포넌트들을 논리적으로 그룹화하고 이름을 명확하게 지정합니다.
- 입력 매핑:
프로젝트 세팅(Project Settings) > 엔진(Engine) > 입력(Input)에서Action Mappings또는Enhanced Input을 사용하여 상호작용 키를 설정하는 것이 좋습니다. - 피드백: 상호작용이 발생했을 때 플레이어에게 시각적(UI, 이펙트), 청각적(사운드), 또는 햅틱(진동) 피드백을 제공하여 몰입도를 높입니다.
- 상호작용 우선순위: 여러 상호작용 가능한 오브젝트가 겹쳐 있을 때 어떤 오브젝트와 상호작용할지 결정하는 로직을 고려합니다. (예: 가장 가까운 오브젝트, 시선에 있는 오브젝트)
환경 상호작용 구현은 레벨에 생명력을 불어넣고 플레이어에게 끊임없이 새로운 경험을 제공하는 핵심 요소입니다. 이 절에서 배운 트리거, 상호작용 가능한 오브젝트의 구조, 그리고 블루프린트 로직을 활용하여 여러분의 레벨에 다양한 상호작용 요소를 추가해 보세요. 플레이어가 여러분의 게임 세계와 직접 소통하고 영향을 미치는 경험을 선사하는 것이 중요합니다.