본문으로 건너뛰기

안동민 개발노트

본문 시작

간단한 이벤트 핸들러 설정

파티클 소멸 이벤트를 발생·수신하는 이미터를 연결해 원본 파티클이 사라질 때 폭발 파티클을 생성합니다.

지금까지 파티클 생성(Spawn 모듈)과 파티클 업데이트(Particle Update 모듈)를 다뤘습니다.

이번 절에서는 특정 조건이 충족되었을 때 파티클 시스템 내부 또는 외부로 이벤트를 발생시키고, 그 이벤트에 반응해 다른 동작을 수행하는 이벤트 핸들러(Event Handler)를 설명합니다.

간단히 말해, 이벤트 핸들러는 만약 A라는 상황이 발생하면, B라는 일을 해라라고 파티클 시스템에게 지시하는 방법입니다.

이는 더욱 복잡하고 상호작용적인 시각 효과를 만드는 데 필수적입니다.

Generate, Receive, Spawn 이벤트 데이터 계약

나이아가라 이벤트 핸들러는 이벤트를 만든 이미터와 받는 이미터 사이의 데이터 계약, Persistent ID, Spawn 비용을 함께 고려해야 합니다.

  1. 이벤트 생성

    충돌, 죽음, 위치 같은 순간에 필요한 속성만 이벤트 데이터로 내보냅니다. generate

  2. 데이터 계약

    위치, 속도, 색, ID처럼 받는 이미터가 기대하는 필드를 명확히 맞춥니다. payload

  3. 수신 핸들러

    Event Handler가 이벤트를 읽어 새 입자를 생성하거나 기존 입자를 수정합니다. receive

  4. Persistent ID

    입자 추적이 필요한 이벤트는 ID 안정성이 필요하지만 비용이 늘 수 있습니다. id

  5. 비용 제한

    한 프레임에 너무 많은 이벤트가 생성되지 않도록 rate와 spawn count를 제한합니다. budget


이벤트 핸들러란 무엇인가요?

이벤트 핸들러는 나이아가라 시스템에서 특정 조건(예: 파티클 충돌, 파티클 소멸 등)이 발생했을 때, 미리 정의된 동작을 수행하도록 연결하는 기능입니다.

이를 통해 여러 이미터 간에 상호작용을 구현하거나, 파티클의 상태 변화에 따라 새로운 효과를 트리거할 수 있습니다.

주로 다음과 같은 상황에서 이벤트 핸들러를 사용합니다.

  • 파티클의 소멸 시점: 파티클이 수명을 다해 사라질 때 폭발 효과를 낸다거나, 잔여 파티클을 생성하는 경우.
  • 파티클의 충돌: 파티클이 월드 또는 다른 오브젝트와 충돌할 때 스파크, 파편, 또는 소리 효과를 발생시키는 경우.
  • 특정 임계값 도달: 파티클의 속도나 크기 등이 특정 값을 넘어섰을 때 다른 파티클을 생성하는 경우.

이벤트 핸들러의 구성 요소

Niagara 이벤트는 발생기와 수신기의 이름이 맞아야 흐른다

충돌, 죽음, 위치 같은 이벤트는 한 이미터가 보내고 다른 핸들러가 받아 추가 파티클이나 동작으로 바꾼다.

단계보내는 쪽받는 쪽끊기는 지점
Generate EventCollision, Death, Location 이벤트 생성Event Handler가 같은 이름을 대기이벤트 이름 불일치
Payload위치, 속도, 색 같은 값 포함수신 모듈이 필요한 필드 읽음필드 이름 또는 타입 불일치
Handler소스 이미터 지정수신 이미터에서 처리Source Emitter 선택 오류
Response새 파티클 생성 또는 속성 변경Spawn Number와 초기값 적용응답 수가 0이거나 과함

이벤트 핸들러는 크게 두 가지 부분으로 구성됩니다.

이벤트 발생기 (Event Generator): 특정 조건이 충족되었을 때 이벤트를 발생시키는 모듈입니다.

주로 Particle Update 섹션에 위치합니다.

이벤트 수신기 (Event Receiver): 발생한 이벤트를 수신하여 미리 정의된 동작을 수행하는 모듈입니다.

주로 Emitter Update 또는 Spawn 섹션에 위치합니다.

