

액터에 리본이 딱 붙게 만들수는 없을까
리본이 액터를 쫒아가는 모양이 나와서, 활용도가 매우 떨어진다. 어떻게 해결하면 좋을까


기존에 있는 리본렌더러 출력방식에 대해 알아보자
ex) Spawn Per Unit > Spawn Spacing : 30
→ Emitter가 30cm를 지날 때마다 파티클을 스폰
(30cm에 딱 도착하면 스폰안함 0.00001cm라도 이 거리를 지나가야 스폰)
→ 리본 렌더러는 각 파티클을 연결해 선을 그림 (최소 2개의 파티클은 필요)
리본렌더러의 문제점이 무엇일까
→ 보면 Emitter가 30cm를 지나갈 때마다 스폰을 하는데,
다음 거리를 지나기 전까지는 파티클이 없으니 리본을 그릴 수가 없음.
→ 그 찰나에 Emitter와 리본의 사이에 비어보이는 거리가 생김
→ 이것이 리본이 액터를 뒤늦게 따라가는 것 처럼 보이게 한다.
그럼 이제 어찌하면 좋을까. 가정을 해보자


가정1)
파티클의 포지션을 Emitter의 위치로 강제로 위치시키면 Gap이 사라지지 않을까?
그럼 촘촘하게 스폰할 필요없이, 이미터가 움직이면서 리본을 그리는 모양이 나올테니까.
문제점 > 리본은 파티클과 파티클 사이를 이어주는 렌더러인데,
모든 파티클이 이미터에 붙어버려서 리본을 그릴 수가 없음.
→ 적용 불가

가정2)
**[1. 제자리에 멈춰있는 파티클]**과 **[2. 이미터에 붙어서 움직이는 파티클]**을 구분하는 로직이 필요하다.
이러면 제자리에 멈추는 파티클을 기준으로 이미터에 붙은 파티클이 이동하면서 자연스럽게 리본을 그려줄 것이다.
→ 이걸로 결정
구현 방법


① Spacing 값 설정 (이동 거리 기준 정의)
-> 새로 추가한 <이미터 Float 파라미터>
Spacing은 이펙트가 리본을 그릴 때 사용할 간격 기준입니다.- Emitter가 이동하면서 파티클을 생성하는 구조이므로,
“얼마만큼 이동했을 때 새로운 파티클을 생성할지” 기준이 필요합니다. - 이 값을 활용해 파티클이 생성된 이후, 그 파티클이 이동을 멈출지 (고정),
혹은 계속 Emitter를 따라 이동할지(붙어서 움직이기)를 판단할 수 있습니다.
👉 정리: 이 값은 파티클 간격 + 파티클 이동/정지 판단 기준으로 사용됩니다.
② DistanceTraveled (Emitter의 이동 누적 거리)
-> 원래 있던 파라미터
- Emitter의 누적 이동 거리를 나타내는 값이 DistanceTraveled입니다.
👉 정리: DistanceTraveled는 현재 이미터의 위치 (거리 기준)이며,
이미터가 움직인 총 이동 누적거리를 나타냅니다.
③ BirthDistance (파티클이 생성될 당시 Emitter 위치 기록)
-> 새로 추가한 <파티클 Float 파라미터>
- 파티클이 생성되면, 그 순간의 Emitter 위치 (
DistanceTraveled)를
BirthDistance 변수에 저장합니다.(스냅샷) - 이후에 이 BirthDistance(파티클 위치 스냅샷)와
현재 DistanceTraveled(이미터의 총 누적거리)의 차이를 비교함으로써
해당 파티클이 Emitter로부터 얼마나 떨어져 있는지를 계산할 수 있습니다.
👉 정리: BirthDistance은 각 파티클이 태어난 “지점”을 기억해 두기 위한 값입니다.
(변하지 않는 값이기에 Particle Spawn에 변수를 추가한 것)
⑤ Lerp Position을 통한 위치 결정 (파티클 이동 vs 정지)
-> 원래 있던 <Paritlce.Position> 에 Lerp Position 적용
Lerp(A, B, Alpha)로 파티클의 최종 위치를 계산합니다.(Alpha = 0) A = SimulationPosition (이동 중인 Emitter 위치)
→ 파티클이 Emitter에 붙어서 이동한다.(Alpha = 1) B = Particle.Position (현재 파티클의 위치)
→ 파티클이 현재 위치에 유지 (파티클이 갑자기 멈추는 모양으로 보임)
👉 정리: Alpha에 따라 파티클이 계속 움직이게 할지 / 멈추게 할지 제어됩니다.
④ Distance 비교를 통한 조건 판단 (D = Distance 차이)
D = DistanceTraveled - BirthDistance- (파티클 생성으로부터 움직인 Emitter의 거리)
- (계산식이 기니까 D로 가정)
- 이
D값과Spacing값을 비교해서 Alpha값을 구합니다.
<Bool 조건을 통한 Alpha 값 설정>- Alpha는 Bool 조건에 따라 True/False에 따라 0 또는 1이 됩니다.
- [ Bool A ]
D < Spacing
→ Emitter가 생성된 파티클로부터 Spacing보다 멀어지지 않음Alpha = 0(true) - [ Bool B ]
D ≥ Spacing
→ Emitter가 생성된 파티클로부터 Spacing보다 멀어짐Alpha = 1(False)
- [ Bool A ]
- Alpha는 Bool 조건에 따라 True/False에 따라 0 또는 1이 됩니다.
기대효과

특정거리에서 파티클 1번을 정지. (Spacing 거리에 따라) 파티클 2번 스폰 후 다시 끌고감
→ 멈춰있는 파티클 1번과 끌려가는 파티클 2번 사이의 간격이 생기면서 리본렌더러가 그려진다고 보면 된다.
이렇게 구현하기 위해 특정거리를 기준으로
‘끌고가는 파티클’과 ‘멈추는 파티클’을 구분짓는 조건식을 만들어 적용함.
- 그 결과로 리본이 Emitter 궤적에 정확하게 붙어서 그려짐
- 우리가 문제로 삼았던, 리본과 액터의 Gap이 사라지게 되었음.
적용 결과




비교해보기










참고자료
https://realtimevfx.com/t/niagara-5-0-fix-ribbon-gap-mini-tutorial/22795/21