2024. 5. 21. 16:15ㆍUnity
지금 껏 셰이더 그래프, 파티클로만 에셋을 만들다가 불 표현을 어떻게 하면 좀 더 사실적으로 만들 수 있을 지를 생각해보았다. Unity에서도 쓸 수 있는 VFX 기술을 이용해서 가능할 것이라고 생각했고, 도전해봤다. 유튜브를 참고했다.
버전: HDRP 2021.3.12f1
영상에서 쓰이는 텍스쳐는 아래 유니티 블로그에서 무료로 Flipbook 형태로 바둑판 처럼 이루어진 텍스쳐를 받아서 사용하였다.
화염 만들기
먼저, VFX를 만들기 위해서는 Package Manager에서 Visual Effect Graph를 설치해야 한다.
설치를 했다면 프로젝트 창에서 [Creat] - [Visual Effects] - [Visual Effect Graph]를 선택하여 VFX를 생성한다.
VFX를 생성했다면 가장 먼저 보이는 것은 Simple Particle System이다. 결국 VFX도 노드를 이용한 파티클 시스템 생성 기술이지 않을까 생각했다.
해당 시스템의 가장 상단을 보면 Spawn으로, 해당 효과를 생성하는 데에 전체적인 설정을 할 수 있다. 기본적으로는 [Spawn Rate]으로 생성 비율을 설정할 수 있다. 숫자가 크면 더 많이 생성된다.
Initialize Particle 부분은 파티클 생성 부분에 대한 설정이다.
[Capacity] 값을 통해 총 표현될 파티클의 양을 정할 수 있다. 높을 수록 더 많은 파티클이 보여진다.
[Set Lifetime Random] 값으로 파티클에게 무작위의 수명을 줄 수 있다.
[Set Pivot.Y]는 파티클이 생성될 Y축 기준 피봇을 변경하는 노드이다.
[Set Position]의 모양에 따라서 파티클이 생성될 공간(Volume) 또는 표면(Surface)을 설정할 수 있다. 여기서는 원뿔 형태로 모닥불 모양을 잡았다.
Update Particle 부분은 C# 스크립트의 void Update 처럼 파티클에게 계속해서 효과를 적용시키는 부분이다.
여기서는 [Flipbook Player] 노드로 Flipbook 형태의 텍스쳐를 얼마나 빠르게 바꿀 것인지 즉, 불이 얼마나 빠르게 돌아갈 것인지를 설정할 수 있다.
마지막으로 Output Particle Quad 부분은, 파티클이 렌더될 때 부여하는 설정들이다.
기본적으로 [Face Camera Plane], [Set Size over Life], [Set Color over Life] 노드가 포함되어 있다.
각각 카메라에 어떻게 보여질 것인지, 파티클 수명에 따른 사이즈와 컬러를 설정하는 노드이다. over Life 관련은 파티클 시스템을 써 봤다면 익숙한 설정일 것이다.
아래 설정한 이미지를 보면 [Uv Mode]를 [Flipbook]으로 설정하였고, [Blend Mode]는 [Additive]로 설정했다.
위에서 말했던 유니티 블로그에서 Flame02 텍스쳐를 받았고, 16x4 Flipbook 형태이기 때문에 [Flip Book Size]를 16, 4로 설정한 것을 볼 수 있다. 사이즈를 다르게 하면 이상하게 나온다.
[Set Size Random from Curve] 설정을 통해 랜덤 사이즈를 부여할 수 있고,
[Multiple Size] 설정으로 파티클 자체의 크기를 바꿀 수 있으며,
[Add Scale.Y] 설정으로 Y축 스케일만 변경할 수 있다.
불꽃 스파크 만들기
나무가 타는 모습을 보면 단순히 불꽃만 생기지는 않는다. 나무가 타닥 타닥 타면서 스파크를 간간히 만들어 낸다. 해당 부분 또한 새로운 Spawn System으로 만든다. 빈 공간에 스페이스 바를 누른 후 "simple"을 검색하여 [Simple Swarm Particle System]을 생성한다.
마찬가지로, Spawn 부분에서는 전체적인 파티클 생성을 설정한다.
Initialize Particle 설정에서는 똑같이 Capacity를 조절하고,
[Set Velocity Random]에서 X/Y/Z 축으로 랜덤한 속도를 줄 수 있다.
Update Particle에서 [Turbulence] 노드를 통해서 파티클에 말 그대로 난기류 값을 줄 수 있다. Intensity를 통해서 얼마나 강하게, Drag를 통해서 얼마나 마찰을 줄 것인지, Frequency를 통해서 얼마나 자주 부여할 것인지를 설정할 수 있다.
Output Particle Quad 부분에서는, [Orient: Along Velocity] 노드를 통해 나아가고자 하는 속도 방향으로 진행하도록 설정했다.
[Set Scale.X]로 X축 스케일을 조절하고,
[Set Scale.Y by Speed]로 Y축 방향이 빨라질 때 스케일도 커지도록 설정했다. Speed Range로 어떤 스피드 범위 내에서 적용할 지를 설정할 수 있다.
[Set Color over Life]로 시간이 지나감에 따라 붉은 색으로 표시되도록 했고 처음과 끝에는 알파값을 넣어서 자연스럽게 스파크가 없어지도록 했다.
[Camera Fade] 노드를 이용해서 카메라 거리에 따라 해당 파티클이 보여질지 아닐지를 설정했다. 이 부분은 최적화와도 관련이 있다.
연기 표현하기
불이 나무를 태울 때는 연기도 나기 때문에 해당 부분도 구현한다.
[Simple Particle System]으로 옆 빈 공간에 파티클 시스템을 하나 만든다.
Spawn 부분 설정
Initialize Particle 부분 설정
[Set Velocity Random]에서 너무 퍼지지 않게 하기 위해서 값을 줄였다.
[Set Position]에서는 구 형태의 표면에서 생성되게 설정했고, 크기나 스케일은 원하는 대로 설정하면 된다.
Update Particle 부분의 설정은,
[Gravity] 노드를 통해서 Y축 위 방향으로 0.1의 중력을 적용해서 더 빨라지도록 설정했다. default 값은 Y에 -9.81이 설정되어 있다.
연기도 Flipbook 형태의 텍스쳐이기 때문에 [Flipbook Player] 노드로 연기의 변화 빠르기 설정이 가능하다.
Output Particle Lit Quad를 따로 생성해서 Output에 적용하였다. Lit Quad로 빛에 영향을 받는 연기를 만들어서 올라가는 중에 불꽃에 가까울 수록 밝고 멀어질 수록 어둡게 표현된다.
[Uv Mode]
[Set Color over Life]로 알파 값을 부여하여 투명도를 조절했다.
디스토션 적용하기
불을 보면 강력한 열에너지로 주변에 일렁이는 효과도 동반되는 것을 볼 수 있다.
해당 효과도 구현하였다.
Spawn 설정
Initialize Particle 설정
Update Particle 설정
Output Particle Distortion Quad 설정
Output에는 기존의 것 말고 Distortion Quad를 따로 생성해서 붙였다. 우리가 3D Mesh를 쓰는 것은 아니기 때문에 텍스쳐를 이용하는 [Output Particle Distortion Quad]를 사용했다.
FireBall04 8x8 Flipbook을 사용했기 때문에 [Uv Mode]는 [Flipbook Blend] 설정, [Flip Book Size]는 8, 8로 설정했을 때 디스토션이 너무 네모로만 보여서 1, 1로 설정하였다.
결과적으로는 총 4개의 파티클을 생성하였고 전체 모습은 아래와 같다.
Point Light 깜박이게 하기
불은 에너지와 빛을 가지고 있기 때문에 불이 일렁이는 만큼 빛도 아른거리는 효과가 나면 더 사실적으로 볼 수 있다.
따라서 Point Light을 추가하여 주변에 빛을 내게 만들었다. 설정 값은 아래와 같다.
이상하게 Intensity를 아무리 높여도 생각보다 빛이 밝지가 않아서 값이 엄청 높게 들어간 것을 볼 수 있다. (아직 나 스스로 HDRP의 빛에 대한 이해가 부족해서 일 수도 있다.)
그리고 깜빡이는 효과를 위해서 LightFlickering 스크립트를 생성하여 적용하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LightFlickering : MonoBehaviour
{
[SerializeField] private Light lightSource;
[SerializeField] private float min, max, intensityMuliplier, flickerInterval;
private void OnEnable()
{
StartCoroutine(Flicker(flickerInterval));
}
private IEnumerator Flicker(float interval)
{
while (interval > 0)
{
yield return new WaitForSeconds(interval);
lightSource.intensity = Random.Range(min, max) * intensityMuliplier;
}
while (interval <= 0)
{
yield return null;
lightSource.intensity = Random.Range(min, max) * intensityMuliplier;
}
}
}
결과
장작으로 사용될 나뭇가지 몇 개를 같이 올려서 Play를 한 모습이다. 다른 사람들이 만든 더 좋은 불도 많지만 나름 VFX와 HDRP를 이용한 불로는 쓸만하지 않나 생각한다.
장작을 바꾸고 주변 환경도 바꾸면 더 좋은 결과물을 만들 수 있을 것으로 생각된다.
그래서 주변 환경이 같이 있는 프로젝트에 만든 모닥불을 넣어보았다!
Unity에서 무료로 제공해주는 HDRP 프로젝트이며, 숲이기 때문에 모닥불이 잘 어울리지 않을까 생각했다.
멀리서 보면,
개인적으로는 만족하는 결과물이 나왔다.
보다보니 연기가 너무 모락모락한 것 같아서 다른 연기로 바꿔보았다.
유니티 블로그에 있는 DiscSmoke01 Flipbook을 사용했다.
연기를 크게, 적게 쓰고 싶어서 [Rate]는 1, [Capacity]는 2로 설정했다.
작은 범위 안에서 랜덤 속도는 사용하지 않을 것이라 [Set Velocity Random]은 비활성화 했다.
[Set Lifetime Random]은 길게 설정.
[Set Position Arc Sphere]도 최대한 구의 크기를 줄여서 너무 연기가 퍼지지 않게 했다.
[Gravity]는 너무 텍스쳐 자체가 올라가게 하지 않기 위해서 0.1에서 0.08로 줄였다.
Flipbook 자체에 어느정도 Turbulence가 들어있기 때문에 파티클에서는 비활성화 했다.
[Base Color Map]은 DiscSmoke01_16x4로 바꾸었고, [Flip Book Size] 또한 16, 4를 사용했다.
[Set Color over Life]에서는, 검은 연기를 위해서 검은색을, 그리고 알파값도 괜찮게 수정했다.
연기 자체의 크기를 키우기 위해서 [Multiply Size]를 추가하여 10을 설정했고,
[Add Scale.Y] 노드를 이용해서 Y축 방향 세로로 긴 연기를 만들었다.
연기가 수정된 결과
모락모락 연기에서 조금 더 자연스러워진 것 같기도 하다.
환경을 설정해서 보면,
생각보다는 연기가 잘 보이지 않는다.
'Unity' 카테고리의 다른 글
[Unity] 물 효과 연구(1) - VFX, 텍스쳐 파티클 시스템 사용하기 (3) | 2024.07.24 |
---|---|
[Unity] 나무와 풀이 바람에 영향을 받는 것처럼 보이는 셰이더 만들기 (0) | 2024.07.09 |
[Unity E-Book] 모바일 게임 퍼포먼스 최적화하기(Profiling, Memory, Code Architecture) (1) | 2024.05.09 |
[Unity] Unity Muse 사용해보기(3) -Sprite 편 (2) | 2024.05.02 |
[Unity] Unity Muse 사용해보기(2) -Animation 편 (0) | 2024.04.30 |