가장 흔하게 사용되는 예시인 파티클 소멸 시 다른 파티클 생성을 통해 이벤트 핸들러의 기본 사용법을 알아보겠습니다.


직접 해보기: 폭발 효과 추가하기

이전 절에서 만든 NS_BasicSpawn 시스템을 확장하여, 파티클이 수명을 다해 사라질 때 작은 폭발 효과를 추가해 보겠습니다.

이벤트 발생기 설정

파티클이 사라지는 시점에 이벤트를 발생시키려면 Generate Location Event 모듈이 필요합니다.

NS_BasicSpawn 나이아가라 시스템을 엽니다.

개요(Overview) 패널에서 기존의 Emitter (기본 이미터)를 선택합니다.

Particle Update 섹션 아래의 + 버튼을 클릭합니다.

Generate Location Event를 검색하여 추가합니다.

  • 이 모듈은 파티클이 소멸할 때 파티클의 위치를 이벤트 데이터로 생성하여 보냅니다.
  • Source TypeParticle로 유지하고, LocationParticles.WorldPosition으로 설정되어 있는지 확인합니다. (기본값)

새로운 이미터 추가: 소멸 시 폭발용 이미터

이제 이벤트를 수신하여 폭발 효과를 낼 새로운 이미터를 시스템에 추가합니다.

개요(Overview) 패널System 항목 아래에 있는 + 버튼을 클릭합니다.

New Emitter from Template을 선택한 후 Next를 클릭합니다.

템플릿 목록에서 Simple Sprite Burst를 선택하고 Finish를 클릭합니다.

새로 추가된 이미터의 이름을 BurstOnDeath와 같이 알아보기 쉽게 변경합니다.

이벤트 수신기 설정

BurstOnDeath 이미터가 파티클 소멸 이벤트를 수신하도록 설정합니다.

새로 추가된 BurstOnDeath 이미터를 선택합니다.

Emitter Update 섹션을 클릭하고, 기존에 있을 수 있는 Emitter State 등의 모듈 아래에 있는 + 버튼을 클릭합니다.

Receive Location Event를 검색하여 추가합니다.

  • 이 모듈은 Generate Location Event 모듈이 보낸 위치 이벤트를 수신합니다.
  • Event Name은 기본적으로 /NiagaraEvent/LocationEvent로 설정되어 있습니다. 이는 Generate Location Event 모듈이 생성하는 기본 이벤트 이름과 일치해야 합니다. (기본적으로 일치합니다.)

Spawn 섹션으로 이동합니다.

기존에 있던 Spawn Rate 모듈을 삭제합니다. (우클릭 > Delete 또는 선택 후 Delete 키)

Spawn 섹션 아래의 + 버튼을 클릭합니다.

Spawn Particles from Event를 검색하여 추가합니다.

  • 이 모듈은 수신된 이벤트 데이터(Receive Location Event 모듈)를 기반으로 파티클을 생성합니다.
  • SourceReceiveLocationEvent로 설정합니다. (기본값)
  • Spawn Count1로 설정하여 이벤트당 하나의 폭발이 일어나도록 합니다.

Initialize Particle 모듈에서 Lifetime0.5 정도로 짧게, Sprite Size20.0 정도로 작게 조정합니다.

Color도 작은 폭발 느낌이 나도록 주황색이나 노란색 계열로 변경해 보세요.

아래 다이어그램은 이벤트 발생기, 수신기, 스폰 모듈이 서로 맞물리는 지점을 한눈에 점검할 수 있도록 정리한 것입니다.

이벤트 버스트는 조건, 이름, 응답 수를 함께 맞춘다

이벤트 핸들러는 발생 조건만 맞아도 충분하지 않고, 수신 이름과 Spawn Number가 같은 의도를 가져야 한다.

점검 항목맞아야 하는 값어긋나면판정 기준
발생 조건Collision, Death, Custom 조건이벤트가 전혀 발생하지 않음Debug에서 이벤트 수가 보임
이벤트 이름Generator와 Handler 이름수신기가 신호를 못 찾음이름과 namespace가 일치
소스 이미터이벤트를 보낸 이미터다른 이미터의 이벤트를 기다림Source가 실제 발생기
Spawn Number이벤트당 생성 개수응답이 너무 약하거나 폭주한 이벤트당 생성량이 의도와 맞음
Payload위치, 속도, 색 필드새 파티클 위치가 어긋남필드 이름과 타입이 연결됨

