본문 바로가기

블루프린트 제어

블루프린트에서 Niagara Component를 생성·활성화하고 사용자 변수·이벤트·Parameter Collection으로 효과를 제어합니다.

효과는 게임의 상황에 맞춰 켜지고 꺼져야 합니다. 무기를 들면 칼날에 불꽃이 피어나고, 피격당하면 그 자리에서 불꽃이 터지고, 바람이 세지면 장면의 연기가 모두 한쪽으로 흘러야 합니다. 이런 판단은 나이아가라가 아니라 블루프린트(Blueprint)가 합니다. 블루프린트가 게임의 이벤트와 상태를 보고, 나이아가라 컴포넌트를 재생하거나 사용자 파라미터의 값을 바꿉니다. 이 글에서는 이미 있는 컴포넌트를 켜고 끄는 방법과, 새 일회성 효과를 만드는 방법을 구분해 살펴보고, 키를 눌러 효과를 켜고 끄는 실습과 잠깐 생성률을 높이는 실습을 한 뒤, 여러 효과가 함께 쓰는 값을 나이아가라 파라미터 컬렉션으로 다루는 방법을 정리합니다.


컴포넌트를 붙이고 재생 제어하기

먼저 Actor 블루프린트 BP_NiagaraController를 만들거나 캐릭터, 무기의 블루프린트를 엽니다. Components 패널에서 나이아가라 컴포넌트를 추가하고 나이아가라 시스템 에셋을 지정합니다. 필요하면 이 컴포넌트를 다른 씬 컴포넌트의 자식으로 옮기고 상대 트랜스폼을 맞춥니다. 스켈레탈 메시에 붙일 때는 Parent Socket에 실제 본이나 소켓을 지정하고, 이미 생긴 입자까지 부모를 따라가게 할지는 이미터의 Local Space 설정으로 확인합니다.

재생을 직접 제어할 컴포넌트라면 Details에서 Auto Activate를 끕니다. 이것은 컴포넌트가 등록될 때 저절로 켜질지를 정하는 설정이므로, 플레이 중에 Set Auto Activate를 지금의 재생을 끄는 명령처럼 쓰지 않습니다.

재생을 제어하는 노드는 세 가지입니다. Activate는 컴포넌트를 켜며, 이미 켜진 시스템을 처음부터 다시 재생할지는 Reset 인자와 다시 초기화하는 정책을 확인합니다. Deactivate는 끄기를 요청하는 노드로, Inactive Response와 수명 설정에 따라 기존 입자가 자연스럽게 사라질 때까지 남을 수 있으며, 모두 곧바로 지워진다는 뜻은 아닙니다. Is Active는 컴포넌트가 켜져 있는지를 읽을 뿐, 살아 있는 입자의 수나 화면에 보이는지와는 같지 않습니다.


E 키로 켜고 끄기

먼저 BP_ToggleNiagara Actor에 나이아가라 컴포넌트를 추가하고 NS_BasicSpawn을 지정한 뒤 Auto Activate를 끕니다. 다시 쓸 컴포넌트이므로 효과가 끝난 뒤 저절로 파괴되지 않게 합니다. 혼자 하는 실습에서는 이 Actor의 Auto Receive Input을 Player 0으로 두고 레벨에 배치합니다. 실제 게임에서는 이미 입력을 받고 있는 PlayerController나 Character의 입력 액션에서 제어하는 편이 좋습니다.

다음으로 Event Graph에 E 키 이벤트와 Branch를 둡니다. E의 Pressed 실행 핀은 Branch의 실행 입력에 연결하고, 나이아가라 컴포넌트의 Is Active가 돌려주는 Bool은 Branch의 Condition에 연결합니다. Is Active는 실행 핀이 없는 순수(Pure) 조회 노드이므로 실행 핀을 연결하지 않습니다. 그다음 Branch의 True는 Deactivate에, False는 Activate에 연결하고, 두 노드의 Target은 같은 나이아가라 컴포넌트로 둡니다. 효과를 처음부터 다시 재생하고 싶다면 Activate의 Reset을 켭니다.

