본문으로 건너뛰기

안동민 개발노트

본문 시작

이벤트 기반 파티클 스폰

피격·획득·충돌 이벤트가 발생한 순간에만 시스템을 스폰하고 위치·충격 강도 같은 데이터를 사용자 변수로 전달합니다.

이전 절에서 우리는 블루프린트에서 나이아가라 시스템의 파라미터를 동적으로 업데이트하는 방법을 배웠습니다.

이제는 나이아가라 시스템과 블루프린트 간의 또 다른 강력한 상호작용 방식인 이벤트 기반 파티클 스폰(Event-Driven Particle Spawn)에 대해 알아보겠습니다.

이 방식은 게임 플레이 중 특정 이벤트(예: 캐릭터 피격, 아이템 획득, 발사체 충돌)가 발생했을 때만 파티클 효과를 즉시 스폰하고, 심지어 해당 이벤트와 관련된 데이터(예: 충격 강도, 충돌 위치)를 파티클 시스템에 전달하는 데 사용됩니다.

이벤트 기반 스폰은 불필요한 파티클 시스템의 상시 활성화를 방지하고, 필요한 시점에 정확한 위치와 속성으로 효과를 발생시켜 성능 효율성을 높이는 동시에 더욱 역동적인 시각 효과를 구현할 수 있게 해줍니다.

이벤트 기반 스폰

총알 충돌, 아이템 획득, 능력 발동처럼 짧게 반응해야 하는 효과는 상시 활성화보다 Spawn System 노드로 필요한 순간에 만들고, Parameters 핀으로 충격 강도와 방향을 같이 전달한다.

  1. 게임 이벤트

    Hit / Overlap Event Hit에서 Hit Location, Hit Normal, Impulse를 읽는다.

  2. 정확한 위치

    Spawn System Location에는 충돌 지점, Rotation에는 Hit Normal 기반 회전을 넣는다.

  3. 페이로드 전달

    Parameters Make Niagara System Spawn Info에 User.ImpactStrength를 싣는다.

  4. Niagara 수신

    User Parameter 이름과 타입이 같은 User 변수를 만들어 모듈 입력에 연결한다.

  5. 짧은 반응

    Burst Output Spawn Burst Count, Sprite Size, Velocity가 충격 강도에 맞춰 바뀐다.

  6. 성능
    상시 활성화 회피

    성능 총알 자국, 스파크, 피격 효과처럼 짧은 시스템은 이벤트 때만 만든다.

  7. 정확도
    위치와 표면 방향을 맞춘다

    정확도 Hit Location과 Make Rot From Z(Hit Normal)로 벽 표면에 맞게 낸다.

  8. 데이터
    강도에 따라 결과를 바꾼다

    데이터 Impulse나 Velocity Length를 Map Range Clamped로 줄여 스파크 수에 연결한다.


왜 이벤트 기반 스폰을 사용해야 할까요?

  • 성능 최적화: 많은 파티클 시스템은 상시 활성화되어 있을 필요가 없습니다. 이벤트가 발생할 때만 짧게 스폰되고 사라지는 효과(예: 총알 자국, 스파크, 피격 이펙트)에 적합합니다. 시스템을 미리 만들어 두지만, 실제로 필요한 순간에만 생성되므로 자원 낭비를 줄입니다.
  • 정확한 위치 및 타이밍: 게임 로직의 특정 지점에서 정확한 위치(예: 총알이 맞은 벽의 지점)에 효과를 스폰할 수 있습니다.
  • 동적 데이터 전달: 이벤트 발생 시점의 게임 데이터를 파티클 시스템으로 전달하여, 효과의 속성(크기, 색상, 강도)을 해당 데이터에 따라 동적으로 변경할 수 있습니다.

이벤트 기반 스폰의 핵심

