실감 공통편 폭발 이펙트
GCC 사관학교
안녕하세요 박현상 입니다
이번 강의부터는 나이아가라를 이용한
언리얼 이펙트를 다루게 됩니다
나이아가라의 다양한 모듈과
다른 에셋들과의 연계를 이용하여
다소 정적이었던 셰이더와는 다르게
다이나믹한 효과들을 만들게 됩니다
나이아가라의 버스트와
셰이더의 월드 오프셋과 같은 기능들을 활용해서
폭발 이펙트를 만들어 볼 겁니다
특히 메시 파티클이라고 하는 것을 사용해서
스프라이트의 이미지가 아니라
메시를 구체나 큐브와 같은
메시 파티클 입자로서 사용하게 될 것입니다
폭발 이펙트는 순간적인 힘을 이용해서
강한 인상을 남길 수 있는 효과 중에 하나인데요
우리가 일상생활에서 흔히 보는
불꽃놀이와 같은 폭발에서부터
함께 묘사되는 다양한
나이아가라의 모듈들을 활용해 보겠습니다
폭발 반경 세팅 및 폭발 효과 연출
폭발 이펙트 제작을 위한 에셋부터
차근차근 진행해 보겠습니다
우선은 ExplosionFX라는 폴더를 하나 만들어 뒀구요
나이아가라를 만들어 줍니다
그리고 여기에 사용할 가장 기본이 되는 것은
SingleLoopingParticle이라고 있습니다
이것을 기본 템플릿으로 해서
Create 버튼을 눌러 주겠습니다
에셋의 이름은 FX_Explosion이라고
이렇게 간단하게 지어주고요
더블 클릭해서 나이아가라 창을 오픈하도록 하겠습니다
나이아가라 창을 보면 프리뷰 화면에서
지금 원형에 이런 식으로 작은 구체가 하나 있습니다
우선 폭발 이펙트를 다루는데 대략적인 개요를 말씀드리면
이 원형은 폭발의 전체적인 범위를 그려줄 수 있는
이렇게 확장될 수 있게 크기가 늘어나는
구체 모양으로 사용할 겁니다
여기에서 하나 여러분들이 알아 두셔야 될 게 있는데
기본적으로 이 파티클에는 스프라이트라고 하는
카메라를 항상 정면으로 바라보는
사각형의 메시를 이용해서
이 기본 세팅이 되어 있습니다
근데 이게 구체 범위를 나타내려고 하면
일반적인 이런 사각형의 메시가 아니고
스피어를 직접 가져다 써야겠죠
그래서 실제 부피를 가지고 있는
3D 메시를 사용을 해야 되는데
3D 메시를 사용하기 위해서는 여러분들이 여기 보이는
Renderer 항목에 Sprite가 아니고 + 버튼을 눌러서
Mesh Renderer를 추가해 주고
Sprite는 끄도록 하겠습니다
그럼 화면에서 동그란 구체가 사라졌죠
이 Mesh Renderer의 Meshes 항목에서
지금 화살표 기즈모 모양으로 되어 있어서
실제 뷰포트를 확인해 보면 이렇게
작은 기즈모가 떠 있는 것을 확인하실 수가 있는데
이것을 sphere라고 검색했을 때
나오는 여러가지 스피어들 중에
가장 기본이 되는 Static Mesh Sphere
이렇게 스피어 항목들 중에서도
이 Sky 아래쪽에 보면은 기본 Static
이것을 넣어줍니다
여러분들이 이걸
스태틱 메시와 관련되어 있는 에셋을 사용하실 때
이걸 더블 클릭해서 간단한 조건을 좀 알아볼 건데요
간혹 이렇게 스피어들 중에 UV가 안 펴져 있거나
혹은 피봇이 아래쪽에 잡혀 있는 경우에는
사용하시면 안 되고
이 오브젝트 피봇이 중앙에 위치할 수 있게끔
실제로 뷰포트에서 이렇게 움직여 보면
F키를 눌러서 움직여 보면
이렇게 그리드가 구의 중앙을 향해서 이렇게 연결되어 있죠
그래서 피봇점이 구의 중앙에 잡혀 있다는 의미입니다
그렇기 때문에 여러분들이
이런 스피어 메시를 고른다고 하시면
지금 제가 설명드린 이러한 조건을 갖춘
그리드가 구체의 중앙을
이렇게 측면에서 봐도 중앙을 향하고 있죠
그리고 지금 보는 것처럼 이렇게 UV가 펴져서
체크무늬가 온전히 보이는 형태의
스피어를 사용하시는 것이 좋습니다
지금 상태에서는 이 Initialize Particle에서 보면
Sprite Mode만 Uniform으로 세팅이 되어 있고
Mesh Attribute라는 항목은 Unset으로 되어 있기 때문에
우리 눈에 보이지 않는 거죠
그래서 스프라이트 렌더러는 사용하지 않으니까
리셋을 해주시고
Mesh Scale Mode를 Uniform으로 바꿔 주겠습니다
그리고 Lifetime을 CurrentLoopDuration으로 되어 있던 걸
리셋을 해서 1로 맞춰 주고요
그러면 이제 컴파일이 끝나고 나면
이런 식으로 구체가 우리 눈에 보이게 될 겁니다
Emitter의 State 항목도 Life Cycle Mode를 Self로 해서
우리가 만들려는 건 폭발 이펙트죠
불이나 연기처럼 항상 일어나는 이펙트가 아닙니다
그래서 Self로 바꾸고 여기를 Once 이렇게
기본값 1초 동안 공장이 작동되게끔
이렇게 세팅을 바꿔 놓겠습니다
이제 여기에 있는 구체가 확장이 돼서 커질 수 있게끔
Particle Update에서 Mesh Size라고 하는 항목을 검색해 보시면
Scale Mesh Size가 있죠
이것을 이렇게 연결을 해주고요
Scale Factor 부분을 잠깐 열어서 보겠습니다
그러면 기본 메시 스케일이 Scale Factor를 이용해서
나중에 우리가 X축으로만 길게 한다든가
Y축으로만 길게 한다든가 이런 식으로 변형이 가능합니다
이것을 시간이 지남에 따라서 커질 수 있게
Vector From Curve를 이용해서 만들어주고요
폭발이니까 작은 점에서 시작했다가
서서히 커지겠죠
그래프의 형태를 뒤집어 줘야 되는데
이렇게 0일 때, 시작일 때 Scale 1에서
Lifetime이 100%일 때 Scale이 0이 되게끔 되어 있는데
이 Vector3로 이루어져 있다 보니까
템플릿을 사용해도 제대로 적용이 안 될 때가 있습니다
그럴 때는 이렇게 드래그 해서
X, Y, Z를 모두 다 선택한 다음에 시작할 때는 0
그리고 끝에 100%일 때
이때는 Scale 1이 되게끔 설정을 해 놓습니다
그리고 나서 다시 플레이를 해 보면
이런 식으로 크기가 바뀌죠
여기서 작업자마다 성향이 나눠지는데요
여기에서 직접적으로 8배가 커져라
내지는 10배가 커져라
이런 식으로 정해 줄 수 있는 방법도 있고
Curve 자체는 0에서 1 사이 값으로
이렇게 만들어 둔 다음에
Scale Curve라는 값을 이용해서
내가 몇 퍼센트를 키우고 싶은지
이를테면 10배를 키울 거면
이런 식으로 입력한다든가
혹은 여기에 들어가는 값을 Vector가 아닌
Vector from Plot을 이용해서
모두 다 X, Y, Z가 모두 다 일정한 값이 되게
이렇게 Value 값을 입력한다든지 하는 방법으로
값을 제외해 주게 됩니다
그래서 여러분들은 둘 중에 하나만 선택하셔도 됩니다
그래프를 통해서 모든 것들을 제외하시거나
혹은 그래프는 0에서 1 사이에 두고
여기 있는 Scale Curve라는 값을 이용해서
Curve에 들어가는 최대값 같은 것들을
별도로 지정을 하는 방법
이렇게 크기를 지정해 놓으시면 되는 거죠
이것을 저장을 하고
월드에 한번 배치해 놓겠습니다
현재 저는 10배가 커지라고 되어 있기 때문에
이 Mesh Renderer에 연결되어 있는 현재 스피어의 크기
여기에서 보시면
Approx Size가 100×100×100
100 유닛으로 되어 있죠
1m 짜리 스피어가 10배가 되니까
10m 까지 커지게 되는 겁니다
이것을 월드에다가 한번 배치해 놓도록 하겠습니다
그러면 프리뷰와는 다르게
커지는 모양새가 깔끔하죠
그래서 다시 한번 Reset을 눌러보시면
이렇게 부웅 하고 커지는
이렇게 효과를 하나 만들어 봤구요
Scale Mesh를 할 때 커지는 속도를
여러분들이 여기에 있는 Curve를 이용해서
이렇게 부드럽게 Auto로 세팅을 해 두시고
여기 있는 Curve를 이용해서
이런 식으로 속도의 변화도 만들어 줄 수가 있습니다
우선 저장하고 월드에서 다시 확인해 보겠습니다
Reset을 하면 이런 식으로
처음에는 빨리 커지다가
서서히 느려지게끔 지금은 세팅이 되어 있는 상태입니다
이런 식으로 이제 폭발이 일어나면
그 폭발되는 반경을 그려 준 건데요
여기에다가 Material을 하나 적절한 걸 넣어 줘야겠죠
우선 Material 창을 열어서
M_ExplosionFX라고 만들어 줍니다
그리고 나서 에디터 창을 열어 주고요
여기에서 Material을 반투명한 효과
서서히 사라질 수 있게
폭발이라고 하는 게 점점 사그라들게 되죠
그래서 서서히 사라질 수 있게 Translucent로
그리고 폭발 자체는 빛을 내니까
Unlit 상태로 이렇게 두겠습니다
여기에다가 간단하게 이 화염과 같은 느낌을 내기 위해서
쉐이딩 작업을 해 줄 건데요
우선 VectorParameter를 이용해서
하나는 FireColor라고 지정을 해 주고요
여기에 들어가는 Default 값은
Red는 8, Green 1, Blue 0.2로 이렇게 두겠습니다
그래서 이것을 Emissive Color에 연결해서 보면
미리 보기에서는 지금 보시는 것처럼 노란색으로 보이는데
실제로 연결을 해서 보면
주황빛에 가까운 형태를 띄고 있습니다
그리고 화염이니까 빨갛게 타는 부분과
까맣게 잿더미처럼 숯처럼 보이는 부분이 있겠죠
그러면 그것을 만들어 주기 위해서
숯처럼 보이는 부분은 굳이 색깔을 정할 필요는 없으니까
Constant3Vector를 이용해서
블랙 그대로 이렇게 둘 겁니다
물론 경우에 따라서는 우리가 나중에 이것을
Lerp를 이용해서 LinearInterpolate라는 기능을 이용해서
엮어 줄 건데 여기에다가 숫자를 직접 넣어주는 대신
여기에다 노드를 넣어주는 대신
0이라고 입력해도 됩니다
똑같은데 단지 저는 강의를 위해서
여러분들에게 어떠한 색깔이 섞이고 있는지를
설명해 드리기 위해서
이렇게 일부러 노드를 이용해서 연결을 할 겁니다
이것을 그대로 Emissive에 연결을 할 겁니다
그래서 Alpha 값이 0일 때는 FireColor가 나오고요
Alpha 값이 1일 때는 블랙 컬러가 나오게끔
이렇게 세팅을 했습니다
이것은 이제 그대로 두고요
이제 보는 방향에 따라서 이것을 섞어 줘야 될 텐데
우선은 가장 기본이 되는
Fresnel이라고 하는 노드를 이용해서
Lerp에다가 우선 연결을 해 보겠습니다
Lerp의 Alpha에다가 Fresnel을 연결을 하면
빛이 비추는 것 같기는 한데
이전과는 조금 달라졌죠
한번 FireColor만 연결했을 때랑
차이를 한번 느껴 보세요
FireColor를 연결하면 구체의 가장자리 부분이
지금처럼 단 색깔로 나오는 걸 확인하실 수가 있는데
Lerp를 이용해서 연결을 해 주게 되면
가장자리 약하게
그라데이션이 생긴 것을 확인하실 수가 있죠
이제는 이것을 조금 더
그럴듯한 모양으로 바꿔 줄 건데요
우선은 Noise 텍스처를 하나 가지고 올 겁니다
Texture Sample 노드를 이용해서
텍스처 항목에서 Noise 검색을 해 보시면
Perlin_Noise라고 이렇게 있습니다
이것을 ExponentIn 값에다가 한번 연결해 보겠습니다
이렇게 연결을 하면 마치 태양에 흑점이 생긴 것처럼
부분적으로는 까맣고 부분적으로는 밝은
이미지를 얻는 걸 확인하실 수가 있는데
여기에서 자세히 보시면 구체를 돌려보면
지금 보시는 것처럼 화면의 가운데 영역
구체의 가운데 영역이 밝고
어느 방향으로 보더라도
지금 보시는 것처럼 이렇게 가운데가 밝죠
그리고 가장자리는 불그스름한 걸 확인하실 수가 있죠
만약에 여기에 들어가는 Noise 값이
Multiply를 이용해서 기존에 있던 값보다
뭐 이를테면 3배 더 강하게
ExponentIn에 들어간다고 하면
지금 보시는 것처럼 검은색 영역이 조금 더 줄어들고요
Multiply로 0.5 정도로
기존의 절반만큼 들어가게 되면
검은색 영역이 조금 더 눈에
도드라지는 걸 확인하실 수가 있죠
0에 가까워질수록 검은색이 되는 겁니다
0 보다 커질수록 FireColor가
점점 눈에 보이게 되는 것이죠
나중에 이건 파라미터로 빼 줄 거고요
여기에서 단순히 멈춰 있으면
이 자체가 굉장히 정적으로 보이니까
Panner라고 하는 UV를 이동시키는 노드를 이용해서
Texture Sample의 UVs에 연결을 해 줄 겁니다
이렇게 연결을 해 줬고요
여기에서 보면 Speed 값이 모두 다
0, 0으로 되어 있는데
이걸 1로 해 보면 지금 보시는 것처럼
이렇게 마치 화염이 소용돌이 치듯이
빙글빙글 돌아가는 듯한 느낌으로
표현이 되는 것을 확인하실 수가 있죠
한마디로 Speed 값을 이용해서 우리는
이 구체에 화염이 일어나는 것 같은 느낌을
만들어 줄 수가 있는 겁니다
지금과 같은 상태에서 단순히 매끈한 구체가 아닌
조금 울퉁불퉁한, 마치 열기 때문에 일그러지는 듯한
느낌을 좀 만들어 줄 건데요
마찬가지로 이번에도
Texture Sample 노드를 이용해서
노멀 맵을 하나 가지고 올 겁니다
콘텐츠 브라우저에서 StarterContent- Textures 항목에서 보시면
이렇게 Detail_Rocky라고 하는
볼록한 형태의 노멀맵 텍스처를 확인하실 수가 있죠
이것을 Texture Sample에 연결을 해주고요
이 텍스처는 World Position Offset이라는 곳에 연결을 해줄 건데
그냥 연결을 하면 뭔가가 바뀌는 것 같긴 한데
그렇게 눈에 띄게 알기 쉽지는 않습니다
그래서 Multiply를 이용해서 값을 좀 뻥튀기 해줄 겁니다
이것을 만약에 10배를 강조를 하면
지금 보는 것처럼 외형적으로 일렁이듯이
이렇게 울룩불룩하게 바뀌었죠
이것을 앞서서 했던 노이즈의 패널을 연결해줬던
그것을 그대로 이렇게 UV에 연결을 해보면
지금 보시는 것처럼 이렇게
구체 외형이 지금은 1이라서 굉장히 빠른데
이거 빠르니까 0.1로 이렇게 바꿔 보겠습니다
울룩불룩한 형태가 화면처럼
마치 이글이글거리는 듯한 느낌으로 바뀌었죠
이 World Position Offset이라고 하는 것은
원래 구체가 갖고 있는 3D 표면에다가
문자 그대로 Offset, 이동을 시키는 거죠
근데 우리는 노멀맵을 이용해서 이동하니까
노멀맵은 기본적으로 길이가 1 유닛인 텍스처입니다
1 유닛은 1cm죠
그래서 실제로 우리가 1m짜리 구체에
1 유닛씩 울룩불룩하게 움직이라고 해봐야
별로 티도 안 납니다
Multiply를 이용해서 1 유닛을 5 유닛만큼 스케일을 키우거나
10 유닛만큼, 10cm겠죠
스케일을 키워서 적용을 하면
이 울룩불룩한 형태가 조금 더 표현이 잘 되는 것이죠
그래서 저는 일단 5 유닛 정도만
이렇게 활성화를 시켜 두겠습니다
이제 Fresnel 자체도 강도를 조정할 수 있게
Multiply를 이용해서
만약에 이 강도가 0.5가 된다면
붉은색 영역이 0에 가까워질수록
더 잘 보이게 될 거고요
1보다 커진다면, 이를테면 2가 된다면
지금 보시는 것처럼 탄
새카만 영역이 훨씬 더 면적이 늘어나겠죠
Fresnel이라고 하는 노드 자체가
카메라가 바라보는 곳은 0, 가장자리
카메라와 이렇게 카메라가 구체를 바라볼 때 마주보는 곳
여기는 0이고, 90도로 이렇게 꺾여 있는 곳
여기는 1이라는 값을 출력을 하는데
여기에다가 Multiply로 훨씬 더 큰 값을 넣어 주게 되면
이제 1에 해당하는 값들이 점점 여기까지 올라오는 겁니다
그래서 블랙 영역이 점점 더 많이 보이게 되는 거죠
그래서 우리는 지금까지 얘기한 이런 다양한 수치들을
파라미터로 분류를 할 겁니다
이것을 Material Instance라든가
이런 걸로 제어를 하는 게 아니라
나이아가라 시스템에서 제어를 해 줘야 되니까
Dynamic Parameter라는 걸 먼저 만들고요
우선 첫 번째 항목부터 차근차근 연결해 보겠습니다
우선 FresnelPower라고 이름을 짓고
기본 값은 1.2 정도로만 둬서
Fresnel과 Multiply된 노드에 연결해서
검은색 탄 영역을 조절할 수 있게끔 바꿔 줬구요
두 번째 항목은 WorldOffsetVal라고 이름을 짓고
우리가 World Offset에 연결한 것
그대로 이렇게 연결해 줄 겁니다
기본 값은 5로 두도록 하겠습니다
그러면 이렇게 울룩불룩 해지겠죠
Param3은 Noise라고만 이름 짓고요
Noise 앞에 Fresnel과
노이즈 텍스쳐 사이에 Multiply 있죠
여기에다가 연결을 해 줄 겁니다
여기에 연결되는 Noise 항목은
0.1을 입력하면 Noise가 훨씬 더 도드라지게
그리고 기본 값 1을 입력하면
조금 더 탄 영역이 좁아지게 되겠죠
그래서 FresnelPower와 약간
기능적으로는 중복되어 있습니다
단지 Noise의 정도를 결정하는 것이기 때문에
Fresnel 값하고 약간 차이가 있는 거죠
그래서 노이즈 텍스쳐가 바뀌면 이것도
그때그때 바뀐 노이즈 텍스쳐에 맞게끔
일정한 값을 전달해 주기 위해서
Noise에다가 별도로 연결을 해준 거고요
마지막으로 네 번째 파라미터
이거는 Speed로 이름 지어서
기본값 1로 이렇게 Speed 항목에다가 연결하겠습니다
만약에 0.5로 바꾼다면 더 천천히 움직이겠고
2로 입력한다면 훨씬 더 빠르게 움직이겠죠
그래서 픽셀이 좀 깨집니다
그래서 개인적으로 1 이상 쓰시는 것보단
0.1이나 0.5 정도로 이렇게 세팅을 해 놓고요
Apply를 하겠습니다
이것을 익스플로전에 여기 보면
Mesh Renderer에서 Enable Material Override를 활성화 하시고
+를 눌러서 머티리얼을 연결할 수 있게끔
그리고 여기에다가는 우리가 방금 만든
M_ExplosionFX를 선택해서
이렇게 화살표로 연결해 주겠습니다
이 상태에서 Particle Update 항목을 클릭을 해서
Dynamic Material Parameter로 이렇게 항목을 만들어 주고요
여러분들이 이렇게 Dynamic으로 만들어 두면
처음에는 빛이 이렇게 온전히 보이다가
시간이 지날수록 FresnelPower가
1.2 정도로 강해져야 되는데
여기에 Noise 값 자체가 없다 보니까
Noise 항목도 1로 두겠습니다
WorldOffset도 마찬가지로 5cm라고 입력해두면
지금은 애니메이션 되지 않죠
왜냐하면 Speed가 0이니까
Speed는 0.5 정도로 이렇게 회전이 되게끔
WorldOffset 값을 10으로 입력하면 훨씬 더 불룩하게
애니메이션 되는 것을 확인하실 수가 있습니다
저장을 하고 월드에서 확인해 보면
나이아가라 배치해 놓고 리셋 버튼을 누르시면
이런 식으로 우리가 의도한 대로
잘 작동하는 걸 확인하실 수가 있습니다
다시 Explosion Material로 돌아와서요
여기에서 우리가 파라미터로 만들어 놨던
이 컬러 값이라고 하는 것은
파라미터로 만드실 필요 없이
Particle Color 노드를 이용해서
Particle에서 직접적으로 수정을 해주는 것도 가능하고요
여기에 있는 Alpha 항목을 통해서
Opacity에 연결하거나 혹은 다른
우리가 미리 만들어 놨던 이런 다양한 효과들하고
같이 믹싱을 해서 표현하는 것도 가능합니다
그래서 저는 이것을 Add를 이용해서
Fresnel과 Dynamic 파라미터가
Multiply 된 결과를
이렇게 Add로 표현을 해 주고요
이것을 Opacity에다가 우선은 연결해 놓겠습니다
그럼 지금 보면 화면은 회색처럼 나오죠
근데 이것을 Apply를 하고요
나이아가라 화면으로 돌아가 보겠습니다
Particle Update 항목에서 + 눌러서
Scale Color라는 모듈을 하나 추가를 하고요
여기 있는 Scale RGB 값은
우리가 앞서서 파라미터에 정해놨던
8, 1, 0.2
레드 8, 그린 1, 블루 0.2로 하면 똑같이 나옵니다
근데 여기 들어가는 Alpha 값의 변화를 여러분들이 좀
주의 깊게 보실 필요가 있습니다
지금은 잘 보이는데, Add 상태니까 잘 보이다가
점점점점 값이 줄어서 이렇게 0보다 작아지게 되면
중간에 구멍이 난 것처럼 보이죠
그리고 더더더더 값이 커져서
-1까지 내려가면
거의 사라지는 것을 확인하실 수가 있습니다
그래서 원래 잘 보이던 상태에서
서서히 사라지게 만들어서 없어지게끔
자연스럽게 사라질 수 있게끔
이렇게 시간이 지남에 따라서
Alpha 값의 변화를 만들어 줄 건데요
우선 이 Scale Alpha의
Float From Curve를 이용해서 값을 만들어 주는데
시작하는 값은 1인데
여기 가로 축이 100%일 때 끝나는 값을
약 -2 정도로 이렇게 해 주시면
지금 보시는 것처럼 자연스럽게 사라질 수 있습니다
이게 너무 부드럽게 사라지는 것이 좀
마음에 안 드시는 경우에는
Material에서 Translucent가 아닌 Masked으로 바꿔서
여기 있는 Opacity Mask 항목에 연결을 해서
한번 적용해 보겠습니다
이렇게 사라지면 조금 더 거친 질감으로
사라지는 것을 눈으로 확인하실 수가 있죠
이렇게, 이게 이제 나이아가라 미리보기 창에서는
좀 떨림이 있는 것처럼 보이는데
실제 월드 상에서 배치해서 리셋을 해 보면
그렇게 떨림 없이 거친 질감 느낌 그대로
사라지는 걸 확인하실 수 있습니다
지금은 표면, 겉의 프론트 면만 그리기 때문에
이렇게 사라진다고 했을 때
우리 눈에 보이는 이 앞쪽 면
구체가 있다고 하면
이 구체 앞쪽 면만 이렇게 지금 보이는 상태입니다
지면에 닿아 있는 이 뒤쪽은 안 보이는 상태죠
그래서 부피감 있는 표현을 위해서
여러분들이 이렇게 투명하게 사라진다고 하더라도
Material 창에서 Two Sided 체크까지 해주시면
참고로 Two Sided 체크를 하실 거면 Translucent보다
Translucent로 하면 같은 면끼리
깊이 계산이 제대로 안 되는 것이 있기 때문에
Maskeded로 이렇게 두셔야
온전한 구체의 형상이 잘 렌더링 됩니다
그래서 Two Sided 체크까지 해 놓고
리셋을 해 보면 자연스럽게
이 낮은 상태에서도 한번 볼게요
이런 식으로 뒷면까지 같이 사라지는 효과도
확인하실 수 있습니다
폭발 연기 및 스파크 효과 연출
이제 이 Explosion에 마저 표현을 추가해 보겠습니다
이번에는 이 SingleLoopingParticle을
Ctrl+C, 그리고 Ctrl+V로 복사할 겁니다
기존에 있던 우리가 원래 쓰던 것은
MeshExplosion이라는 이름으로 바꿔 놓고요
복사가 된 SingleLoopingParticle 같은 경우에는
FireSmoke로 이름을 바꿔 놓을 겁니다
그리고 Mesh Renderer는 끄고요
Sprite Renderer를 사용할 겁니다
원래 있던 Sprite Renderer,
그리고 Initialize Particle에서도 마찬가지겠죠
Mesh는 사용 안 하기 때문에
Scale Mode를 리셋을 해서 Unset 상태
그리고 Sprite Attributes의 항목을 Uniform으로 바꿔 놓겠습니다
여기에는 불꽃이 생기면 자연스럽게 연기도 같이 생기잖아요
그래서 그 연기 효과를 한번 표현을 해 볼 건데
이 Sprite Renderer에 우선은 움직임을 먼저 만들어 줄 겁니다
잠시 헷갈리니까 이 Mesh Explosion은 잠깐 꺼두겠습니다
우리가 이 거대한 폭발이 이렇게 생겼을 때
이 주변의 연기 같은 것들을 이렇게
같이 퍼져나가게 만들려고 하는 거거든요
그래서 구체가 커짐과 동시에 연기들도 같이
이렇게 쭉쭉 뻗어 나갈 수 있게끔 만들려는 건데
우선은 일정한 범위를 갖고 있어야 되니까
Particle Spawn 항목에서
Shape Location 모듈을 추가해 줍니다
여기에서 마찬가지로 Add Velocity 항목을 추가해서
속도값을 추가해 주면 지금 보시는 것처럼
이렇게 임의의 파티클들이
이렇게 점점이 생겨나는 것이 보이시죠
지금은 현재 스피어 상태이기 때문에
이렇게 동그란 가상의 구체에다가
이 구체의 범위 안에서 랜덤하게 파티클이 생성이 돼서
쭉쭉 위로 올라가는 형태로 만들어지고 있는 건데요
우리는 이것의 형태를 약간 바꿔서
Shape Location 항목을 Torus로, 그리고
Radius를 약간 200 정도로 키워 놓겠습니다
그리고 Velocity 항목도 Linear가 아니라
From Point로 해서 한 160 정도 이렇게
그러면 구체였던 스폰되는 범위가 Torus라고
이제 도넛의 형태로 이렇게 바뀐 겁니다
그래서 이렇게 입체감을 가진 도넛의 형태로 바뀌어서
이 도넛의 범위 안에서 파티클들이 생성이 되는 것이죠
이 상태에서 파티클이 버스팅되는 개수를
약 50개 정도로 늘려 보겠습니다
그러면 멀리서 보면 이런 형태로 퍼져나가는 게 보이시죠
기본적으로 이 Torus라고 하는 항목은
여기에 도넛이 우리 눈에 보이지 않게 이렇게 있는 겁니다
이렇게 있는 상태에서
Add Velocity가 From Point라고 하는 것은
중심점을 기준으로 해서 이렇게 퍼져나가게 만들겠다
이런 뜻이 됩니다
그래서 여기에서 생성된 파티클이
이렇게 중심점의 반대 방향으로
이렇게 퍼져나갈 수 있게 만들 것이다
이러한 설정을 해 둔 상태입니다
이 상태에서 Explosion과 섞어서 보면
워낙에 지금은 속도가 높지 않아서
파티클 알갱이 입자들이 Explosion 스피어에 묻히죠
이거는 300이라든가 400 이런 식으로
임의로 이제 여러분들이 탑 뷰나
이렇게 뷰를 바꿔서 보시면서
그리고 월드에서도 마찬가지로
미리 이렇게 터트려 보시면서
속도감이 잘 맞는지 한번 확인해 보실 필요가 있습니다
만약에 버스팅의 개수가 부족하다면
이것을 150개 이런 식으로 많이 늘리셔도 됩니다
그럼 눈에 조금 더 잘 띄겠죠
이런 식으로 속도가 부족하다면
여러분들이 임의로 600이라든가
이렇게 속도값을 맞춰 주시면 되는데
이제 여기에서 하나 좀 아쉬운 표현이 있습니다
뭐냐면 이 파티클이 원래 있던
이 폭파 지점에서 이렇게 서서히 커질 때
그렇게 확장이 됨에 따라서
이 지면에 맞닿은 이 부위들하고
쉽게 얘기해서 불이 붙으면서
이렇게 연기가 나는 거거든요
근데 지금 이 FireSmoke에서 생기는 연기는
이 폭파 지점에서 약간 떨어진
Torus, 도넛의 형태로 이렇게 있다고 말씀드렸죠
여기서부터 그냥 일자로 쭉 오는 불입니다
이렇게 중간 중간 중간 지속적으로 발생하는 게 아니라
한 번 생성된 것이 쭉 하고 오는 이러한 형태이기 때문에
다소 연기라는 느낌보다는
나중에 이걸 텍스처를 바꿔줄 수도 있는데
연기라는 느낌보다는 그냥 불꽃이 퍼지듯이
그렇게만 보이는 단점이 좀 있습니다
그래서 이 느낌을 조금 완화시키기 위해서
이 FireSmoke를 Ctrl+C, Ctrl+V로 복사를 하고요
그럼 FireSmoke, FireSmoke001 이렇게 두 가지가 되어있죠
서브 이미터라는 개념을 이용해서
우리가 아까 전에 이 폭발 진원지에서부터
이렇게 쭉 흘러나오면서
그때 그때 그때 이렇게 커짐에 따라서
이 만나는 지면하고 발화하고, 만나는 지점하고 발화하고
이런 식으로 연출이 될 수 있게끔 할 건데
어쨌든 이 불꽃이, 한 번 생성된 불꽃이 쭉 지나가죠
이때 특정한 위치를 지나갈 때마다
이렇게 일정한 간격으로 신호를 줘서
여기에서 연기를 피워
두 번째 지점에서 또 연기를 피워
세 번째에서 연기 피워
이런 식으로 불꽃이 지나가는 자리마다
연기를 피울 수 있게끔 하는 기능으로 한번 바꿔볼 겁니다
그리고 보통 이런 기능을 우리는 서브 이미터 내지는
서브 파티클이라고 얘기를 하죠
그래서 원래 있던 파티클의 정보를 이용해서
두 번째로 서브로 생기는 두 번째 파티클들이
어떻게 생성될 건지를 컨트롤 하는 건데요
우선 이걸 위해서는 기준이 되는 파티클의
여기 첫 번째 이 Emitter Properties 항목 보면
Requires Persistent IDs라는 항목 있죠
이거를 먼저 체크를 해 줘야 됩니다
나는 여기에서 있는
FireSmoke에 있는 정보를 이용해서
서브 파티클들을 생성할 거야
그러니 등록을 해줘라는 뜻이 되는 거고
마찬가지로 Particle Update에서 + 버튼을 눌러서
Generate, 세 가지 이벤트가 있는데
우리는 위치의 변화마다 파티클을 터뜨릴 거니까
Generate Location Event 모듈을 추가해 줍니다
그리고 나면 복사가 된 서브 파티클에는
스테이지에 + 버튼을 눌러서
Event Handler라고 항목을
새로 하나 추가해 주고요
Event Handler Properties에서는
내가 어떠한 이미터의 정보를 받아 올 건지
소스 부분을 먼저 연결을 해줍니다
우리가 이미 퍼시던트 아이디를 등록을 해놨기 때문에
FireSmoke에 Location Event가 바로 검색이 되죠
그래서 나는 FireSmoke에
Location Event에서 신호를 받아다가
현재 스폰이 되고 있는 이 항목을 두 번째
실행되는 모드를 스폰이 된 파티클에 맞춰서
나는 이를테면 1개씩 폭파시킬 거야
내지는 10개씩 폭파시킬 거야
이런 것들을 결정할 수가 있게 됩니다
위에서 보면은 훨씬 더 많은 수의
파티클이 생성되는 걸 보실 수가 있죠
그리고 이러한 이벤트를 나는
Receive Location Event를 통해서 받을 거야
라고 Event Handler에 + 버튼을 눌러서
Receive 항목까지 추가해 주시면
이런 식으로 파티클이 훨씬 더 웅장하게
더 많이 생성되는 걸 보실 수가 있죠
월드 상에서도 한번 보겠습니다
리셋을 시켜서 이런 식으로
조금만 더 떨어져서 볼까요, 리셋
이런 식으로 이제 만들 수가 있는데
이제 여기서 어떤 형태로 퍼져 나갈지
어떠한 속도감을 가지고 퍼져 나갈지는
여러분들이 정하시면 되고
Velocity 항목도 마찬가지입니다
이것을 기존에 있던 Velocity
여기서 얘기하는 기존이라고 하면
FireSmoke를 얘기하는 거죠
이벤트를 뿌리는 FireSmoke의 Velocity 값을
그대로 이어받아서 퍼질 건지 말 건지
이런 것들을 설정해 줄 수가 있죠
여기에다가는 단순히 불꽃이 아니라
연기의 이미지를 입힐 것이기 때문에
Sprite Renderer에다가는
Material에 Smoke라고 연결을 해 보겠습니다
여기서 보면 총 두 가지의 Smoke가 있죠
그 중에서도 첫 번째에 있는 Smoke_SubUV
이것을 클릭을 해 주고요
색깔이 좀 이상해졌죠?
이건 나중에 Scale Color를 통해서 바꿔 줄 겁니다
여기에 있는 Smoke_SubUV 같은 경우에는
Material을 더블 클릭해서 보면
여러 장의 이미지가 이렇게 합쳐진
세로로 8장, 가로로 8장의 이미지
총 64장의 이미지가 연결되어 있는
이러한 형태의 연기 이펙트고요
연기 이펙트용 시퀀스 텍스처라고
보통 얘기를 하죠
그래서 이것을 사용하기 위해서는 Sprite Renderer
지금 제가 하고 있는 건 FireSmoke001입니다
여기에 있는 SubUV에
총 몇 장의 이미지로 이루어져 있는지
이 텍스처의 구성을 이렇게 Sub Image Size를 통해서
8장, 8장 입력을 해 주고요
Update에서는 이 이미지가
첫 번째 프레임에 멈춰 있는 게 아니라
64번째 이미지까지 애니메이션 될 수 있게끔
Sub UV Animation 모듈을 추가해서
이 항목 중에 Setup 부분에서
Sprite Renderer 이것을 우리가 가지고 있는
Sprite Renderer로 연결을 해 줍니다
이러한 상태에서, 이건 약간 위로 올리도록 하겠습니다
Sub UV Animation은 컬러 값을 좀 바꿔 줘야 됩니다
지금은 약간 이 Scale RGB 값을 끄고 보면
이런 식으로 값이, 원래는 흰색인데
우리가 지금 빨간색도 넣었고
기존에 복사가 됐던 이 Alpha 값이
-1까지 내려가는 이 문제도 있었죠
-2까지 내렸던
그래서 이건 다시 0으로 좀 놔두고요
컬러 값을 좀 바꿔 줄 건데
우선 Scale RGB라고 하는 값을
X, Y, Z, 레드, 그린, 블루로 되어 있던 걸
아래쪽 화살표를 눌러서
Vector From Curve로 만들어 주고요
여러분들이 값을 바꾸기 편하게
Scale Curve 부분을 8, 1, 0.2 이런 식으로
색상을 추가해 줄 겁니다
이렇게, 그리고 나서 이 그래프 상태에서
100% 상태일 때, 이 부분을 -1로 바꿔서
시간이 지날수록 어두워질 수 있게 바꿔 줄 거고요
이전에 붉었던 색깔이 이렇게
어두워지는 걸 확인하실 수가 있죠
그리고 Alpha는 자연스럽게 이렇게
아래로 꺼지도록 놔둘 겁니다
지금은 입자들이 너무 자잘해서
연기의 이미지가 크게 크게 눈에 안 들어오는데
Update 항목에다가 Scale Sprite Size 항목을 추가해서
크기가 작았을 때도 0은 아니게
0.3 정도 되게끔 해 두고요
Uniform Curve Scale을 10배 정도만 키워볼까요
이런 식으로
엄청나게 지금 많은 양의 파티클들이 뿌려지고 있습니다
지금 실제로 뿌려지는 파티클의 양을 보면
대략 최대 4만 개 정도까지
올라가는 걸 확인하실 수가 있는데
이걸 여러분들이 조절하시고 싶다면
이 Spawn Burst를 일단 꺼 보겠습니다
이걸 끄면 이런 식으로
그리고 Event Handler에서 스폰 되는 양도 마찬가지
최대 프레임당 100개 정도까지만 나는 허용할 거야라고
이런 식으로 하면 개수를 임의로 조정할 수가 있게 되죠
이거 Spawn Number는 1로 해 두셔도 됩니다
이렇게 1로
그래서 실제로 이것을 Explosion과 섞어서
월드 상에서 보게 되면
리셋을 눌러서 이런 식으로 퍼져나가는 게 보이시죠
이전에 단순히 FireSmoke랑
느낌 차이를 좀 비교해서 보여드리면
FireSmoke에서 이렇게 자잘한 작은 이펙트가
불꽃 번지듯이, 이렇게 살짝살짝 튀기듯이
나오는 걸 보실 수가 있는데
서브 이미터를 활용하면 그 연기의 범위나 속도가 다르죠
물론 기존에 있던 속도를 그대로 내려받아서
추가되는 형태이기 때문에
속도값이 이전보다는 조금 줄어야 됩니다
200이라든가 이런 식으로 약간 줄여야
상대적으로 이 타이밍을 맞추기가 쉬워지는 거죠
그리고 FireSmoke001은 Initialize Particle 항목에서
Lifetime을 0.5 정도로 조금 줄여 놓겠습니다
그러면 이런 식으로 이펙트가 터지면서
자연스럽게 연기가 퍼져나가게끔 만들 수도 있고요
여러분들이 만약에 Velocity가
너무 바닥을 기어가듯이 퍼지는 게
좀 문제라고 생각하신다면
Velocity 모드를 In Cone으로 바꿔서
나중에 월드 상에서 한번 보겠습니다
바닥을 통해서 퍼지던 이 파티클 효과
이것이 나중에 In Cone으로
조금만 값을 좀 키워 보겠습니다
일부러 이런 식으로 값을 좀 다르게 줄 수 있죠
이 In Cone의 Axis가 X축으로 1로 되어 있어서 그런데
이걸 Z축으로 1로 바꾼다면 위로 퍼지게 됩니다
일부러 제가 이거는 값의 차이가 좀 크게 보이라고
좀 과장된 값을 넣은 거고요
1800까지 넣으실 필요는 없고
약하게 해서 서서히 위로 좀 빠질 수 있게
표현을 해주셔도 좋습니다
그래서 자연스럽게 연기가 위로 올라갈 수 있게끔
속도 값을 살짝만 줘서 퍼질 수 있게 해놓고요
앵글 값이나 이런 거 다 마찬가지입니다
그래서 자연스럽게 일정한 폭파 범위에서부터 퍼지게끔
그리고 뒤에 오는 이 불꽃의 컬러의 변화도 보면
이렇게 시간이 지남에 따라서
레드에서 시작했던 것이 블랙으로 서서히
레드였던 것이 블랙으로, 바깥으로 갈수록
계속해서 레드였던 것이 블랙으로 바뀌는 것이
순차적으로 일어나게끔 되죠
그래서 아무래도 조금 단조로운 효과나 이런 것들을
서브 이미터를 통해서 완화시킬 수가 있습니다
여러분들이 이런 식으로 서브 이미터를 활용하시는 것도
파티클을 풍성하게 하는 데 굉장히 좋은 방법입니다
여기에서 FireSmoke 같은 경우에
굳이 그 동글동글한 붉은색 입자를 보일 필요가 없기 때문에
Scale Color에서 얘는 Alpha 값을
완전히 커브를 쓰지 않고
이걸 리셋을 해가지고 Scale Alpha 값을
Float From Curve가 아니라
Scale Alpha 값으로 0을 해둔다고 하더라도
서브로 생기는 FireSmoke001 같은 경우에는
영향을 끼치지 않습니다
FireSmoke가 눈에 보이지 않게
이렇게 점점점점 신호를 주고 가는 거죠
그럼 이 신호에 맞춰서 실제로 작동하는 건
여기 있는 FireSmoke001이
서브 이미터로서 작동을 해서
계속해서 연기를 흩뿌리면서 다니는 겁니다
지금도 개수는 대략 이런 식으로 1500개 정도까지
이렇게 좀 많이 나오고 있는 편입니다
파티클을 만들면서 이런 구체 크기가 커지는 타이밍
그리고 사라지는 타이밍과 파티클 입자들이
이런 식으로 생성되는 타이밍을 맞추기가 어려운데
이러한 Event 기능을 이용해서
상대적으로 정확하게 맞출 수도 있고요
빈도가 너무 많다고 생각이 드신다면
이벤트를 보내는 주기를 15번 정도로 줄인다거나
1번 정도로 줄이면 점점점 해가지고 땅땅땅 이렇게 되죠
이건 좀 부자연스럽죠
그냥 줄 수 있다는 걸 보여드리기 위한 거니까
그래서 이것을 저는 딱 20 정도로만 두겠습니다
그래서 다다다다다다닥 이런 식으로
경계에 있는 것들을 태우면서 가는 듯한 느낌이 나게끔
이렇게 표현을 해봤고요
여기에서 여러분들이 하나 더
해보시면 좋은 표현 중에 하나가
우클릭해서 Add Emitter로
OmnidirectionalBurst라고 하는 템플릿을
하나 선택해서 추가해 보겠습니다
이거는 우클릭해서 isolated 모드로 보면
이런 식으로 뻥 하고 터지는 이런 효과입니다
이거는 Velocity 값을
600~1200 정도로 좀 크게 주고요
그래야지 멀리 퍼질 테니까
이건 나중에 실제 Emitter랑 섞어 보면서 바꿀 겁니다
그리고 Origin Offset은
OmnidirectionalBurst의 기본 값으로 이렇게 잡혀 있는 걸
그냥 0으로 두겠습니다
굳이 마이너스로, 아래로 내릴 필요는 없으니까
그리고 나서 Scale Color 값도
Scale RGB 항목을 8, 1, 0.2로 펑하고 맞춰서
작은 스파크가 튀는 느낌으로 만들어 주려고 하는 거고요
여기에다가 Collision이라는 기능을
하나 더 추가할 겁니다
Collision
Collision이라는 기능이 있으면
이 각각의 파티클이 모든 파티클은 아니지만
일부 충돌할 수 있는 성질을 지니게 돼서요
이걸 잠깐 리셋을 월드 상에서 뿌려 보면
바닥에 그대로 이렇게 튕겨오르는 것들이 보이시죠
이런 식으로 약간 사실적인 느낌을 더해 줄 수가 있습니다
그래서 지금까지 만들어 놓은
isolated 우클릭해서 이건 해제를 해 주고요
Velocity 값이 조금 더 커야겠네요
1,200에 1,600 정도는 돼야 될 것 같습니다
리셋을 해서 터뜨려 보면
이런 식으로 폭파 효과와 함께
거대한 화염 같은 느낌으로
스파크와 화염과 연기와 이런 것들이
이런 식으로 마무리될 수 있게끔 되었고요
여기에서 여러분들이 임의로 Lifetime이라든가
이런 것들을 더 조절을 해서
자연스럽게 수정해 보시면 좋겠죠
이번 시간에는 꼭 이 서브 이미터의 개념에 대해서
기억해 두시면 좋을 것 같습니다
이번 시간에 학습해 본 폭발 이펙트는
속도를 제어하는 다양한 방법들에 대해서 알아봤고요
또한 셰이더의 움직임을 이용해서
메시의 움직임을 제어해 봤습니다
메시 파티클을 활용한 효과로 충격파와 연기와 같은
우리가 흔히 부피로 인식되기 어려운 개념들을
시각적으로 어떻게 표현하는지도 활용해 봤습니다
그럼 이번 시간 학습한 내용을 정리하면서
마무리하겠습니다
감사합니다
폭발 반경 세팅 및 폭발 효과 연출 나이아가라 생성 나이아가라 애셋 생성(SingleLoopingParticle 템플릿) 후 SpriteRenderer 비활성화
MeshRenderer 추가 > StaticMesh Index[0] : Sphere로 변경 Emitter State
Life Cycle Mode : Self, Loop Behavior : Once, Loop Duration Mode : Fixed, Loop Duration : 1.0
Initialize Particle LSprite Size Mode : Unset, Lifetime : 리셋 (1.0), Mesh Scale Mode : Uniform, 1.0
Scale Mesh Size Particle update에 추가, Scale Factor : Vector From Curve
Vector Curve (x : 0, y : 0), (x : 1, y : 1) Scale Curve : Vector from Float, Value 10
M_ExplosionFX 생성 Blend Mode: Translucent, Shading Model: Unlit Lerp 생성 후 Lerp A:
VectorParameter (FireColor, 8, 1, 0.2), Lerp B: Constant3Vector (0, 0, 0), Lerp Alpha: Fresnel,
Lerp 출력: Emissive Texture Sample: T_Perlin_Noise_M Panner 노드 생성: Speed X: 1, Y: 1 / Texture Sample
노드 UV에 연결 Multiply 생성 후 A: Texture Sample, B: 1, Fresnel: ExponentIn에 Multiply 결과 연결 Texture Sample:
T_Detail_Rocky_N Panner 노드 Texture Sample 노드 UV에 연결 Multiply 노드 생성 후 A: Texture Sample, B: 10, 출력:
World Position Offset Multiply 노드 생성 후 A: Fresnel, B: 2, 출력: Lerp Alpha
Dynamic Parameter 생성 후: R(FresnelPower, 1.2), G(WorldOffsetVal, 5), B(Noise, 2), A(Speed, 0.5)
나이아가라 연동 Mesh Renderer의 Enable Material Override 활성화
Override Materials 추가 > Index [0] Explicit Mat에 M_ExplosionFX 추가
Dynamic Material Parameter 모듈 추가 후
R(FresnelPower, 1.2), G(WorldOffsetVal, 10), B(Noise, 2), A(Speed, 0.5)
파티클 컬러 연동 Blend Mode: Masked Particle Color 노드 생성 후 Lerp A에 연결
Particle Color A는 Fresnel Multiply 결과와 Add 후 Opacity Mask에 연결 Scale Color 모듈 추가 (R: 8, G: 1, B: 0.2)
Scale Alpha: Float from Curve (0 : 1, 1 : -2)
폭발 연기 및 스파크 효과 연출 FireSmoke SingleLoopingParticle 복사 후 FireSmoke로 이름 변경
Spawn Burst: 50, Sprite Size Mode: Uniform/10, Mesh Attributes: Unset
ShapeLocation 추가 후 Shape Primitive: Torus, Large Radius: 200, Handle Radius: 25
Add Velocity 추가 후 Velocity Mode: From Point, Velocity Speed: 600
Emitter Properties: Requires Persistent ID 활성화
Generate Location Event 모듈 추가
Sub FireSmoke FireSmoke 복사 Stage에 Event Handler 추가 후 Spawn Burst 비활성화
Event Handler Properties의 Spawn Number: 10 Receive Location Event 추가
SpriteRenderer Material: M_Smoke_subUV, SubUV: (8, 8) Sub UV Animation 추가
SpriteRenderer 항목에 SpriteRenderer 추가
ScaleColor의 Scale RGB: (0 : 1) / (1 : -1), Scale Curve: (8, 1, 0.2), Scale Alpha: (0 : 1) / (1 : 0)
Scale Sprite Size Mode: Uniform, Uniform Curve Sprite Scale: (0 : 0.3) / (1 : 1),
Uniform Curve Scale: 10 Spark (OmnidirectionBurst)
Add Velocity의 Velocity Speed: Min 1200 / Max 1600, Origin Offset: (0, 0, 0)
Collision 모듈 추가