마지막으로 컴파일과 저장을 하고, 플레이(PIE) 화면에 입력 포커스를 준 뒤 E 키를 눌러 비교합니다. 껐는데도 입자가 남는다면, 시스템의 Inactive Response와 Lifetime에 따른 것인지 확인합니다.


사용자 파라미터로 효과 하나를 조절하기

블루프린트에서 효과의 값을 바꾸려면 사용자 파라미터를 씁니다. 나이아가라 시스템의 사용자 파라미터에 Float User.SpawnRateMultiplier를 만들고 기본값을 1로 둡니다. 그리고 Emitter Update의 Spawn Rate 입력을 기본 생성률 100 × User.SpawnRateMultiplier로 구성합니다. 그러면 배율이 1일 때 초당 100개, 5일 때 초당 500개가 됩니다. 배율을 생성률에 그대로 연결하면 초당 1개가 되므로, 배율과 생성률의 뜻을 구분합니다.

블루프린트에서는 그 나이아가라 컴포넌트를 Target으로 Set Niagara Variable (Float)를 부르고, 이름을 User.SpawnRateMultiplier로 맞춥니다. 색이나 벡터, Position 값이라면 노출한 타입에 맞는 setter를 씁니다.

변수의 이름만 선언했다고 값이 저절로 적용되지는 않습니다. 실제 모듈의 입력이 그 값을 읽어야 하며, Spawn에서만 읽는 값은 이미 살아 있는 입자에 거슬러 적용되지 않습니다.


잠깐 높아지는 생성률

이번에는 효과를 켠 뒤 0.5초 지나 생성률을 1초 동안 다섯 배로 높였다가 되돌려 봅니다. 앞의 토글에 단순한 Delay 사슬을 이어 붙이면, 효과를 끄거나 다시 켠 뒤에도 이전의 Delay가 남아 값을 덮어쓸 수 있습니다. 그래서 타이머 핸들을 변수에 보관해 두고, 다시 켜거나 끌 때 취소하는 흐름으로 만듭니다.

먼저 켜는 분기에서 Clear and Invalidate Timer by Handle로 이전 타이머를 취소하고 배율을 1로 되돌린 뒤 Activate합니다. 그리고 Set Timer by Event를 Looping은 끈 채로 Time 0.5로 불러 0.5초 뒤에 실행될 일회성 타이머를 시작하고, Return Value로 돌려받은 타이머 핸들을 변수에 저장합니다. 다음으로 Event 핀에 연결한 커스텀 이벤트, 즉 그 타이머의 콜백에서는 컴포넌트가 유효하고 지금 켜져 있는지 확인한 뒤 배율을 5로 정하고, 이어서 1초 뒤에 배율을 1로 되돌리는 일회성 타이머를 같은 방법으로 시작해 그 핸들도 저장합니다. 마지막으로 끄는 분기와 EndPlay에서는 Clear and Invalidate Timer by Handle로 두 타이머를 모두 취소하고 필요한 기본값을 되돌린 뒤, 컴포넌트 참조를 확인하고 Deactivate합니다.

이렇게 하면 켠 직후에는 초당 100개, 0.5초 뒤에는 초당 500개, 다시 1초 뒤에는 초당 100개가 만들어질 것으로 예상됩니다. 이것은 생성 직후에 한 번 터지는 버스트와는 다른 동작입니다.

타이머 핸들이 왜 필요한지 시간 순서로 따라가 봅니다. 0초에 켜고 0.2초에 끈 뒤 0.3초에 다시 켰다고 합시다. 끄는 분기가 이전 핸들을 취소했다면, 첫 번째 켜기에서 예약한 0.5초의 콜백은 실행되지 않습니다. 대신 두 번째 켜기를 기준으로 0.8초에 배율이 5가 되고, 1.8초에 1로 돌아옵니다. 반면 단순한 Delay만 남겨 두었다면, Delay 노드는 시간을 세는 동안 다시 불린 호출을 무시하므로 0.3초의 두 번째 켜기는 새 Delay를 시작하지 못합니다. 그래서 첫 번째 켜기의 Delay가 0.5초에 새 효과의 값을 너무 일찍 덮어쓰고, 이어지는 1초 Delay도 1.5초에 배율을 1로 되돌립니다. 이때는 컴포넌트가 유효하고 켜져 있는지 검사하는 것만으로는, 그 실행이 어느 켜기에서 시작된 것인지 구별하지 못합니다.