블루프린트에서 나이아가라 파티클 시스템을 이벤트 기반으로 스폰하는 가장 일반적인 방법은 다음과 같은 노드를 사용하는 것입니다.

  • Spawn System at Location: 특정 월드 위치에 나이아가라 시스템을 한 번 스폰합니다. 스폰된 시스템은 월드에 독립적으로 존재하며 지정된 수명 동안 재생됩니다.
    • 주요 입력: Niagara System (스폰할 나이아가라 시스템 에셋), Location (월드 위치), Rotation (월드 회전), Scale (스폰되는 시스템의 스케일), Parameters (가장 중요, 나이아가라 시스템에 전달할 사용자 데이터).
  • Spawn System Attached: 특정 컴포넌트나 액터에 나이아가라 시스템을 스폰하고 부착합니다. 부착된 시스템은 부모의 움직임을 따라갑니다.
    • 주요 입력: Niagara System, Attach To Component 또는 Attach To Actor (부착 대상), Socket Name (부착할 소켓), Location Type (상대/월드 위치), Location, Rotation, Scale, Parameters.

나이아가라 시스템으로 데이터 전달

Blueprint-Niagara 파라미터는 소유자와 갱신 시점을 분리한다

게임 상태가 Niagara로 들어갈 때는 누가 값을 소유하고, 언제 갱신하며, 어떤 모듈이 읽는지 정해야 한다.

질문결정할 것좋은 기준위험 신호
누가 소유하는가Actor, Component, System값의 책임자가 하나로 보임여러 곳에서 같은 값 수정
언제 보내는가BeginPlay, Tick, Event, Notify변화가 필요한 순간만 갱신매 프레임 불필요한 Set 호출
어떤 이름인가User.* namespaceBlueprint와 Niagara 이름 일치대소문자 또는 타입 불일치
어디서 읽는가Module input, Renderer binding최종 속성까지 흐름이 보임값은 들어오지만 화면이 안 바뀜
어떻게 검증하는가극단값과 로그0/1/강한 색으로 변화 확인변화가 작아 디버그가 어려움

Spawn System at Location 또는 Spawn System Attached 노드의 Parameters은 블루프린트에서 나이아가라 시스템으로 직접 데이터를 전달하는 통로입니다.

Parameters 핀 활성화: 해당 노드를 선택하고 Details 패널에서 Parameters 핀을 체크하여 활성화합니다.

Make Niagara System Spawn Info 노드: Parameters 핀에서 드래그하여 Make Niagara System Spawn Info 노드를 검색하여 추가합니다.

데이터 추가: Make Niagara System Spawn Info 노드를 선택하고 Details 패널에서 + 버튼을 클릭하여 새로운 변수(예: Float, Vector, Color, Actor)를 추가합니다.

이 변수들은 나이아가라 시스템의 사용자 변수와 동일한 이름으로 매칭되어야 합니다.

  • 변수 이름 규칙: 나이아가라 시스템에서 노출된 사용자 변수의 정확한 이름을 사용해야 합니다. (예: User.ImpactPower, User.HitNormal)

값 연결: 블루프린트의 다른 변수나 함수 결과(예: 충돌 결과의 노멀 벡터, 충격의 강도)를 Make Niagara System Spawn Info 노드의 해당 입력 핀에 연결합니다.

이벤트 값은 이름과 타입이 같아야 시각 변화가 된다

충돌 데이터를 원본에서 모듈 입력까지 같은 계약으로 전달하면 하나의 Niagara 시스템이 장면마다 다르게 반응한다.

  1. Hit 이벤트

    · 원본 충돌 위치, 표면 법선, 충격량을 시각 반응의 근거로 읽는다. 값 Location · Normal · Impulse

  2. Spawn 호출

    · 포장 위치와 회전을 맞추고 전달할 값을 Spawn Info에 담는다. 도구 At Location · Parameters

  3. User.* 변수

    · 계약 Blueprint와 Niagara 양쪽에서 이름, 대소문자, 타입을 정확히 일치시킨다. 예 Strength: Float · Normal: Vector

  4. 모듈 입력

    · 사용 강도는 생성 수와 크기, 법선은 속도 방향, 색은 초기 색에 연결한다. 결과 Count · Direction · Color


나이아가라 시스템에서 전달된 데이터 수신

