icon
8장 : 블루프린트 연동

동적 파라미터 업데이트하기


이전 절에서 우리는 나이아가라 시스템을 블루프린트에 추가하고 활성화/비활성화하며, 기본적인 사용자 변수를 제어하는 방법을 배웠습니다. 이제 한 걸음 더 나아가, 게임 플레이 중 나이아가라 시스템의 파라미터(Parameters) 를 블루프린트에서 지속적으로, 그리고 동적으로 업데이트하는 방법에 대해 알아보겠습니다. 이는 캐릭터의 체력에 따라 이펙트의 색상이 변하거나, 주변 환경의 속도에 맞춰 파티클의 움직임이 조절되거나, 특정 목표를 추적하는 파티클을 만드는 등 훨씬 더 복잡하고 유기적인 상호작용을 구현하는 핵심 기술입니다.

파라미터를 동적으로 업데이트하는 것은 나이아가라 시스템이 정적인 효과에 머무르지 않고, 게임 세계와 실시간으로 반응하도록 만드는 강력한 도구입니다.


동적 파라미터 업데이트의 필요성

일회성으로 값을 설정하는 것을 넘어, 매 프레임마다 또는 특정 조건이 충족될 때마다 나이아가라 파라미터를 업데이트해야 하는 경우는 다음과 같습니다.

  • 실시간 데이터 반영: 플레이어의 속도, 체력, 총기 잔탄 수 등 게임 내 실시간으로 변하는 데이터를 파티클 효과에 반영하고 싶을 때.
  • 지속적인 추적: 파티클이 특정 액터(예: 플레이어, 적)의 위치나 움직임을 지속적으로 추적해야 할 때.
  • 환경 반응: 주변 환경(예: 바람의 방향과 세기, 지면의 색상)에 따라 파티클 효과가 변화해야 할 때.
  • 애니메이션 동기화: 캐릭터의 애니메이션 진행도에 맞춰 파티클 효과가 동기화되어야 할 때.

동적 파라미터 업데이트의 핵심

블루프린트에서 나이아가라 파라미터를 동적으로 업데이트하는 가장 일반적인 방법은 Event Tick 이벤트나 특정 업데이트 루프 내에서 Set Niagara Variable 노드를 사용하는 것입니다.

나이아가라 시스템 준비 (사용자 변수 노출)

블루프린트에서 동적으로 업데이트할 파라미터는 반드시 나이아가라 시스템 내에서 사용자 변수(User Parameter) 로 노출되어 있어야 합니다.

나이아가라 시스템 에디터를 엽니다.

Parameters 패널에서 User 섹션을 찾습니다.

+ 버튼을 클릭하고 Add User Parameter에서 원하는 타입(예: Float, Vector, Color, Actor)을 선택하여 새 사용자 변수를 만듭니다. (예: User.TargetLocation, User.PlayerSpeed, User.CurrentHealth)

이 사용자 변수를 드래그하여 이미터나 파티클 모듈의 해당 입력 핀에 연결합니다.

  • 예시: 파티클의 이동 속도를 플레이어 속도에 맞춰 조절하고 싶다면, Add Velocity 모듈의 Velocity 입력에 User.PlayerSpeed 변수를 곱하는 노드를 연결합니다.
  • 예시: 파티클이 특정 대상의 위치를 따라가게 하고 싶다면, Attract Force 모듈의 Target Location 입력에 User.TargetLocation을 연결합니다.

Event Tick을 이용한 업데이트

나이아가라 시스템 컴포넌트가 추가된 블루프린트 (예: 캐릭터 블루프린트)를 엽니다.

Event Graph으로 이동합니다.

Event Tick 노드를 찾습니다. (Event Tick은 매 프레임마다 실행됩니다.)

Event Tick에서 실행 핀을 연결하여 다음 노드를 추가합니다.

  • Niagara Particle System 컴포넌트의 레퍼런스를 가져옵니다.
  • Set Niagara Variable 노드를 검색하여 추가합니다. (예: Set Niagara Variable Float, Set Niagara Variable Vector, Set Niagara Variable Object 등, 노출시킨 사용자 변수의 타입에 맞춰 선택).
  • Variable Name 입력에 나이아가라 시스템에서 노출시킨 사용자 변수의 정확한 이름을 입력합니다. (예: User.TargetLocation, User.PlayerSpeed)
  • In Value 입력에 동적으로 업데이트할 값을 연결합니다. 이 값은 블루프린트 내의 다른 변수, 함수 반환 값, 또는 다른 액터의 속성에서 가져올 수 있습니다.

직접 해보기: 속도에 따라 파티클 크기 조절하기

플레이어 캐릭터의 이동 속도에 비례하여 발밑에서 발생하는 먼지 파티클의 크기가 커지도록 만들어 보겠습니다.

나이아가라 시스템 준비

새로운 나이아가라 시스템 (New system from selected emitters > Fountain)을 생성하고 NS_SpeedDust라고 이름을 지정합니다.

Initialize Particle 모듈

  • Lifetime: 0.5 ~ 1.0 (Random Float)
  • Sprite Size: 5.0 (임시로 작은 기본 크기)
  • Color: 밝은 갈색 또는 회색

Add Velocity 모듈

  • Z축 Velocity20.0 정도로 낮게 설정하여 살짝 떠오르게 합니다.
  • X, Y축도 -10.0 ~ 10.0 정도로 작게 설정하여 미세하게 퍼지도록 합니다.

Add Gravity Force: 필요하다면 제거하거나 Gravity 값을 낮춰 연기가 천천히 퍼지도록 합니다.