시각일어난 일핸들을 취소할 때단순 Delay일 때
0초첫 번째 켜기0.5초 콜백 예약0.5초 Delay 시작
0.2초끄기0.5초 콜백 취소Delay는 남음
0.3초두 번째 켜기0.8초 콜백 예약같은 Delay가 아직 세는 중이라 새 호출은 무시됨
0.5초첫 번째 켜기의 시점아무 일 없음배율 5로 바뀜(너무 이름)
0.8초두 번째 켜기의 시점배율 5새 일은 없음(0.5초부터 배율 5)

게임의 이벤트와 나이아가라의 이벤트

피격 같은 게임의 이벤트는 블루프린트에서 일회성 시스템을 새로 만들거나, 이미 있는 컴포넌트의 값을 바꾸는 계기가 됩니다. Spawn System at Location과 Spawn System Attached에는 사용자 파라미터를 넘기는 입력 핀이 없으므로, 이 노드만으로 새 효과에 초기값까지 함께 넘길 수는 없습니다.

새로 만드는 효과에 초기값이 필요하다면, Spawn System at Location의 Auto Activate를 끄고, 돌려받은 나이아가라 컴포넌트가 유효하면 사용자 파라미터의 값을 넣은 뒤 Activate합니다. 위치나 부착의 입력, 그리고 효과가 끝난 뒤의 Auto Destroy나 풀링 정책도 함께 정합니다.

나이아가라 안의 이벤트 핸들러는 이것과 다릅니다. 이벤트 핸들러는 주로 같은 시스템 안의 원본 이미터가 만든 Location, Collision, Death 이벤트를 받는 기능이어서, Source를 블루프린트로 정해 아무 게임 이벤트나 받는 공통 인터페이스가 아닙니다. 게임에서 생긴 많은 이벤트를 모아 효과에 넘겨야 한다면, 쓰는 버전에서 지원하는 나이아가라 데이터 채널(Niagara Data Channels)을 따로 검토합니다.


여러 효과가 함께 쓰는 값

바람의 세기나 시간대처럼 여러 효과가 함께 써야 하는 값은 나이아가라 파라미터 컬렉션(Niagara Parameter Collection, NPC)에 두고, 효과마다 다른 값은 사용자 파라미터로 둡니다.

쓰는 순서는 다음과 같습니다. 먼저 NPC_GlobalFX 컬렉션에 WindStrength 같은 Float를 정의합니다. 다음으로 그 월드에서 Get Niagara Parameter Collection으로 컬렉션의 인스턴스를 얻고, 그 인스턴스를 Target으로 Set Float Parameter를 부릅니다. 이때 컬렉션이 실제로 쓰는 파라미터의 전체 이름을 확인합니다. 마지막으로 각 시스템의 모듈이 이 컬렉션 값을 읽도록 연결합니다. Spawn에서 읽으면 새 입자에, Update에서 읽으면 그 갱신 시점에 반영됩니다. 이 흐름을 짧게 적으면 다음과 같습니다.

BP_GameState의 상태 변화
  -> Get Niagara Parameter Collection (NPC_GlobalFX, 현재 월드)
  -> 반환 인스턴스의 Set Float Parameter (WindStrength의 실제 이름)
  -> Niagara의 연결된 모듈 입력이 해당 단계에서 읽음

공유하는 컬렉션이라고 해서 네트워크로 저절로 복제되지는 않습니다. 서버가 정하는 값이라면 게임 로직이 필요한 클라이언트에 그 값을 전달하고, 각 월드에서 시각적인 상태를 갱신합니다. 서버가 정한 값을 클라이언트에 보내는 방법은 블루프린트에서의 리플리케이션에서 다룹니다.


역할을 나누어 두기

각 부분이 맡는 일을 나누어 두면 효과를 다시 쓰기 쉬워집니다. 이미터는 한 종류의 입자를 만들고 움직이고 그리는 규칙을 맡고, 시스템은 여러 이미터와 바깥 입력을 조합합니다. 블루프린트는 게임의 조건과 컴포넌트의 수명을 맡고, 파라미터 컬렉션은 여러 효과가 함께 쓰는 입력을 맡습니다. 이렇게 나누어 두면 같은 불꽃 이미터를 여러 무기의 시스템에서 다시 쓰기 쉽습니다.