이벤트 기반 Spawn 데이터 수신 구조

블루프린트 이벤트 데이터가 Niagara Event Handler와 Spawn Burst로 연결되어 위치, 방향, 강도별 파티클을 만드는 흐름을 정리한다.

  1. 1
    이벤트 발생

    충돌, 입력, 애니메이션 노티파이에서 위치와 강도 데이터가 만들어진다. emit

  2. 2
    데이터 전달

    Blueprint가 Niagara Component의 변수나 이벤트 인터페이스로 값을 보낸다. payload

  3. 3
    Handler 처리

    Niagara Event Handler가 들어온 데이터를 읽어 spawn 수와 초기 속도를 결정한다. handler

  4. 4
    파티클 생성

    수신 위치와 방향을 기준으로 burst, decal, trail 입자를 생성한다. spawn

  5. 5
    타이밍

    벤트가 Niagara System 활성화 이전에 사라지지 않는지 확인한다.

  6. 6
    데이터 타입

    Vector, Float, Bool 타입이 송신과 수신에서 일치해야 한다.

  7. 7
    중복 처리

    동일 이벤트가 여러 번 들어와 폭발적으로 spawn하지 않게 제한한다.

블루프린트에서 Spawn System 노드의 Parameters 핀을 통해 전달된 데이터는 나이아가라 시스템에서 사용자 변수(User Parameters)를 통해 수신됩니다.

나이아가라 시스템 열기: 데이터 수신할 나이아가라 시스템 에디터를 엽니다.

사용자 변수 노출: Parameters 패널User 섹션에서 + 버튼을 클릭하고 Add User Parameter를 선택하여, 블루프린트에서 전달할 데이터의 타입과 정확히 동일한 이름으로 사용자 변수를 만듭니다.

  • 예시: 블루프린트에서 Parameters.User.ImpactPowerFloat 값을 보냈다면, 나이아가라에서는 User.ImpactPower라는 이름의 Float 사용자 변수를 생성해야 합니다.

사용자 변수 활용: 생성된 사용자 변수를 드래그하여 이미터나 파티클 모듈의 해당 속성 입력 핀에 연결하여, 블루프린트에서 전달된 값에 따라 파티클 효과를 제어합니다.

  • 예시: Initialize Particle 모듈의 Sprite SizeUser.ImpactPower를 곱하여 충격 강도에 따라 파티클 크기를 조절합니다.
  • 예시: Add Velocity 모듈에 User.HitNormal을 곱하여 충돌 노멀 방향으로 파티클이 튕겨나가게 합니다.

이벤트로 효과를 스폰할 때는 아래 기준표처럼 월드 위치, 부착 대상, 전달 파라미터, 정리 방식까지 함께 고르면 블루프린트 흐름이 단순해집니다.

이벤트 스폰 방식 선택 기준표

같은 충돌 이벤트라도 효과가 월드에 남아야 하는지, 대상에 붙어야 하는지, 값 전달이 필요한지에 따라 스폰 노드와 정리 방식이 달라집니다.

  1. At Location
    월드 지점 효과

    At Location 적합 총알 자국, 스파크, 폭발 먼지 좌표 기준 Hit Location과 Hit Normal을 바로 사용

  2. Attached
    대상 추적 효과

    Attached 적합 버프 오라, 피격 잔광, 장비 소켓 효과 부착 기준 Attach 대상과 Socket Name을 명확히 지정

  3. Parameters
    이벤트 값 반영

    Parameters 적합 강도, 색상, 방향이 매번 달라질 때 변수 기준 Spawn Info와 User 변수 이름을 일치

  4. Timing
    발생 시점

    Timing OnHit, Overlap, 획득 이벤트 중 실제 원인을 고릅니다.

  5. Transform
    위치와 회전

    Transform Hit Normal은 Make Rot From Z로 표면 방향에 맞춥니다.

  6. Payload
    전달 데이터

    Payload ImpactStrength, HitNormal, ImpactColor를 타입별로 나눕니다.

  7. Cleanup
    수명 정리

    Cleanup 발사체는 Destroy Actor, 효과는 자동 완료 수명을 확인합니다.


