조건문과 루프 구조의 기초
지금까지 파티클의 속성을 직접 조작하고 수학적으로 연산하는 방법을 배웠습니다. 하지만 실제 게임 효과는 단순히 직선적인 움직임이나 일률적인 변화만으로는 부족합니다. 특정 조건에 따라 파티클의 동작을 변경하거나, 반복적인 작업을 효율적으로 처리해야 할 때가 많습니다. 이때 필요한 것이 바로 조건문(Conditional Statements) 과 루프(Loop Structures) 입니다.
나이아가라 스크립트 에디터는 비주얼 스크립팅을 통해 이러한 프로그래밍의 핵심 개념을 파티클 시스템에 적용할 수 있도록 해줍니다. 이를 통해 여러분은 훨씬 더 지능적이고 반응적인 파티클 효과를 구현할 수 있게 됩니다.
조건문: If
노드와 Select
노드
조건문은 특정 조건이 참(True) 일 때와 거짓(False) 일 때 다른 동작을 수행하도록 지시하는 프로그래밍 구조입니다. 나이아가라에서는 주로 If
노드와 Select
노드를 사용합니다.
If
노드 (컨트롤 플로우)
If
노드는 전통적인 프로그래밍의 if-else
문과 유사하게 작동합니다. 특정 조건에 따라 스크립트의 실행 흐름을 분기시킵니다.
- 입력 핀
Condition
:Bool
타입의 입력 핀입니다. 이 값이True
이면True
출력으로 연결된 노드가 실행되고,False
이면False
출력으로 연결된 노드가 실행됩니다.
- 출력 핀
True
:Condition
이 참일 때 실행될 연결 핀입니다.False
:Condition
이 거짓일 때 실행될 연결 핀입니다.
- 사용 예시
- 파티클의
Lifetime
이 특정 시간을 초과했을 때만 색상을 변경하거나, 특정 효과를 발생시킬 때. - 파티클이 특정 영역 내에 있을 때만 중력의 영향을 받게 할 때.
- 파티클의
- 팁:
If
노드는 제어 흐름(Control Flow)을 담당하므로, 일반적으로Do
핀(회색 실행 핀)을 사용하여 다음 노드로 실행을 넘깁니다.
Select
노드 (데이터 선택)
Select
노드는 If
노드와 유사하게 조건에 따라 값을 선택하지만, 실행 흐름을 분기하는 대신 데이터를 선택합니다. If
노드보다 간단한 조건부 값 할당에 유용합니다.
- 입력 핀
Condition
:Bool
타입의 입력 핀입니다.True
:Condition
이 참일 때 출력될 값입니다.False
:Condition
이 거짓일 때 출력될 값입니다.
- 출력 핀
Result
:Condition
에 따라 선택된 값이 출력됩니다.
- 사용 예시
- 파티클의 속도가 빠를 때는 파란색, 느릴 때는 빨간색으로 설정할 때.
- 특정 조건에 따라 파티클의
Sprite Size
를 다르게 설정할 때.
- 팁:
Select
노드는 데이터 입출력(Data Flow)을 담당하며,Do
핀이 없습니다.
비교 연산자 (Comparison Operators)
If
나 Select
노드의 Condition
입력을 만들기 위해서는 두 값을 비교하는 노드들이 필요합니다.
>
(Greater Than),<
(Less Than),>=
(Greater Than or Equal),<=
(Less Than or Equal): 두 숫자의 크기를 비교하여Bool
값을 출력합니다.==
(Equal),!=
(Not Equal): 두 값이 같은지 또는 다른지 비교하여Bool
값을 출력합니다.AND
,OR
,NOT
: 여러Bool
값을 논리적으로 결합하거나 반전시킵니다.
루프 구조: For Each Particle
과 For Loop
(고급 개념)
루프는 특정 작업을 여러 번 반복할 때 사용됩니다. 나이아가라에서는 주로 파티클 시스템의 특성에 맞춘 루프 노드들이 사용됩니다.
For Each Particle
(내장 루프)
대부분의 나이아가라 모듈은 내부적으로 For Each Particle
루프를 포함하고 있습니다. 이는 이미터 내의 모든 활성화된 파티클에 대해 특정 연산을 반복적으로 수행합니다. 여러분은 이 루프를 직접 추가할 필요 없이, Particle Update
섹션의 모든 모듈이 암묵적으로 각 파티클에 대해 실행됩니다.
- 개념:
Particle Update
섹션의Add Velocity
,Scale Color
등 모든 모듈은 기본적으로 활성화된 모든 파티클에 대해 순차적으로 실행됩니다. 이것이 바로 파티클 업데이트 모듈들이 파티클마다 독립적으로 동작하는 이유입니다.
For Loop
(사용자 정의 루프)
For Loop
노드는 특정 횟수만큼 반복 작업을 수행할 때 사용됩니다. 이는 주로 사용자 정의 모듈 내에서 특정 계산을 여러 번 반복해야 할 때나, 복잡한 패턴을 생성할 때 활용됩니다.
- 입력 핀
First Index
: 루프 시작 인덱스.Last Index
: 루프 종료 인덱스.Do
: 루프가 시작될 때의 실행 핀.
- 출력 핀
Loop Body
: 각 반복마다 실행되는 실행 핀.Index
: 현재 반복의 인덱스(First Index
부터Last Index
까지).Completed
: 루프가 완료되었을 때 실행되는 실행 핀.
- 사용 예시 (고급)
- 단일 파티클에서 여러 개의 작은 서브 파티클을 특정 패턴으로 생성하거나 위치를 계산할 때.
- 프랙탈 패턴이나 복잡한 수학적 알고리즘을 파티클에 적용할 때.
- 팁:
For Loop
는 사용자 정의 모듈 스크립트 내에서만 주로 사용되며, 성능에 민감하므로 신중하게 사용해야 합니다. 너무 많은 반복은 성능 저하로 이어질 수 있습니다.
직접 해보기: 조건부 색상 변경
파티클의 높이(Z축 위치)에 따라 색상을 다르게 표현하는 간단한 조건을 만들어 보겠습니다.
- 이전 절에서 만들었던
NS_BasicSpawn
시스템을 엽니다. (만약 없다면Initialize Particle
,Spawn Rate
,Sprite Renderer
, 그리고Add Velocity
에 Z값을100.0
정도로 주어 파티클이 위로 솟아오르도록 설정합니다.) - 개요(Overview) 패널에서 이미터의
Particle Update
섹션으로 이동합니다. +
버튼을 클릭하고Scale Color
모듈을 검색하여 추가합니다.Scale Color
모듈을 선택한 후, 디테일(Details) 패널에서Scale Factor
옆의 드롭다운 메뉴를 클릭하고Color From Curve
를Direct Set
으로 변경합니다. (기존 커브 설정 제거)Scale Factor
옆의Vector
버튼을 클릭하여Make Vector4
를 선택합니다. (RGBA 색상 표현)- 이제 스크립트 에디터에서
Scale Color
모듈을 선택한 상태로 작업합니다. - 노드 추가
- 빈 공간에 우클릭하고
Get Particles.Position
노드를 추가합니다. Split Vector
노드를 추가하고Particles.Position
의 출력을Split Vector
의 입력에 연결합니다. (Z값을 얻기 위함)>
(Greater Than) 노드를 추가합니다.Split Vector
의Z
출력 핀을>
노드의 첫 번째 입력에 연결합니다.>
노드의 두 번째 입력 핀에 직접500.0
과 같은 임계값(Float)을 입력합니다. (높이 500 이상일 경우)Select
노드를 추가합니다.>
노드의Result
(Bool) 출력을Select
노드의Condition
입력에 연결합니다.Select
노드의True
입력에Make Vector4
노드를 연결하여Blue
(R:0, G:0, B:1, A:1)를 설정합니다.Select
노드의False
입력에 다른Make Vector4
노드를 연결하여Red
(R:1, G:0, B:0, A:1)를 설정합니다.Select
노드의Result
출력을Scale Color
모듈의Scale Factor
입력(보라색)에 연결합니다.
- 빈 공간에 우클릭하고
이제 뷰포트에서 파티클이 특정 높이(500.0
) 미만일 때는 빨간색으로 보이다가, 그 이상으로 솟아오르면 파란색으로 변하는 것을 확인할 수 있을 겁니다.
조건문과 루프 구조는 나이아가라 파티클 시스템에 '지능'을 부여합니다. 파티클이 단순히 정해진 규칙에 따라 움직이는 것을 넘어, 주변 환경이나 자신의 상태에 따라 능동적으로 반응하고 변화할 수 있게 해주는 것이죠. 이러한 개념들을 숙달하면 더욱 복잡하고 흥미로운 시각 효과를 자유자재로 만들 수 있을 것입니다.