간단한 이벤트 핸들러 설정
파티클 소멸 이벤트를 발생·수신하는 이미터를 연결해 원본 파티클이 사라질 때 폭발 파티클을 생성합니다.
지금까지 파티클 생성(Spawn 모듈)과 파티클 업데이트(Particle Update 모듈)를 다뤘습니다.
이번 절에서는 특정 조건이 충족되었을 때 파티클 시스템 내부 또는 외부로 이벤트를 발생시키고, 그 이벤트에 반응해 다른 동작을 수행하는 이벤트 핸들러(Event Handler)를 설명합니다.
간단히 말해, 이벤트 핸들러는 만약 A라는 상황이 발생하면, B라는 일을 해라라고 파티클 시스템에게 지시하는 방법입니다.
이는 더욱 복잡하고 상호작용적인 시각 효과를 만드는 데 필수적입니다.
나이아가라 이벤트 핸들러는 이벤트를 만든 이미터와 받는 이미터 사이의 데이터 계약, Persistent ID, Spawn 비용을 함께 고려해야 합니다.
- 이벤트 생성
충돌, 죽음, 위치 같은 순간에 필요한 속성만 이벤트 데이터로 내보냅니다. generate
- 데이터 계약
위치, 속도, 색, ID처럼 받는 이미터가 기대하는 필드를 명확히 맞춥니다. payload
- 수신 핸들러
Event Handler가 이벤트를 읽어 새 입자를 생성하거나 기존 입자를 수정합니다. receive
- Persistent ID
입자 추적이 필요한 이벤트는 ID 안정성이 필요하지만 비용이 늘 수 있습니다. id
- 비용 제한
한 프레임에 너무 많은 이벤트가 생성되지 않도록 rate와 spawn count를 제한합니다. budget
이벤트 핸들러란 무엇인가요?
이벤트 핸들러는 나이아가라 시스템에서 특정 조건(예: 파티클 충돌, 파티클 소멸 등)이 발생했을 때, 미리 정의된 동작을 수행하도록 연결하는 기능입니다.
이를 통해 여러 이미터 간에 상호작용을 구현하거나, 파티클의 상태 변화에 따라 새로운 효과를 트리거할 수 있습니다.
주로 다음과 같은 상황에서 이벤트 핸들러를 사용합니다.
- 파티클의 소멸 시점: 파티클이 수명을 다해 사라질 때 폭발 효과를 낸다거나, 잔여 파티클을 생성하는 경우.
- 파티클의 충돌: 파티클이 월드 또는 다른 오브젝트와 충돌할 때 스파크, 파편, 또는 소리 효과를 발생시키는 경우.
- 특정 임계값 도달: 파티클의 속도나 크기 등이 특정 값을 넘어섰을 때 다른 파티클을 생성하는 경우.
이벤트 핸들러의 구성 요소
충돌, 죽음, 위치 같은 이벤트는 한 이미터가 보내고 다른 핸들러가 받아 추가 파티클이나 동작으로 바꾼다.
| 단계 | 보내는 쪽 | 받는 쪽 | 끊기는 지점 |
|---|---|---|---|
| Generate Event | Collision, 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 Type은Particle로 유지하고,Location은Particles.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모듈)를 기반으로 파티클을 생성합니다. Source를ReceiveLocationEvent로 설정합니다. (기본값)Spawn Count는1로 설정하여 이벤트당 하나의 폭발이 일어나도록 합니다.
Initialize Particle 모듈에서 Lifetime을 0.5 정도로 짧게, Sprite Size는 20.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의 연결을 차례로 확인하는 것이 좋습니다.
이벤트가 보이지 않을 때는 생성 조건, 이름, payload, 수신 Source, Spawn Count를 전송 경로 순서대로 확인한다.
- Generate
소멸·충돌·임계값 조건이 실제 프레임에 발생한다.
- Event Name
Generator와 Receiver가 같은 이름과 경로를 쓴다.
- Payload
WorldPosition 등 응답에 필요한 데이터를 담는다.
- Receive / Source
수신 모듈을 Spawn Particles from Event가 읽는다.
- Spawn Count
벤트당 0보다 큰 응답 파티클 수를 만든다.
- 아무것도 안 보임
Generate 실행, 이름, Spawn Count를 순서대로 본다.
- 엉뚱한 위치
Location payload의 Local·World 공간을 비교한다.
- 너무 많이 터짐
발생 조건 반복과 이벤트당 응답 수를 줄인다.
이벤트 핸들러는 파티클이 충돌, 사망, 위치 변화 같은 사건에 반응하도록 만드는 장치입니다.
이벤트 발생 조건과 수신 이미터의 책임을 분리하면 효과의 동작을 더 쉽게 추적할 수 있습니다.
이벤트 핸들러는 발생기와 수신기의 이름, 데이터, 스폰 소스를 하나의 연결 계약으로 보는 것이 좋습니다.
안 나오거나 과하게 나오는 이벤트 효과는 같은 화면에서 원인과 수정 방향을 대응시켜 확인한다.
| 증상 | 먼저 볼 값 | 가능한 원인 | 수정 방향 |
|---|---|---|---|
| 아무 반응 없음 | Event Count | Generator가 이벤트를 만들지 않음 | 발생 조건과 Debug 표시 확인 |
| 수신이 안 됨 | Event Name, Source Emitter | Handler가 다른 이름이나 이미터를 기다림 | 이름과 소스 선택 통일 |
| 위치가 틀림 | Payload Position | 받는 필드 이름이나 타입이 다름 | Payload 필드 매핑 재확인 |
| 너무 많이 생성됨 | Spawn Number, Lifetime | 이벤트당 응답 수가 과함 | 응답 수와 수명 함께 낮춤 |
| 성능이 튐 | Event Rate | 충돌·죽음 이벤트가 과다 | 조건을 좁히고 거리/빈도 제한 |
이벤트 핸들러는 원인 이미터와 반응 이미터를 분리해 생각해야 하므로, 연결 조건을 체크리스트로 마무리합니다.
이벤트는 발생기와 수신기를 느슨하게 잇는 계약이다. 이름, payload, Source, Spawn Count가 맞아야 반응 이미터가 동작한다.
- 조건 발생
충돌, 사망, 임계값 도달을 감지한다.
- Event 발행
름과 payload를 한 묶음으로 보낸다.
- Receiver 수신
Source와 이벤트 이름을 맞춘다.
- 반응 생성
Spawn Count와 초기값으로 결과를 만든다.