직접 해보기: 총알 충격 시 효과 스폰 및 조절

총알이 벽에 맞았을 때, 충돌 위치에 스파크 파티클 시스템을 스폰하고, 충격 강도에 따라 스파크의 수가 조절되도록 만들어 보겠습니다.

스파크 나이아가라 시스템 준비

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

Emitter Update
  • Spawn Rate 모듈을 제거합니다. (블루프린트에서 스폰될 것이므로)
  • Parameters 패널User 섹션에서 + 버튼을 클릭하고 Add User Parameter > Float를 선택하여 User.ImpactStrength라는 이름의 사용자 변수를 만듭니다. 기본값은 1.0으로 설정합니다.
Initialize Particle 모듈
  • Lifetime: 0.2 ~ 0.5 (Random Float) (스파크는 짧게 존재)
  • Sprite Size: 2.0 ~ 5.0 (Random Float)
  • Color: 밝은 노란색 (R:1, G:0.8, B:0, A:1)
Add Velocity 모듈
  • VelocitySphere 형태로 설정하고 Radius100.0 정도로 설정하여 사방으로 퍼지게 합니다.
Particle Update 섹션
  • Add Gravity Force를 추가하여 스파크가 아래로 떨어지게 합니다.
  • Drag 모듈을 추가하고 Drag 값을 5.0 정도로 높게 설정하여 스파크가 빠르게 멈추도록 합니다.
Sprite Renderer
  • Material: 발광하는 스파크 텍스처를 가진 Additive 블렌드 모드의 Unlit 머티리얼을 할당합니다. (간단히는 M_Fire_SubUV 같은 것을 사용할 수 있습니다.)
Spawn Burst Instantaneous 모듈 추가
  • Emitter Update 섹션에서 + 버튼을 클릭하고 Spawn Burst Instantaneous 모듈을 추가합니다.
  • Spawn Count 입력 핀에 다음 노드를 연결합니다.
    • Get Parameter 노드 (Parameter: User.ImpactStrength)
    • Multiply (Float * Float) 노드 (두 번째 입력에 100.0과 같은 숫자를 연결하여 강도에 따라 스파크 수를 늘림)
    • Multiply 노드의 결과를 Spawn Burst InstantaneousSpawn Count에 연결합니다.

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

총알 충돌 블루프린트 설정

총알 블루프린트가 없으면, 간단한 Actor 블루프린트를 만들고 Sphere ComponentProjectile Movement Component를 추가하여 총알처럼 날아가게 설정합니다.

총알 블루프린트(예: BP_BulletProjectile)를 엽니다.

총알의 Sphere ComponentCollision Component를 선택하고 Details 패널에서 On Component Hit 또는 On Component Begin Overlap 이벤트(Event 버튼 클릭)를 추가합니다.

Event Hit (또는 Event Overlap) 노드에서 실행 핀을 연결하여 다음 노드를 추가합니다.

  • Spawn System at Location 노드를 추가합니다.
  • Niagara System 핀에 NS_ImpactSparks를 할당합니다.
  • Location 핀에 Hit 이벤트의 Hit Location (충돌 지점)을 연결합니다.
  • Rotation 핀에 Make Rot From Z 노드를 연결하고, Hit 이벤트의 Hit Normal (충돌 표면의 노멀)을 Z 입력에 연결하여 스파크가 벽 표면에 수직으로 스폰되도록 합니다.
  • Parameters 핀을 활성화합니다.
  • Parameters 핀에서 드래그하여 Make Niagara System Spawn Info 노드를 추가합니다.
  • Make Niagara System Spawn Info 노드를 선택하고 Details 패널에서 + 버튼을 클릭한 후 Add Float를 선택하여 User.ImpactStrength라는 이름의 변수를 만듭니다.
  • User.ImpactStrength 입력 핀에 Hit 이벤트의 Impulse (충격량)나 Velocity (속도)의 Vector Length 결과를 연결하여 충격 강도를 전달합니다. 필요하다면 Map Range Clamped 노드를 사용하여 값을 적절한 범위로 스케일링합니다.
  • Destroy Actor 노드를 추가하여 총알이 충돌 후 사라지게 합니다.

