본문으로 건너뛰기

안동민 개발노트

본문 시작

동적 오브젝트 및 상호작용

타임라인·애니메이션·물리 제어로 문·스위치·플랫폼이 입력에 반응하게 만들고 동적 상태를 안정적으로 관리합니다.

UI로 상호작용 신호를 전달했다면, 이제는 그 결과를 월드 안에서 직접 체감하게 만들어야 합니다.

이번 절의 주제는 동적 오브젝트 반응입니다.

문이 열리고, 스위치가 움직이고, 플랫폼이 올라가는 변화는 단순한 연출을 넘어 플레이어에게 입력한 행동이 실제로 반영됐다는 확신을 줍니다.

여기서는 언리얼 엔진에서 동적 반응을 안정적으로 구현하는 흐름을 다룹니다.

적용이 끝나면 레벨은 정적인 배경이 아니라 플레이어 행동에 응답하는 공간으로 바뀝니다.

입력한 행동이 월드 변화로 보이는 흐름

상호작용 오브젝트는 입력 검증, 상태 전환, 결과 피드백을 분리해야 반복 실행과 충돌에도 안정적입니다.

입력에서 월드 피드백까지의 책임 분리
구간확인할 것실행 대상보이는 결과
Trigger 키 입력, 클릭, 오버랩대상 액터와 거리상호작용 이벤트입력 인지 소리, 하이라이트, 프롬프트
Gate 조건 검사잠김, 재사용 대기, 중복 실행분기와 상태 플래그실패 피드백 잠김 표시, 경고음
State 실제 변화타임라인, 물리, 머티리얼문, 플랫폼, 조명, 스폰월드 변화 열림, 이동, 색 변화
Recover 마무리재입력 허용과 원상복구타이머, 충돌, 안내 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: 액터나 컴포넌트의 가시성을 토글합니다. (예: 숨겨진 길 나타내기, 아이템 숨기기)
  • 활용 예시
    • 플레이어가 퍼즐을 풀면 숨겨진 길이 나타나는 효과.
    • 트리거 영역에 진입 시 함정이 나타나는 효과.
    • 아이템 획득 시 해당 아이템 메시를 제거.
오브젝트 반응에 맞는 구현 기술 고르기

같은 상호작용이라도 움직임, 시각 상태, 물리 힘, 생성 여부 중 무엇을 바꾸는지에 따라 선택할 블루프린트 도구가 달라집니다.

  1. matrix
    반응 유형별 우선 선택

    matrix Timeline 문 회전, 플랫폼 이동, 조명 밝기처럼 시간에 따른 값을 안정적으로 보간할 때 먼저 고려합니다. Material 활성화 색상, Emissive, 젖음 효과처럼 메시 위치는 그대로 두고 보이는 상태만 바꿀 때 적합합니다. Physics 폭발, 밀림, 낙하처럼 충돌과 질량이 결과를 결정해야 할 때만 물리 시뮬레이션 비용을 씁니다. Spawn 아이템 획득, 함정 등장, 숨겨진 길 표시처럼 액터 생성·제거·가시성 토글이 핵심일 때 사용합니다.

  2. Timeline
    부드러운 위치 변화

    Timeline 문 회전, 플랫폼 이동, 조명 밝기처럼 시간에 따른 값을 안정적으로 보간할 때 먼저 고려합니다.

  3. Material
    표면 상태 표시

    Material 활성화 색상, Emissive, 젖음 효과처럼 메시 위치는 그대로 두고 보이는 상태만 바꿀 때 적합합니다.

  4. Physics
    힘을 받은 움직임

    Physics 폭발, 밀림, 낙하처럼 충돌과 질량이 결과를 결정해야 할 때만 물리 시뮬레이션 비용을 씁니다.

  5. Spawn
    존재 여부 변경

    Spawn 아이템 획득, 함정 등장, 숨겨진 길 표시처럼 액터 생성·제거·가시성 토글이 핵심일 때 사용합니다.

  6. guard
    선택 전에 확인할 질문

    guard 1 매 프레임 움직임이 필요한가? 필요하면 Timeline 또는 Tick 보간, 아니면 이벤트성 변경으로 줄입니다. 2 반응 중 재입력을 받아도 되는가? 중복 실행이 위험하면 상태 플래그로 입력을 잠그고 완료 시 해제합니다. 3 플레이어가 결과를 즉시 읽을 수 있는가? 움직임만 약하면 사운드, 빛, UI 프롬프트를 함께 붙입니다.


