안동민 개발노트

본문 시작

조건문과 루프 구조의 기초

비교와 값 선택, 암묵적 파티클 반복을 구분하고 높이에 따라 색상이 달라지는 모듈을 구성합니다.

파티클이 특정 높이를 넘거나 속력이 달라질 때 색상과 크기를 바꾸려면 조건에 맞는 값을 선택해야 합니다. Niagara의 데이터 흐름을 Blueprint의 실행 핀 흐름과 구분해 보겠습니다.

조건에 따라 값 선택하기

Select는 Bool 조건에 따라 같은 타입의 두 값 중 하나를 출력합니다. 참이면 파란색, 거짓이면 빨간색을 선택하고 그 결과를 Map Set으로 Particles.Color에 기록하는 방식입니다. Niagara의 If 계열 노드도 값 비교·선택의 입력과 출력을 확인해서 사용하며, Blueprint Branch처럼 True/False/Do 실행 핀을 이어 붙이는 것으로 설명하지 않습니다.

  • Greater Than, Less Than, Equal 등의 비교 연산은 Bool 결과를 만듭니다.
  • AND, OR, NOT으로 조건을 조합합니다.
  • 경과 시간은 Particles.Age, 총 수명은 Particles.Lifetime입니다. “일정 시간이 지났는가”는 Age를 비교합니다.
  • Static Switch는 편집 시 정해진 선택으로 컴파일할 경로를 고릅니다. 매 틱 바뀌는 위치 조건과 용도가 다릅니다.

값 선택 노드를 썼다고 선택되지 않은 입력 계산이 반드시 생략되는 것은 아닙니다. 비싼 계산의 제거 여부는 컴파일 결과와 실제 비용으로 확인해야 합니다.

파티클 반복과 계산 내부 반복

Particle Update의 스크립트는 살아 있는 파티클마다 실행됩니다. 이를 위해 그래프에 For Each Particle 노드를 추가할 필요는 없습니다. 한 파티클의 모듈 순서는 데이터 의존성을 따르지만, 서로 다른 파티클이 인덱스 순서대로 실행된다고 가정해서는 안 됩니다.

반면 한 파티클의 계산 안에서 여러 샘플을 누적하는 작업은 별도의 반복입니다. Custom HLSL이나 Simulation Stage 등에서 지원하는 반복 방식과 CPU/GPU 제약을 확인해야 하며, Blueprint For Loop의 First Index/Loop Body/Completed 핀을 Niagara의 공통 인터페이스로 옮기지 않습니다. 반복 계산만으로 새 파티클이 생성되는 것도 아닙니다.

반복 횟수가 k라면 파티클 수와 실행 빈도에 더해 k가 비용에 곱해질 수 있습니다. 반복 상한을 정하고, 단순한 수식이나 사전 계산으로 같은 결과를 낼 수 있는지 먼저 확인합니다.

직접 해보기: 높이에 따라 색상 변경

NS_BasicSpawn을 복제해 실습합니다. 이 예제는 원점에서 위로 이동하는 파티클의 시뮬레이션 공간 Z가 50 cm를 넘는지를 검사합니다.

Emitter State가 계속 활성 상태를 유지하도록 하고, Emitter Update에 Spawn Rate를 둡니다. Particle Spawn의 Initialize Particle에서 Lifetime을 1초, 초기 위치를 원점으로 설정합니다. 그 뒤 Add Velocity에서 Z 속도를 100 cm/s로 지정합니다. 초기 위치를 바꾸는 Shape Location, 중력·저항 등은 이 실습에서 끕니다.

Particle Update에 Particle State와 Solve Forces and Velocity를 둡니다. 수명 종료 시 파티클이 제거되도록 설정합니다. Emitter의 Local Space를 켜면 아래 Z 비교는 시스템 기준 높이가 됩니다. 월드 높이를 검사하려면 공간 변환과 기준 위치를 별도로 맞춥니다.

Particle Update용 Scratch Pad 모듈을 만들고 solver 뒤에 배치합니다. 엔진의 Scale Color 원본 에셋을 수정하지 않습니다. 다른 Color/Scale Color 모듈은 이 실습의 결과를 덮어쓰지 않도록 끕니다.

Input Map을 Map Get과 Map Set에 연결합니다. Map Get에 Particles.Position을 추가하고, 현재 공간을 유지하는 Position→Vector 변환과 성분 분해로 Z를 얻습니다. Z를 Greater Than의 왼쪽 입력에, 50을 오른쪽 입력에 넣습니다.

Bool 비교 결과를 Select의 조건에 연결합니다. 출력 타입은 Color로 맞추고, True 값은 RGBA (0,0,1,1), False 값은 (1,0,0,1)로 지정합니다. 선택된 Color를 Map Set의 Particles.Color에 기록하고 변경된 맵을 Output Module로 보냅니다.

Apply & Save 후 시스템을 다시 시작합니다. Sprite Renderer의 Color Binding이 Particles.Color이고 머티리얼이 Particle Color의 RGB와 Alpha를 읽는지 확인합니다.

설정대로라면 Z가 50 이하일 때 빨간색, 50을 초과하면 파란색이 됩니다. 속도 100 cm/s와 수명 1초에서는 약 0.5초 뒤 경계를 넘을 수 있습니다. 이는 수식에 따른 예상이며, 틱 간격에 따라 처음 색이 바뀌는 샘플 시점은 달라집니다. 색이 바뀌지 않으면 도달 가능한 높이, 좌표 공간, 뒤쪽 Color 기록 모듈을 확인합니다.