Sprite Renderer

  • 적절한 연기 또는 먼지 텍스처를 가진 Translucent 머티리얼을 할당합니다. (예: M_Smoke_SubUV)
  • Soft Particle을 활성화합니다.

사용자 변수 노출

  • Parameters 패널User 섹션에서 + 버튼을 클릭하고 Add User Parameter > Float를 선택하여 User.PlayerSpeed 라는 이름의 사용자 변수를 만듭니다. 기본값은 1.0으로 설정합니다.

파티클 크기 제어

  • Particle Update 섹션에 Scale Sprite Size 모듈을 추가합니다.
  • Scale FactorUniform 입력 핀에 다음 노드를 연결합니다.
    • Get Parameter 노드 (Parameter: User.PlayerSpeed)
    • Multiply (Float * Float) 노드 (두 번째 입력은 0.1이나 0.2와 같이 작은 값으로 설정하여 속도를 크기로 스케일링)
    • Multiply 노드의 결과를 Scale Sprite SizeUniform 입력에 연결합니다. 이렇게 하면 User.PlayerSpeed 값에 따라 파티클의 크기가 조절됩니다.

나이아가라 시스템을 저장합니다.

캐릭터 블루프린트 설정

언리얼 엔진의 기본 캐릭터 블루프린트 (BP_ThirdPersonCharacter 또는 여러분의 플레이어 캐릭터 블루프린트)를 엽니다.

Niagara Particle System 컴포넌트 추가

  • Components 패널에서 Niagara Particle System 컴포넌트를 추가하고, Niagara System 속성에 위에서 만든 NS_SpeedDust를 할당합니다.
  • 컴포넌트를 드래그하여 Mesh 컴포넌트의 자식으로 만들고, Parent Socketfoot_l 또는 foot_r과 같은 발 소켓을 할당합니다. LocationRotation 오프셋을 조절하여 발밑에 오도록 합니다.

Event Graph 로직 구현

  • Event Tick 노드에서 실행 핀을 연결하여 다음 노드를 추가합니다.
    • Get Velocity 노드 (캐릭터의 속도 벡터를 가져옴)
    • Vector Length 노드 (속도 벡터의 크기를 가져와 현재 속도를 Float로 얻음)
    • Map Range Clamped 노드 (속도 값을 원하는 범위로 매핑합니다)
      • In Range A: 0.0 (최소 속도)
      • In Range B: 600.0 (캐릭터의 최대 이동 속도, 프로젝트 설정에서 Max Walk Speed 확인)
      • Out Range A: 0.0 (파티클 크기의 최소 스케일)
      • Out Range B: 10.0 (파티클 크기의 최대 스케일, 나이아가라에서 설정한 Multiply 값과 연계)
    • Niagara Particle System 컴포넌트의 레퍼런스에서 Set Niagara Variable Float 노드를 추가합니다.
    • Variable NameUser.PlayerSpeed 를 정확히 입력합니다.
    • In ValueMap Range Clamped 노드의 결과를 연결합니다.
  • 활성화/비활성화 로직: 캐릭터가 움직이지 않을 때는 파티클 시스템을 비활성화하는 로직을 추가하는 것이 좋습니다.
    • Vector Length 노드의 결과(Player Speed)가 5.0 (아주 작은 속도 임계값)보다 큰지 > 노드로 검사합니다.
    • 이 결과를 Branch 노드의 Condition에 연결합니다.
    • Branch 노드의 True 핀에서는 Niagara Particle System 컴포넌트의 Activate 노드를 연결합니다.
    • Branch 노드의 False 핀에서는 Niagara Particle System 컴포넌트의 Deactivate 노드를 연결합니다.

블루프린트를 컴파일하고 저장한 후, 게임을 플레이하여 캐릭터를 움직여 봅니다. 캐릭터가 빠르게 움직일수록 발밑 먼지 파티클의 크기가 커지는 것을 확인할 수 있을 겁니다.


고급 동적 파라미터 업데이트 기법

  • Niagara Data Interface 활용: 특정 액터의 위치, 스켈레탈 메시의 본 정보, 이미지 샘플링 데이터 등을 나이아가라 시스템으로 직접 스트리밍하는 Niagara Data Interface를 활용하면 블루프린트의 Event Tick 루프를 거치지 않고도 동적으로 데이터를 업데이트할 수 있어 더욱 효율적입니다.
    • 예시: Niagara Data Interface Actor를 사용하여 파티클이 특정 타겟 액터를 따라가게 하거나, Niagara Data Interface Static Mesh를 사용하여 메시의 표면에서 파티클을 스폰하게 할 수 있습니다.
  • 이벤트 기반 업데이트: 모든 것을 Event Tick에서 처리하기보다는, 특정 이벤트(예: OnTakeDamage, OnHit)가 발생했을 때만 파티클 파라미터를 업데이트하도록 로직을 구성하여 성능을 최적화할 수 있습니다.
  • 비동기 업데이트: 매우 복잡한 계산이 필요하거나 많은 데이터를 전송해야 할 경우, Async Task 또는 Timer를 사용하여 매 프레임이 아닌 일정 시간 간격으로 데이터를 업데이트함으로써 메인 스레드의 부담을 줄일 수 있습니다.

동적 파라미터 업데이트는 나이아가라 시스템에 생명을 불어넣어 게임 플레이에 실시간으로 반응하게 하는 핵심적인 기술입니다. Event TickSet Niagara Variable 노드의 기본적인 활용부터 Niagara Data Interface를 통한 고급 연동까지 익힌다면, 여러분은 언리얼 엔진에서 상상하는 모든 종류의 동적인 시각 효과를 구현할 수 있는 강력한 능력을 갖추게 될 것입니다.