동적 오브젝트 및 상호작용 구현 예시

이동 플랫폼은 트리거, Timeline, 위치 보간, 복귀 상태로 움직인다

동적 오브젝트는 이벤트 하나보다 감지, 시간 기반 변화, 중복 실행 방지, 복귀 조건을 함께 설계해야 한다.

  1. Trigger

    플레이어 진입을 감지한다.

  2. BeginOverlap

    플랫폼 동작 시작 신호를 만든다.

  3. Timeline

    Alpha 값을 시간에 따라 갱신한다.

  4. Set Location

    시작 위치와 목표 위치를 보간한다.

  5. Reverse/Reset

    복귀하거나 다음 입력을 기다린다.

기준판정
상태 플래그이미 이동 중인지 확인해 중복 실행을 막는다.
재사용 변수속도, 거리, 방향을 변수로 빼 다른 플랫폼에도 적용한다.

이동하는 플랫폼을 만들어 플레이어 상호작용으로 제어해 봅시다.

새로운 액터 블루프린트 생성: BP_MovingPlatform 이라는 이름의 액터 블루프린트를 생성합니다.

컴포넌트 추가
  • Static Mesh (PlatformMesh): 플랫폼이 될 스태틱 메시를 할당합니다. (예: Cube 또는 SM_Platform)
  • Box Collision (InteractionTrigger): 플랫폼을 작동시킬 트리거 볼륨. Collision PresetsOverlapOnlyPawn, Generate Overlap Events 활성화.
변수 추가
  • StartLocation (Vector): 플랫폼의 시작 위치. (EditAnywhere로 설정하여 레벨에서 직접 설정 가능)
  • EndLocation (Vector): 플랫폼의 목표 위치. (EditAnywhere)
  • MoveSpeed (Float): 플랫폼 이동 속도. (EditAnywhere)
  • bIsMoving (Boolean): 플랫폼이 현재 움직이는지 여부.
  • TargetLocation (Vector): 현재 플랫폼이 향하고 있는 목표 위치.
이벤트 그래프 로직
  • Event BeginPlay
    • StartLocation 변수에 Get Actor Location (Self)의 현재 위치를 저장합니다.
    • TargetLocationStartLocation으로 초기화합니다.
  • InteractionTrigger 오버랩 이벤트
    • OnComponentBeginOverlap (InteractionTrigger)Cast To PlayerCharacter로 플레이어 감지.
    • OnComponentEndOverlap (InteractionTrigger) 시 플레이어 이탈 감지.
    • 오버랩 중인 동안 UI 프롬프트 표시 (8장 2절 참고).
  • 상호작용 입력 이벤트
    • 플레이어 캐릭터 블루프린트에서 Input Action Interact 이벤트가 발생했을 때, Get Overlapping Actors (InteractionTrigger) 노드를 사용하여 플레이어가 오버랩 중인지 확인합니다.
    • 만약 오버랩 중이고 bIsMovingFalse라면
      • Set bIsMovingTrue로 설정합니다.
      • TargetLocationStartLocationEndLocation 중 현재 위치에서 먼 쪽으로 전환합니다. (Distance 노드를 사용하여 현재 위치와 StartLocation, EndLocation 중 어느 것이 더 가까운지 판단하여 TargetLocation을 설정합니다.)
  • Event Tick에서 플랫폼 이동 로직
    • Branch 노드를 사용하여 bIsMovingTrue일 때만 이동 로직을 실행합니다.
    • Lerp (Vector)
      • A 핀: Get Actor Location (Self)
      • B 핀: TargetLocation
      • Alpha 핀: Get World Delta Seconds * MoveSpeed (또는 MoveSpeed 변수를 직접 사용하여 AlphaTimeline 연결)
      • 결과를 Set Actor Location (Self) 노드에 연결합니다.
    • 도착 감지: Get Distance To (Self와 TargetLocation) 노드를 사용하여 플랫폼이 목표 위치에 충분히 가까워졌는지 확인합니다. (예: 거리가 10.0cm 미만)
    • 도착했다면 Set bIsMovingFalse로 설정하고, 필요하다면 TargetLocation을 다음 목적지로 설정합니다. (단방향/양방향 이동 로직에 따라 다름)
  • 사운드 및 파티클: 플랫폼이 움직이기 시작할 때 사운드를 재생하고, 움직이는 동안 먼지 파티클을 생성하는 등의 효과를 추가합니다.