이제 뷰포트에서 NS_BasicSpawn의 흰색 파티클이 사라지는 순간, 그 위치에서 작은 주황색/노란색 파티클이 터져 나오는 것을 확인할 수 있습니다!


이벤트 핸들러의 다른 활용 예시

  • 충돌 이벤트: Collision 모듈을 사용하여 파티클이 월드와 충돌했을 때 이벤트를 발생시키고, 이 이벤트를 수신하여 스파크나 먼지 효과를 생성할 수 있습니다.
  • 데이터 인터페이스: 게임 코드나 블루프린트에서 나이아가라 시스템으로 이벤트를 직접 전송하여, 게임 플레이 상황에 따라 동적으로 파티클 효과를 발생시킬 수 있습니다.
  • 파티클의 속성 변화에 따른 이벤트: Data Interface Event By Name 등을 사용하여 파티클의 속도가 특정 임계값에 도달했을 때 이벤트를 발생시키는 고급 기능도 있습니다.

이벤트 핸들러가 동작하지 않을 때는 생성 조건보다 먼저 이벤트 이름, payload, 수신 Source, Spawn Count의 연결을 차례로 확인하는 것이 좋습니다.

이벤트 핸들러는 Generate에서 Spawn까지 계약이 이어져야 한다

이벤트가 보이지 않을 때는 생성 조건, 이름, payload, 수신 Source, Spawn Count를 전송 경로 순서대로 확인한다.

  1. Generate

    소멸·충돌·임계값 조건이 실제 프레임에 발생한다.

  2. Event Name

    Generator와 Receiver가 같은 이름과 경로를 쓴다.

  3. Payload

    WorldPosition 등 응답에 필요한 데이터를 담는다.

  4. Receive / Source

    수신 모듈을 Spawn Particles from Event가 읽는다.

  5. Spawn Count

    벤트당 0보다 큰 응답 파티클 수를 만든다.

  6. 아무것도 안 보임

    Generate 실행, 이름, Spawn Count를 순서대로 본다.

  7. 엉뚱한 위치

    Location payload의 Local·World 공간을 비교한다.

  8. 너무 많이 터짐

    발생 조건 반복과 이벤트당 응답 수를 줄인다.


이벤트 핸들러는 파티클이 충돌, 사망, 위치 변화 같은 사건에 반응하도록 만드는 장치입니다.

이벤트 발생 조건과 수신 이미터의 책임을 분리하면 효과의 동작을 더 쉽게 추적할 수 있습니다.


이벤트 핸들러는 발생기와 수신기의 이름, 데이터, 스폰 소스를 하나의 연결 계약으로 보는 것이 좋습니다.

이벤트 핸들러 문제는 이름, 소스, payload 순서로 좁힌다

안 나오거나 과하게 나오는 이벤트 효과는 같은 화면에서 원인과 수정 방향을 대응시켜 확인한다.

증상먼저 볼 값가능한 원인수정 방향
아무 반응 없음Event CountGenerator가 이벤트를 만들지 않음발생 조건과 Debug 표시 확인
수신이 안 됨Event Name, Source EmitterHandler가 다른 이름이나 이미터를 기다림이름과 소스 선택 통일
위치가 틀림Payload Position받는 필드 이름이나 타입이 다름Payload 필드 매핑 재확인
너무 많이 생성됨Spawn Number, Lifetime이벤트당 응답 수가 과함응답 수와 수명 함께 낮춤
성능이 튐Event Rate충돌·죽음 이벤트가 과다조건을 좁히고 거리/빈도 제한

이벤트 핸들러는 원인 이미터와 반응 이미터를 분리해 생각해야 하므로, 연결 조건을 체크리스트로 마무리합니다.

이벤트 핸들러 연결 계약

이벤트는 발생기와 수신기를 느슨하게 잇는 계약이다. 이름, payload, Source, Spawn Count가 맞아야 반응 이미터가 동작한다.

  1. 조건 발생

    충돌, 사망, 임계값 도달을 감지한다.

  2. Event 발행

    름과 payload를 한 묶음으로 보낸다.

  3. Receiver 수신

    Source와 이벤트 이름을 맞춘다.

  4. 반응 생성

    Spawn Count와 초기값으로 결과를 만든다.