정리

  • 블루프린트는 게임의 이벤트와 상태를 판단해 나이아가라 컴포넌트를 Activate, Deactivate하며, 직접 제어할 컴포넌트는 Auto Activate를 끕니다.
  • Deactivate는 끄기 요청이라 기존 입자는 Inactive Response와 수명에 따라 남을 수 있고, Is Active는 입자 수나 가시성과 같지 않습니다.
  • 사용자 파라미터는 Set Niagara Variable 계열 노드로 이름과 타입을 맞춰 넣으며, 모듈의 입력이 그 값을 읽어야 적용됩니다.
  • 지연된 값 변경은 타이머 핸들을 보관해 끄거나 다시 켤 때 취소해야, 이전 실행이 새 효과의 값을 덮어쓰지 않습니다.
  • 새 일회성 효과는 Spawn System at Location으로 만들고, 여러 효과가 함께 쓰는 값은 파라미터 컬렉션에 둡니다.

연습 문제

1. 0.7초에 다시 끄면

본문의 타이머 예에서 두 번째로 켠 효과를 0.7초에 다시 껐습니다. 0.8초와 1.8초의 배율 콜백이 실행되어야 할까요? Deactivate 직후 입자 수가 반드시 0이 될까요?

해설 보기

실행되면 안 됩니다. 끄는 분기에서 두 번째 켜기의 타이머들도 취소하므로, 0.8초와 1.8초의 콜백이 꺼진 효과의 값을 바꾸지 않습니다. 끌 때는 기본값을 되돌리고 컴포넌트가 유효한지도 확인합니다.

Deactivate 직후 입자 수가 반드시 0이 되지는 않습니다. 끄기 요청은 입자를 곧바로 지우는 것과 같지 않으며, 이미 있던 입자가 어떻게 마무리될지는 Inactive Response와 수명을 따릅니다. 이 설명은 타이머가 실제로 어느 프레임에 호출되는지 잰 기록이 아니라, 주어진 순서로 추론한 예입니다.

2. 배율 5인데 초당 5개

User.SpawnRateMultiplier를 Spawn Rate 입력에 그대로 연결하고 블루프린트에서 5를 넣었더니, 초당 500개가 아니라 5개만 만들어집니다. 무엇이 잘못되었을까요?

해설 보기

배율을 생성률에 그대로 연결했기 때문에, 5라는 값이 곧 초당 5개라는 생성률로 쓰였습니다. 배율과 생성률은 뜻이 다른 값입니다.

Spawn Rate 입력을 100 × User.SpawnRateMultiplier처럼 기본 생성률에 배율을 곱한 식으로 구성하면, 배율 1에서 초당 100개, 5에서 초당 500개가 됩니다.

3. 처음 색을 넘긴 피격 효과

피격 위치에 Spawn System at Location으로 효과를 만든 직후 Set Niagara Variable (LinearColor)로 색을 넣었는데, 첫 몇 개의 입자가 기본 색으로 보입니다. 어떻게 고치면 좋을까요?

해설 보기

Spawn System at Location의 Auto Activate가 켜져 있으면, 효과가 만들어지는 즉시 재생이 시작되어 색을 넣기 전에 첫 입자들이 기본 색으로 생길 수 있습니다.

Auto Activate를 끄고, 돌려받은 컴포넌트가 유효한지 확인한 뒤 색을 넣고 나서 Activate합니다. 그러면 첫 입자부터 넘겨준 색으로 만들어집니다. 효과가 끝난 뒤 Auto Destroy나 풀링으로 어떻게 정리할지도 함께 정합니다.

Spawn System at Location의 입력은 Epic의 Spawn System at Location 노드 문서에서, 블루프린트에서 쓸 수 있는 나이아가라 노드의 목록은 Epic의 Niagara 블루프린트 API 문서에서 확인할 수 있습니다.

다음 글 동적 파라미터 갱신에서는 플레이 중에 바뀌는 게임의 값을 사용자 파라미터로 넘길 때, 언제 얼마나 자주 갱신할지를 다룹니다.