텍스트 기반 재현 기준

시각 자료 없이 동일한 결과를 재현하려면 아래 값부터 고정하고 시작하는 것이 좋습니다.

  • 에디터 경로: BP_MovingPlatform 열기 -> Components에서 InteractionTrigger 선택 -> Details > Collision
  • 필수 입력값
    • InteractionTrigger > Collision Presets: OverlapOnlyPawn
    • InteractionTrigger > Generate Overlap Events: True
    • MoveSpeed: 1.5
    • EndLocation: StartLocation 기준 Z + 300
    • 도착 판정 거리: 10.0cm
  • 기대 결과
    • 상호작용 키를 1회 누르면 플랫폼이 약 2~3초 동안 상승합니다.
    • 목표 위치 도달 후 bIsMovingFalse로 전환되어 추가 이동이 멈춥니다.
    • 다시 상호작용하면 시작 위치로 역방향 이동합니다.

상호작용 실패 증상과 복구

  • 증상: 상호작용 키를 눌러도 플랫폼이 안 움직임
    • 원인: 오버랩 감지 실패 또는 bIsMoving 분기 연결 누락
    • 복구: OnComponentBeginOverlap의 캐스팅 성공 핀이 Input Action Interact 조건 분기로 이어지는지 확인합니다.
  • 증상: 플랫폼이 떨리면서 목표점에 수렴하지 않음
    • 원인: LerpAlpha가 과도하거나 도착 판정 거리 값이 0에 가까움
    • 복구: MoveSpeed1.0~2.0 범위에서 다시 맞추고, 도착 판정 거리를 10.0cm 이상으로 설정합니다.
  • 증상: 플랫폼이 너무 빠르게 순간이동함
    • 원인: Set Actor Location 입력이 Lerp 결과가 아닌 TargetLocation 직접 연결
    • 복구: Set Actor LocationNew Location 핀이 반드시 Lerp(Vector) 결과를 받도록 노드 연결을 정리합니다.

동적 오브젝트는 움직임 방식마다 비용과 안정성이 다릅니다.

아래 보드처럼 연출 목적에 맞춰 타임라인, 머티리얼, 물리, 스폰 제어를 고르면 과한 구현을 피할 수 있습니다.

오브젝트 반응은 목적에 맞는 구현 도구 우선 선택

같은 움직임도 타임라인, 물리, 머티리얼, 스폰 제어 중 무엇으로 구현하느냐에 따라 비용과 디버깅 포인트가 달라집니다.

  1. 정해진 움직임

    Timeline 문, 엘리베이터, 회전 장치처럼 시작과 끝이 명확할 때 적합합니다. 오브젝트 반응 점검 항목 Update 핀, Reverse 경로, Finished 상태 토글

  2. 상태 시각화

    Material 전원, 오염, 활성화처럼 형태보다 표면 반응이 중요할 때 씁니다. 오브젝트 반응 점검 항목 동적 머티리얼 인스턴스와 파라미터 이름

  3. 예측 어려운 반응

    Physics 충격, 파괴, 밀림처럼 자연스러운 불규칙성이 필요할 때만 사용합니다. 오브젝트 반응 점검 항목 충돌 복잡도, 질량, Sleep Threshold, 네트워크 동기화

  4. 존재 변화

    Spawn 아이템 획득, 파편 생성, 함정 등장처럼 액터 수가 바뀔 때 사용합니다. 오브젝트 반응 점검 항목 생성 위치, 수명, 재사용 가능 여부, 정리 타이머


