icon
8장 : 환경 상호작용 구현

환경과 상호작용하는 오브젝트 설정


이전 챕터들에서 레벨의 시각적 요소(조명, 날씨, 시간)와 물리적 요소(물리 엔진, 충돌)를 구축하고 최적화하는 방법을 배웠습니다. 이제 이러한 기반 위에 레벨을 더욱 살아있게 만들고 플레이어에게 몰입감을 선사할 핵심 요소, 바로 환경 상호작용(Environmental Interaction) 구현에 대해 알아볼 차례입니다. 환경 상호작용은 플레이어가 오브젝트와 단순한 충돌을 넘어, 문을 열고, 스위치를 조작하고, 아이템을 줍는 등 다양한 방식으로 게임 세계와 직접적으로 소통하는 것을 의미합니다. '나 혼자 언리얼 기본' 교재를 통해 여러분이 언리얼 엔진에서 환경 상호작용을 구현하고, 이를 통해 플레이어에게 더욱 반응적이고 풍부한 경험을 제공할 수 있도록 안내해 드리겠습니다. 마치 살아있는 세계의 모든 요소가 서로 영향을 주고받듯, 여러분의 레벨도 상호작용을 통해 생명력을 얻게 될 것입니다.


환경 상호작용의 중요성

환경 상호작용은 게임 플레이의 핵심이자 레벨 디자인의 중요한 부분입니다.

  • 몰입감 증대: 플레이어가 주변 환경에 영향을 미치고, 환경이 플레이어의 행동에 반응할 때 게임 세계는 더욱 현실적이고 몰입감 있게 느껴집니다.
  • 게임 플레이 다양성: 스위치 조작, 문 열기, 퍼즐 풀이, 아이템 획득 등 다양한 상호작용은 게임 플레이에 깊이와 다양성을 더합니다.
  • 내러티브 강화: 환경과의 상호작용은 스토리를 진행하거나, 세계관에 대한 정보를 제공하는 중요한 수단이 될 수 있습니다.
  • 문제 해결 및 탐험 유도: 잠긴 문을 열거나 숨겨진 스위치를 찾는 등의 상호작용은 플레이어에게 문제 해결과 탐험의 동기를 부여합니다.

기본적인 환경 상호작용 구현 요소

언리얼 엔진에서 환경 상호작용을 구현하기 위해 주로 사용되는 액터, 컴포넌트, 그리고 개념들은 다음과 같습니다.

트리거 (Triggers)

트리거는 플레이어(또는 다른 액터)가 특정 영역에 진입하거나 이탈했을 때 이벤트를 발생시키는 투명한 볼륨입니다. 상호작용의 시작을 감지하는 가장 기본적인 방법입니다.

  • 종류
    • Box Collision (박스 충돌): 가장 흔히 사용되는 사각형 형태의 트리거.
    • Sphere Collision (구 충돌): 원형 또는 구 형태의 트리거.
    • Capsule Collision (캡슐 충돌): 캐릭터 충돌에 주로 사용되는 캡슐 형태의 트리거.
  • 생성 및 설정

    레벨 에디터의 모드(Modes) 패널에서 기본(Basic) 탭을 선택하고, Box TriggerSphere Trigger를 레벨로 드래그 앤 드롭합니다. 또는 기존 액터에 Box Collision 등의 컴포넌트를 추가할 수도 있습니다.

    Details 패널에서 Collision 섹션을 찾습니다.

    Collision Presets

    • OverlapOnlyPawn: 플레이어 캐릭터(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 PresetsOverlapOnlyPawn 으로 설정하고 Generate Overlap Events활성화합니다.

이벤트 그래프 로직 (문 열기/닫기)

  • 변수 추가
    • bIsOpen (Boolean): 문이 열려 있는지 닫혀 있는지 상태를 나타내는 변수.
    • DoorMesh (Static Mesh Component Reference): Door Static 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 더블클릭하여 타임라인 에디터를 엽니다.

      TrackAdd 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, 이펙트), 청각적(사운드), 또는 햅틱(진동) 피드백을 제공하여 몰입도를 높입니다.
  • 상호작용 우선순위: 여러 상호작용 가능한 오브젝트가 겹쳐 있을 때 어떤 오브젝트와 상호작용할지 결정하는 로직을 고려합니다. (예: 가장 가까운 오브젝트, 시선에 있는 오브젝트)

환경 상호작용 구현은 레벨에 생명력을 불어넣고 플레이어에게 끊임없이 새로운 경험을 제공하는 핵심 요소입니다. 이 절에서 배운 트리거, 상호작용 가능한 오브젝트의 구조, 그리고 블루프린트 로직을 활용하여 여러분의 레벨에 다양한 상호작용 요소를 추가해 보세요. 플레이어가 여러분의 게임 세계와 직접 소통하고 영향을 미치는 경험을 선사하는 것이 중요합니다.