블루프린트를 컴파일하고 저장한 후, 레벨에 총알 발사 로직을 추가하여 테스트합니다. (예: Event Play에서 총알을 스폰하여 날아가게 함)

충돌 스폰이 보이지 않거나 강도 값이 반영되지 않을 때는 아래 검증 레인처럼 이벤트 호출부터 발사체 정리까지 순서대로 확인합니다.

충돌 스폰 검증 레인

총알 충격 이펙트가 보이지 않거나 방향이 틀어질 때는 이벤트, 트랜스폼, 페이로드, 스폰, 정리 순서로 끊어 확인하면 원인을 빨리 찾을 수 있습니다.

  1. 1
    Hit 이벤트

    Collision 설정과 Generate Hit Events를 확인합니다.

  2. 2
    트랜스폼

    Hit Location과 Make Rot From Z를 연결합니다.

  3. 3
    Spawn Info

    User.ImpactStrength 이름과 타입을 맞춥니다.

  4. 4
    Niagara 스폰

    시스템 에셋, Auto Destroy, Scale을 점검합니다.

  5. 5
    발사체 정리

    Spawn 실행 뒤 Destroy Actor가 호출되는지 봅니다.

  6. No Effect
    아무것도 보이지 않음

    No Effect 먼저 Hit 이벤트가 실제로 호출되는지 Print로 확인 다음 Niagara System 에셋과 스폰 위치 확인

  7. Wrong Direction
    방향이 어긋남

    Wrong Direction 먼저 Hit Normal을 Make Rot From Z에 연결 다음 이미터 로컬 축과 렌더러 정렬 확인

  8. Same Size
    강도 반영 안 됨

    Same Size 먼저 User.ImpactStrength 철자와 타입 확인 다음 Map Range Clamped 출력 범위 확인

이벤트 기반 스폰은 위치, 방향, 강도 데이터가 정확해야 재사용성이 높아지므로, 전달 경로를 한 번 더 점검합니다.

이벤트 스폰 데이터 경로

총알 충격처럼 순간적으로 필요한 이펙트는 충돌 지점, 법선, 강도 값을 이벤트 데이터로 넘기면 재사용성이 높아집니다.

  1. Gameplay Event

    Hit 총알 충돌, 발자국, 스킬 명중 같은 순간 조건을 이벤트로 잡습니다.

  2. 시스템 생성

    Spawn Spawn System at Location으로 위치와 회전을 충돌 정보에 맞춥니다.

  3. User Parameter

    Params ImpactStrength, SurfaceType, Normal 값을 시스템 입력으로 넘깁니다.

  4. Niagara 수신

    Receive Emitter에서 받은 값으로 스폰량, 방향, 색상, 수명을 조정합니다.

  5. 좌표

    월드 위치와 로컬 오프셋이 섞여 충격 효과가 떠 있지 않은지 봅니다.

  6. 중복

    연속 충돌에서 같은 프레임에 너무 많은 시스템이 생기지 않게 제한합니다.

  7. 수명

    Auto Destroy와 파티클 Lifetime이 맞지 않아 잔상이 남지 않는지 확인합니다.

이제 총알이 벽에 부딪힐 때마다 충돌 지점에서 스파크 파티클이 스폰되며, 충돌 강도에 따라 스파크의 양이나 크기가 조절되는 것을 확인할 수 있을 겁니다.


이벤트 기반 파티클 스폰은 특정 게임플레이 순간에 필요한 이펙트를 생성하는 기법입니다.

블루프린트 이벤트, 스폰 타이밍, Parameters 전달 값을 함께 검증해야 합니다.

이벤트 기반 파티클 스폰은 이벤트 이름, payload, 수신 소스, 스폰 수 기준으로 점검합니다.