동적 오브젝트 및 상호작용 최적화

  • 타임라인의 효율적 사용
    • 너무 많은 타임라인을 동시에 재생하지 않도록 합니다.
    • 불필요하게 긴 타임라인이나 복잡한 키프레임은 피합니다.
  • 물리 시뮬레이션 제한
    • 오브젝트가 반드시 물리 시뮬레이션될 필요가 없다면 Set Actor Location/Rotation/Scale 등 직접적인 트랜스폼(Transform) 조작을 사용합니다. 물리 시뮬레이션은 성능 비용이 더 큽니다.
    • 파괴 가능한 오브젝트의 경우, 파편의 물리 시뮬레이션 시간을 제한하거나, 일정 시간이 지나면 파편을 제거(Destroy Actor)하여 성능 부하를 줄입니다.
  • 가시성 (Visibility) 및 컬링 (Culling)
    • 화면에 보이지 않는 동적 오브젝트는 애니메이션이나 물리 시뮬레이션을 일시 중지하여 성능을 최적화합니다. 언리얼 엔진은 기본적으로 시야 밖의 오브젝트를 컬링하지만, 복잡한 블루프린트 로직은 직접 최적화해야 할 수 있습니다.
  • 컴포넌트 분리: 복잡한 상호작용 로직은 여러 개의 컴포넌트나 자식 블루프린트로 나누어 관리하면 가독성과 최적화에 용이합니다.
  • 네트워크 레플리케이션 고려: 멀티플레이어 게임에서는 동적 오브젝트의 상태(위치, 움직임, 활성화 여부)가 모든 클라이언트에 정확하게 동기화되어야 합니다. Replication 설정을 신중하게 구성해야 합니다.

동적 오브젝트는 위치만 맞추는 것보다 현재 상태를 명확히 관리해야 반복 입력, 복귀, 네트워크 동기화에서 흔들리지 않습니다.

움직임보다 현재 상태를 먼저 동기화한다

플랫폼, 문, 함정은 위치만 맞아도 끝나지 않습니다. 입력 가능 여부, 진행 중 상태, 완료 상태를 같은 기준으로 관리해야 반복 상호작용이 안정적입니다.

  1. Idle
    대기

    Idle 상호작용 가능 표시를 켜고 입력을 받을 수 있는 상태입니다.

  2. Moving
    진행 중

    Moving bIsMoving이 켜진 동안 추가 입력을 막고 타임라인이나 Tick 이동만 실행합니다.

  3. Arrived
    도착

    Arrived 목표 위치와 상태 변수를 함께 확정하고 사운드, UI, 이펙트를 마무리합니다.

  4. Reset
    복귀

    Reset 다시 사용할 오브젝트라면 방향, 타이머, 프롬프트를 초기 상태로 돌립니다.

  5. input
    입력 잠금

    input 이동 중에는 Interact를 무시하거나 큐에 넣는 기준을 명확히 둡니다.

  6. target
    목표 위치 확정

    target Lerp 수렴 후에는 정확한 EndLocation 또는 StartLocation으로 스냅합니다.

  7. network
    동기화 기준

    network 멀티플레이어에서는 서버가 상태를 확정하고 클라이언트는 표현을 따라가게 합니다.


동적 오브젝트 상호작용은 레벨을 살아 있는 공간으로 보이게 만드는 핵심 요소입니다.

타임라인 애니메이션, 머티리얼 파라미터 제어, 물리 시뮬레이션, 스폰/디스폰과 가시성 제어를 함께 적용하면 반응의 밀도를 높일 수 있습니다.

플레이어가 탐험 중에 행동하면 세계가 바뀐다는 경험을 계속 받도록 설계해 보세요.

동적 오브젝트 반응 설계

동적 오브젝트는 시간 변화, 머티리얼 변화, 물리 전환, 스폰 상태를 목적에 맞게 조합합니다.

  1. Timeline
    Timeline

    문 열림, 플랫폼 이동처럼 예측 가능한 시간 변화를 부드럽게 만듭니다.

  2. Material
    Material

    색, 발광, 젖음 정도를 파라미터로 바꿔 상태를 표현합니다.

  3. Physics
    Physics

    필요한 순간에 물리 시뮬레이션을 켜 동적 반응을 만듭니다.

  4. Spawn
    Spawn

    효과나 오브젝트를 생성하고 수명과 제거 조건을 함께 둡니다.