1 00:00:04.310 --> 00:00:09.002 실감 공통편 스켈레탈 이펙트 2 00:00:09.002 --> 00:00:11.573 GCC 사관학교 3 00:00:27.205 --> 00:00:30.194 안녕하세요 박현상입니다 4 00:00:30.194 --> 00:00:32.094 스켈레탈 메시를 활용한 5 00:00:32.094 --> 00:00:36.040 파티클 표현 기법에 대해서 실습하겠습니다 6 00:00:36.040 --> 00:00:37.990 스켈레탈 메시라고 하면 7 00:00:37.990 --> 00:00:42.000 걷거나 뛰는 등 애니메이션 된다고 하죠 8 00:00:42.000 --> 00:00:44.300 스켈레탈이라는 단어 그대로 9 00:00:44.300 --> 00:00:47.360 뼈대를 가진 오브젝트를 이야기합니다 10 00:00:47.360 --> 00:00:50.610 이러한 스켈레탈 메시는 콘텐츠 안에서 11 00:00:50.610 --> 00:00:53.080 항상 동적으로 움직이게 된 12 00:00:53.080 --> 00:00:58.200 그리고 복잡한 움직임을 만들어 줄 수가 있는데요 13 00:00:58.200 --> 00:01:01.400 또한 이 스켈레탈 메시를 활용하기 위해서는 14 00:01:01.400 --> 00:01:04.320 애니메이션 블루프린트와 같은 기능들에서 15 00:01:04.320 --> 00:01:08.440 파티클을 별도로 제어할 수 있습니다 16 00:01:08.440 --> 00:01:11.240 특히 애니메이션 되는 타이밍을 17 00:01:11.240 --> 00:01:14.919 정확하게 일치시키는 것은 힘들 것입니다 18 00:01:14.919 --> 00:01:17.219 타이밍을 맞추는 요령과 함께 19 00:01:17.219 --> 00:01:20.419 속도감을 더해 줄 수 있는 효과들 20 00:01:20.419 --> 00:01:22.675 이런 것들에 대해서 학습해 보겠습니다 21 00:01:23.361 --> 00:01:27.163 스켈레탈 메시를 활용한 파티클 기법 22 00:01:28.671 --> 00:01:33.040 이번 시간에는 본격적인 예제 제작에 앞서서 23 00:01:33.040 --> 00:01:36.540 같이 사용해야 할 스켈레탈 메시에 대해서 24 00:01:36.540 --> 00:01:41.279 먼저 파악해 보고 진행해 보도록 하겠습니다 25 00:01:41.279 --> 00:01:45.279 우선 여러분들 화면에서 보이는 26 00:01:45.279 --> 00:01:48.879 이 스켈레탈 메시를 띄우고 싶으시다면 27 00:01:48.879 --> 00:01:51.479 Starter Content에 Third Person이 28 00:01:51.479 --> 00:01:54.160 들어가 있다는 전제예요 29 00:01:54.160 --> 00:01:56.460 Content 폴더 Characters로 가시면 30 00:01:56.460 --> 00:01:58.680 Mannequins라는 폴더가 있습니다 31 00:01:58.680 --> 00:02:01.630 여기에 Meshes 폴더를 보게 되시면 32 00:02:01.630 --> 00:02:06.279 이렇게 총 여러 개의 메시 타입들을 보실 수가 있는데 33 00:02:06.279 --> 00:02:09.997 여기에서 SK_Mannequin이라고 되어 있는 이것을 34 00:02:09.997 --> 00:02:12.240 더블 클릭해서 열어주시면 35 00:02:12.240 --> 00:02:14.740 지금 제가 보는 것과 같은 화면을 36 00:02:14.740 --> 00:02:16.960 보실 수 있게 될 겁니다 37 00:02:16.960 --> 00:02:19.660 우측 상단에 보면 이런 식으로 38 00:02:19.660 --> 00:02:24.960 아이콘들이 나열되어 있는 것들이 보이시죠 39 00:02:24.960 --> 00:02:28.360 가장 왼쪽에 있는 스켈레톤 항목 이고요 40 00:02:28.360 --> 00:02:33.360 이것을 보통 줄여서 SK라고 얘기를 합니다 41 00:02:33.360 --> 00:02:37.010 그리고 두 번째로 있는 메시 항목 42 00:02:37.010 --> 00:02:41.502 이것은 우리가 스켈레탈 메시라고, SKM이라고 43 00:02:41.502 --> 00:02:48.880 보통 파일에, 애셋의 이름 앞에다가 접두어로 붙여 두죠 44 00:02:48.880 --> 00:02:52.780 언리얼 같은 경우에는 이 뼈대를 기본으로 해서 45 00:02:52.780 --> 00:02:55.600 뼈대와 붙어있는 메시들 46 00:02:55.600 --> 00:02:59.500 그리고 그 메시들과 뼈대들이 연계돼서 47 00:02:59.500 --> 00:03:01.880 애니메이션 되는 것들 48 00:03:01.880 --> 00:03:07.199 이 애니메이션들을 연결한 애니메이션 블루프린트라고 하는 49 00:03:07.199 --> 00:03:10.080 이러한 구조로 되어 있습니다 50 00:03:10.080 --> 00:03:12.800 정리해 보면 스켈레탈이 있고요 51 00:03:12.800 --> 00:03:18.039 여기에 다수의 스켈레탈 메시들이 붙고 52 00:03:18.039 --> 00:03:20.789 이 스켈레탈과 연계되어 있는 53 00:03:20.789 --> 00:03:24.559 애니메이션 시퀀스라고 보통 얘기를 합니다 54 00:03:24.559 --> 00:03:27.359 이 애니메이션 시퀀스들은 달린다든가 55 00:03:27.359 --> 00:03:30.980 점프를 한다든가 걸어간다든가 하는 것들이죠 56 00:03:30.980 --> 00:03:33.000 이런 것들이 쪼로록 붙어있고 57 00:03:33.000 --> 00:03:35.800 이러한 애니메이션 시퀀스들이 58 00:03:35.800 --> 00:03:39.279 나중에 애님 블루프린트라는 것을 통해서 59 00:03:39.279 --> 00:03:42.929 어떠한 상황에 달릴 거며 점프할 것인지 60 00:03:42.929 --> 00:03:45.759 이런 것들을 제어하게 되고요 61 00:03:45.759 --> 00:03:49.880 이것이 나중에는 블루프린트 캐릭터라는 것을 통해서 62 00:03:49.880 --> 00:03:52.520 스켈레탈 메시와 연결되게 됩니다 63 00:03:52.520 --> 00:03:54.970 실제로 Third Person 같은 경우에는 64 00:03:54.970 --> 00:03:57.866 Third Person 폴더의 Blueprints 항목에 65 00:03:57.866 --> 00:04:00.279 BP_ThirdPersonCharacter가 있죠 66 00:04:00.279 --> 00:04:05.119 이것을 보게 되면 스켈레탈 메시와 애니메이션 블루프린트가 67 00:04:05.119 --> 00:04:07.769 이렇게 각각 연결되어 있는 것을 68 00:04:07.769 --> 00:04:09.759 여러분들이 확인하실 수가 있습니다 69 00:04:09.759 --> 00:04:14.520 우선은 간단하게 별도의 블루프린트라든가 70 00:04:14.520 --> 00:04:17.470 어떤 제어 없이 사용할 수 있는 71 00:04:17.470 --> 00:04:20.000 나이아가라와 연계되는 것들을 위해서 72 00:04:20.000 --> 00:04:23.760 애니메이션 시퀀스 볼 수 있는 창에서 73 00:04:23.760 --> 00:04:27.519 MF_Run_Fwd를 선택을 해줍니다 74 00:04:27.519 --> 00:04:30.769 여기에서 우리가 나이아가라를 바로 75 00:04:30.769 --> 00:04:33.079 불러들일 수 있는 기능이 있는데요 76 00:04:33.079 --> 00:04:36.119 여기 보면 Notifies 항목이 있는데 77 00:04:36.119 --> 00:04:38.440 여기에 Track을 추가해 보겠습니다 78 00:04:38.440 --> 00:04:41.040 여기 보면 레프트 라이트 79 00:04:41.040 --> 00:04:44.399 뭔가 이런 마커 같은 게 찍혀 있는 부분 보이시죠 80 00:04:44.399 --> 00:04:48.849 Track 누르고 Add Notify Track이라고 81 00:04:48.849 --> 00:04:51.320 하나 더 추가해 주겠습니다 82 00:04:51.320 --> 00:04:54.520 여기에 Track 이름을 넘버가 아니라 83 00:04:54.520 --> 00:04:56.359 step이라고 지어줄게요 84 00:04:56.359 --> 00:04:58.920 이게 지금 달리는 속도가 너무 빨라서 85 00:04:58.920 --> 00:05:02.000 정확한 위치를 찍기가 조금 힘드니까 86 00:05:02.000 --> 00:05:07.440 속도를 0.1로 줄여 가지고 재생하면서도 87 00:05:07.440 --> 00:05:14.000 나중에 발이 땅에 닿는 타이밍을 알기 쉽게 88 00:05:14.000 --> 00:05:16.760 이렇게 속도를 좀 늦춰 놨습니다 89 00:05:16.760 --> 00:05:22.679 여러분들이 만약에 걸어가는 스텝에 맞춰 가지고 90 00:05:22.679 --> 00:05:28.000 땅에 닿는 이 딱 부위에 정확하게 이펙트를 탁 하고 91 00:05:28.000 --> 00:05:31.799 먼지 같은 것들을 뿌린다든가 하고 싶다면 92 00:05:31.799 --> 00:05:34.920 언제 이 프레임 하나하나를 다 세 가지고 93 00:05:34.920 --> 00:05:38.000 블루프린트 같은 걸로 명령을 줄 수 있을까요 94 00:05:38.000 --> 00:05:40.000 물론 불가능하진 않습니다 95 00:05:40.000 --> 00:05:44.200 미리 재생되는 거 애니메이터한테 전달받아서 96 00:05:44.200 --> 00:05:47.880 이를테면 7프레임에서 오른발 내딛고 97 00:05:47.880 --> 00:05:51.040 17프레임에서 왼발 내딛고 98 00:05:51.040 --> 00:05:54.279 다시 대략 26프레임에서 내딛는다고 99 00:05:54.279 --> 00:05:58.239 이렇게 발을 땅에 내딛는 프레임 정보들을 100 00:05:58.239 --> 00:06:01.640 애니메이터들이 제작을 해주면서 우리에게 전달해 주면 101 00:06:01.640 --> 00:06:06.200 이 프레임에 맞춰 가지고 이펙트를 탕탕탕탕 터뜨려 달라고 102 00:06:06.200 --> 00:06:08.679 코드로 작성하는 것도 가능할 겁니다 103 00:06:08.679 --> 00:06:13.040 근데 그렇게 되면 두 사람이 좀 번거로운 작업을 해야겠죠 104 00:06:13.040 --> 00:06:16.600 애니메이터라는 사람도 이 프레임에 대한 정보들을 105 00:06:16.600 --> 00:06:20.399 다 하나하나 기록해 놨다가 전달을 해 줘야 되고 106 00:06:20.399 --> 00:06:23.679 프로그래머 입장에서도 그런 정보들을 바탕으로 107 00:06:23.679 --> 00:06:27.760 전부 다 이걸 어딘가에 데이터로 쭉쭉쭉쭉 저장해 놨다가 108 00:06:27.760 --> 00:06:29.640 불러와서 써야 되고 109 00:06:29.640 --> 00:06:31.519 이런 것들이 굉장히 번거롭겠죠 110 00:06:31.519 --> 00:06:34.947 그리고 만약에 수정이 일어나서 프레임에 변화가 111 00:06:34.947 --> 00:06:38.799 앞뒤로 약간씩의 간격 변화 같은 것들이 생겼다면 112 00:06:38.799 --> 00:06:42.239 매번 바뀐 프레임에 대한 정보를 또다시 알려 줘야 되고 113 00:06:42.239 --> 00:06:46.600 수정해 줘야 되고 업데이트해 줘야 되는 불편함이 있겠죠 114 00:06:46.600 --> 00:06:50.600 그러다 보니까 이 애니메이션 트랙에다가 115 00:06:50.600 --> 00:06:53.959 아예 외부에다가 그런 걸 저장하지 말고 116 00:06:53.959 --> 00:06:56.909 바로 나이아가라를 내가 117 00:06:56.909 --> 00:07:00.079 캐릭터가 발을 딱 내딛는 이 타이밍 118 00:07:00.079 --> 00:07:05.320 이 타이밍에 Add Notify에서 나이아가라를 실행시켜라 119 00:07:05.320 --> 00:07:09.559 라고 하는 이러한 기능을 언리얼에서 만들어 놨습니다 120 00:07:09.559 --> 00:07:11.239 오른발 쪽이고요 121 00:07:11.239 --> 00:07:13.399 당연히 왼발도 이렇게 가서 122 00:07:13.399 --> 00:07:16.149 이 인디케이터라고 하는 123 00:07:16.149 --> 00:07:20.640 현재 위치를 알려주는 마커가 위치한 곳에서 124 00:07:20.640 --> 00:07:23.040 오른쪽 클릭 - Add Notify - 125 00:07:23.040 --> 00:07:25.279 Play Niagara Particle Effect 126 00:07:25.279 --> 00:07:27.640 이거를 이렇게 추가를 해 줍니다 127 00:07:27.640 --> 00:07:31.240 그러면 해당하는 프레임에 이렇게 128 00:07:31.240 --> 00:07:34.279 내가 원하는 이펙트를 터트려라 129 00:07:34.279 --> 00:07:37.239 라고 지정해 줄 수가 있겠죠 130 00:07:37.239 --> 00:07:39.789 한번 여기에 들어갈 만한 이펙트를 131 00:07:39.789 --> 00:07:41.959 짧게 만들어 보겠습니다 132 00:07:41.959 --> 00:07:45.839 우선 SkeletalFX라는 폴더를 만들어 놨고요 133 00:07:45.839 --> 00:07:50.640 오른쪽 클릭해서 Niagara System이라고 추가를 합니다 134 00:07:50.640 --> 00:07:52.840 그리고 Fountain 135 00:07:52.840 --> 00:07:57.839 분수 같은 형태의 기본 이미터를 하나 설정해 주겠습니다 136 00:07:57.839 --> 00:08:01.720 여기에 사는 디테일보다는 어떻게 작동이 된다 137 00:08:01.720 --> 00:08:04.239 이 정도에만 좀 포커스를 맞추겠습니다 138 00:08:04.239 --> 00:08:06.339 그래서 만들어진 이펙트의 이름을 139 00:08:06.339 --> 00:08:12.399 FX_FootStep이라고 정해주고 열어 놓겠습니다 140 00:08:12.399 --> 00:08:15.760 여기에서 Shape 항목은 끄도록 하고요 141 00:08:15.760 --> 00:08:18.040 Gravity도 끄도록 하겠습니다 142 00:08:18.040 --> 00:08:23.160 Initialize Particle에서 1.4초는 한 발자국 내딛는데 143 00:08:23.160 --> 00:08:26.320 1. 몇 초 동안 이펙트가 계속 나오고 있으면 144 00:08:26.320 --> 00:08:28.420 우리가 저벅 저벅 저벅 이런 식으로 145 00:08:28.420 --> 00:08:31.760 1초에도 여러 발자국 걷는데 146 00:08:31.760 --> 00:08:34.310 이미 몇 발자국 지나가서까지 계속 147 00:08:34.310 --> 00:08:36.080 이펙트가 발생하면 이상하겠죠 148 00:08:36.080 --> 00:08:39.380 그러니까 이거는 0.2초에서 3초 정도로 149 00:08:39.380 --> 00:08:42.799 아주 짧은 순간만 작동하게끔 해 놓고요 150 00:08:42.799 --> 00:08:47.840 그리고 루프도 한 번만 실행하게끔 이렇게 바꿔 놨습니다 151 00:08:47.840 --> 00:08:51.090 실행 시간도 당연히 0.2초 정도로 152 00:08:51.090 --> 00:08:54.400 아주 짧게 폭 폭 폭 하고 튀게끔 153 00:08:54.400 --> 00:08:56.080 이펙트는 굉장히 심플하죠 154 00:08:56.080 --> 00:08:58.530 이것을 NiagaraEffect에서 155 00:08:58.530 --> 00:09:02.039 FX_FootStep이라고 검색을 한 다음에 156 00:09:02.039 --> 00:09:03.719 지정만 해주시면 됩니다 157 00:09:03.719 --> 00:09:05.919 FX_FootStep 158 00:09:05.919 --> 00:09:07.719 재생을 해보면 이런 식으로 159 00:09:07.719 --> 00:09:12.719 이펙트가 잠깐 동안 이렇게 땅에 닿을 때마다 작동을 하죠 160 00:09:12.719 --> 00:09:15.400 근데 지금 보시면 작동을 할 때 161 00:09:15.400 --> 00:09:19.039 여기는 타이밍이 맞는데 약간 프레임이 지나가면서 162 00:09:19.039 --> 00:09:21.919 발이 지나갔는데도 허공에 이렇게 있죠 163 00:09:21.919 --> 00:09:25.239 이 발 끝에 맞춰 가지고 작동이 되게끔 164 00:09:25.239 --> 00:09:29.189 스켈레탈에서 이 발끝에 해당하는 Bone을 165 00:09:29.189 --> 00:09:31.400 선택하는 걸 보여드리겠습니다 166 00:09:31.400 --> 00:09:35.400 Character의 Bones - All Hierarchy를 체크하시면 167 00:09:35.400 --> 00:09:39.239 현재 캐릭터가 갖고 있는 모든 뼈대 정보가 168 00:09:39.239 --> 00:09:41.520 이렇게 시각적으로 표현이 되는데 169 00:09:41.520 --> 00:09:48.799 이 발끝에 ball_l 혹은 ball_r이라고 나와 있죠 170 00:09:48.799 --> 00:09:53.300 이것을 그대로 오른발을 내딛을 때는 171 00:09:53.300 --> 00:09:57.359 이 Socket Name에 ball_r 지정을 해주고요 172 00:09:57.359 --> 00:10:02.520 왼쪽에는 FootStep에서 ball_l로 이렇게 서로 다르게 173 00:10:02.520 --> 00:10:07.880 첫번째 거에는 ball_r, 엔터 눌러 주시고 174 00:10:07.880 --> 00:10:11.760 두번째 거에서는 ball_l로 되게끔 175 00:10:11.760 --> 00:10:13.359 이렇게 체크를 해 주시면 176 00:10:13.359 --> 00:10:18.880 이제는 이펙트가 발을 따라서 움직이는 게 보이시죠 177 00:10:18.880 --> 00:10:22.719 그러면 나머지 오른쪽 발 여기에 맞춰서 178 00:10:22.719 --> 00:10:25.000 R이라고 되어있는 위치에 맞춰서 179 00:10:25.000 --> 00:10:29.200 여기 있는 FootStep 노티피를 카피하셔서 180 00:10:29.200 --> 00:10:31.760 페이스트 해주시면 되고 181 00:10:31.760 --> 00:10:34.280 L에 맞춰서, 레프트 값이죠 182 00:10:34.280 --> 00:10:38.679 카피하셔서 L를 오른쪽 클릭해서 페이스트 183 00:10:38.679 --> 00:10:41.760 마찬가지로 페이스트 해주시면 됩니다 184 00:10:41.760 --> 00:10:45.760 만약에 이렇게 정확하게 위치를 맞추는 게 어려우시면 185 00:10:45.760 --> 00:10:50.799 조금 이렇게 스크롤바를 이용해서 확대 축소를 해서 186 00:10:50.799 --> 00:10:54.559 이거를 드래그해서 맞추시는 방법도 있습니다 187 00:10:54.559 --> 00:10:55.559 이런 식으로요 188 00:10:55.559 --> 00:10:59.239 이렇게 해서 저장을 해 놓고 실제로 플레이를 해보면 189 00:10:59.239 --> 00:11:01.840 걸어갈 때마다 옆으로 지금 나오고 있죠 190 00:11:01.840 --> 00:11:02.614 이런 식으로 191 00:11:02.614 --> 00:11:06.479 이것은 여기 있는 FX_FootStep에서 192 00:11:06.479 --> 00:11:09.512 Velocity의 콘의 모양은 Z축으로 193 00:11:09.512 --> 00:11:13.862 FX는 이 Z축을 기준으로 해서 올라가게끔 194 00:11:13.862 --> 00:11:15.359 세팅이 되어 있습니다 195 00:11:15.359 --> 00:11:17.909 반면에 여기 있는 볼 196 00:11:17.909 --> 00:11:21.359 우리가 선택했던 이 ball의 방향을 보면 197 00:11:21.359 --> 00:11:23.919 여러분들이 방향을 정확하게 파악하실 거면 198 00:11:23.919 --> 00:11:28.599 여기 있는 월드와 로컬 좌표계가 표현하는 방식을 199 00:11:28.599 --> 00:11:31.359 로컬 좌표계 상태로 두신 다음에 200 00:11:31.359 --> 00:11:32.599 큐브 모양이죠 201 00:11:32.599 --> 00:11:34.479 지구본 모양은 월드 좌표 202 00:11:34.479 --> 00:11:36.799 로컬 좌표는 큐브 모양 203 00:11:36.799 --> 00:11:39.799 큐브 모양을 보시면 Z축이 지금 보시는 것처럼 204 00:11:39.799 --> 00:11:41.559 오른쪽으로 향해 있죠 205 00:11:41.559 --> 00:11:43.359 이 이유 때문입니다 206 00:11:43.359 --> 00:11:47.080 그래서 이렇게 Z축이 잡혀 있다 보니까 207 00:11:47.080 --> 00:11:50.039 위로 뻗어나게끔 우리가 세팅이 됐던 게 208 00:11:50.039 --> 00:11:53.960 Z축 방향으로 뻗어나게 돼 있는 파티클이 209 00:11:53.960 --> 00:11:57.119 그대로 이렇게 뻗어 나온 것이죠 210 00:11:57.119 --> 00:11:58.719 이게 왼쪽은 이렇고요 211 00:11:58.719 --> 00:12:00.969 오른쪽을 보시면 마찬가지로 212 00:12:00.969 --> 00:12:04.280 Z축이 바깥을 향해 있는 건 똑같은데 213 00:12:04.280 --> 00:12:05.719 약간 다른 점이라면 214 00:12:05.719 --> 00:12:09.599 이 두 발이 가까이 있게끔 위치해서 보여드리겠습니다 215 00:12:09.599 --> 00:12:11.200 Y축의 방향을 잘 보세요 216 00:12:11.200 --> 00:12:15.200 왼쪽의 ball 같은 경우에는 Y축이 아래로 향해 있고요 217 00:12:15.200 --> 00:12:18.919 ball_r 같은 경우에는 Y축이 위를 향해 있습니다 218 00:12:18.919 --> 00:12:21.440 그래서 만약 이걸 Z축으로 맞춰라 219 00:12:21.440 --> 00:12:22.799 내지는 Y축으로 맞춰라 220 00:12:22.799 --> 00:12:25.239 이렇게 어느 한 축으로 맞추라고 221 00:12:25.239 --> 00:12:28.359 명령을 내리기 되게 애매한 상황입니다 222 00:12:28.359 --> 00:12:31.559 이런 경우에는 이렇게 옆으로 빠져나가는 223 00:12:31.559 --> 00:12:34.119 이런 것들을 여기에 있는 224 00:12:34.119 --> 00:12:37.119 이 Rotation Offset 값을 이용해서 225 00:12:37.119 --> 00:12:38.640 조절할 수가 있는데요 226 00:12:38.640 --> 00:12:41.840 여기에서 보면 ball_r 같은 경우에 227 00:12:41.840 --> 00:12:45.200 Z축이 Y축처럼 올라오려면 228 00:12:45.200 --> 00:12:48.000 X축을 이렇게 90도로 돌리면 229 00:12:48.000 --> 00:12:51.440 Y축은 이쪽으로 가고 Z축이 이렇게 올라오겠죠 230 00:12:51.440 --> 00:12:56.790 그러니까 X축에다가 플러스 Rotation Offset을 231 00:12:56.790 --> 00:12:59.520 90으로 입력을 해 주시고요 232 00:12:59.520 --> 00:13:04.280 그러면 발이 닿는 순간에 위로 올라오게끔 바뀝니다 233 00:13:04.280 --> 00:13:07.359 여기 있는 왼발도 마찬가지인데요 234 00:13:07.359 --> 00:13:11.640 이번에 왼발 같은 경우에는 아래를 향해 있기 때문에 235 00:13:11.640 --> 00:13:15.359 왼발은 여기 있는 Rotation Offset 값을 236 00:13:15.359 --> 00:13:19.359 90이 아닌 -90으로 맞춰 주셔야 237 00:13:19.359 --> 00:13:24.080 오른발도 위를 향해서 파티클이 발생을 하고 238 00:13:24.080 --> 00:13:28.239 왼발도 위를 향해서 발등 방향을 향해서 239 00:13:28.239 --> 00:13:30.280 파티클이 발생을 하게 됩니다 240 00:13:30.280 --> 00:13:32.159 만약에 이 뒤에 있는 것들 241 00:13:32.159 --> 00:13:35.640 지금 제가 일부러 예시 삼아서 안 바꿔놨는데 242 00:13:35.640 --> 00:13:39.400 이 뒤에 아직 수정이 안 된 애들하고 비교를 해보시면 243 00:13:39.400 --> 00:13:41.039 바깥쪽으로 흘러나가죠 244 00:13:41.039 --> 00:13:43.039 오른발 수정하기 전 245 00:13:43.039 --> 00:13:45.239 마찬가지로 바깥쪽으로 나가죠 246 00:13:45.239 --> 00:13:50.159 그래서 여기 있는 것들을 모두 다 라이트는 90도 247 00:13:50.159 --> 00:13:54.400 레프트는 -90도로 바꿔주시게 되면 248 00:13:54.400 --> 00:13:59.039 이제 우리가 의도한 대로 발걸음을 내딛을 때마다 249 00:13:59.039 --> 00:14:02.840 먼지들이 하늘을 향해서 솟구치는 형태로 250 00:14:02.840 --> 00:14:05.200 이펙트가 발현이 될 겁니다 251 00:14:05.200 --> 00:14:07.599 한번 뒤쫓아 가면서 252 00:14:07.599 --> 00:14:10.479 서드 퍼슨 상태에서 확인해 보시죠 253 00:14:10.479 --> 00:14:11.679 걸어가 보겠습니다 254 00:14:11.679 --> 00:14:13.929 이제는 위를 향해서 255 00:14:13.929 --> 00:14:17.520 이렇게 탁탁 튀어 오르듯이 되고 있죠 256 00:14:17.520 --> 00:14:21.599 이렇게 잠깐 잠깐 튀는 이펙트들 말고요 257 00:14:21.599 --> 00:14:26.640 이제 플레이어가 달려가는 방향에 맞춰서 258 00:14:26.640 --> 00:14:28.840 궤적을 남기듯이 따라오는 259 00:14:28.840 --> 00:14:31.320 이러한 이펙트들도 마찬가지 260 00:14:31.320 --> 00:14:36.000 여기 있는 노티피를 이용해서 제어를 할 수가 있습니다 261 00:14:36.000 --> 00:14:40.960 보통 이러한 이펙트를 트레일 이펙트라고 얘기를 하고요 262 00:14:40.960 --> 00:14:45.599 나이아가라 기준으로는 리본 이펙트라고도 얘기를 합니다 263 00:14:45.599 --> 00:14:48.799 리본체조 선수가 띠를 들고 리본을 들고 264 00:14:48.799 --> 00:14:51.400 이렇게 아름답게 연기하면 265 00:14:51.400 --> 00:14:53.159 그 손짓에 맞춰서 266 00:14:53.159 --> 00:14:56.400 자연스럽게 띠가 모양을 이루면서 나오는 267 00:14:56.400 --> 00:14:58.400 그러한 효과 같은 것들인데 268 00:14:58.400 --> 00:15:03.000 우선 나이아가라에서 이 Dynamic Beam이라고 하는 269 00:15:03.000 --> 00:15:05.280 템플릿을 하나 만들도록 하겠습니다 270 00:15:05.280 --> 00:15:09.320 그리고 FX_Ribbon이라고 이름 지어 주고요 271 00:15:09.320 --> 00:15:11.599 여기에서 이제 사용하지 않을 272 00:15:11.599 --> 00:15:14.119 몇 가지 모듈들은 꺼 주도록 하겠습니다 273 00:15:14.119 --> 00:15:17.280 우선 Update Beam 꺼 주고요 274 00:15:17.280 --> 00:15:18.599 원래는 이렇게 빔 이라고 해서 275 00:15:18.599 --> 00:15:21.359 이렇게 일정한 직선 모양이 나오는데 276 00:15:21.359 --> 00:15:23.000 우리가 할 것은 이게 아니고 277 00:15:23.000 --> 00:15:26.159 움직임에 맞춰서 자연스러운 곡선이 278 00:15:26.159 --> 00:15:28.359 나오는 걸 만들려고 하는 거니까 279 00:15:28.359 --> 00:15:32.239 Spawn Beam, Beam Width, Update Beam 280 00:15:32.239 --> 00:15:36.359 그리고 Emitter Update에 있는 Beam Emitter Setup도 281 00:15:36.359 --> 00:15:40.559 마찬가지로 빔과 관련된 총 4가지 모듈들은 282 00:15:40.559 --> 00:15:45.239 여러분들이 꺼 주시고 혹은 삭제 하셔도 상관없습니다 283 00:15:45.239 --> 00:15:48.200 Spawn Burst도 꺼 주도록 하겠습니다 284 00:15:48.200 --> 00:15:50.039 이렇게 총 5개가 되겠네요 285 00:15:50.039 --> 00:15:52.689 그리고 나서 업데이트 항목에서 286 00:15:52.689 --> 00:15:55.440 Spawn Rate를 추가를 해줍니다 287 00:15:55.440 --> 00:16:00.000 모듈은 이렇게만 세팅이 되면 작동을 하고요 288 00:16:00.000 --> 00:16:03.880 Spawn Rate 값은 우선은 10으로 두겠습니다 289 00:16:03.880 --> 00:16:07.000 Spawn Rate 값을 추가해서 10으로 290 00:16:07.000 --> 00:16:11.239 파티클의 사이즈를 Ribbon Attributes라는 항목에서 291 00:16:11.239 --> 00:16:14.719 Ribbon Width 항목을 Direct Set으로 292 00:16:14.719 --> 00:16:16.599 일단 5로 두겠습니다 293 00:16:16.599 --> 00:16:19.399 그럼 현재는 아무런 이펙트가 294 00:16:19.399 --> 00:16:21.599 발생을 하고 있지 않기 때문에 295 00:16:21.599 --> 00:16:24.000 어쩔 수 없이 안 쓸 거지만 296 00:16:24.000 --> 00:16:26.200 이 리본의 간단한 예시를 위해서 297 00:16:26.200 --> 00:16:29.239 Add Velocity로 Linear가 아니라 298 00:16:29.239 --> 00:16:32.479 From Point 이용해서 이렇게 보여드리면 299 00:16:32.479 --> 00:16:34.979 이런 식으로 파티클이 생성돼서 300 00:16:34.979 --> 00:16:37.159 이동되는 경로에 맞춰 가지고 301 00:16:37.159 --> 00:16:40.280 이런 식의 띠 형태로 모양이 남게 됩니다 302 00:16:40.280 --> 00:16:43.159 여기에서 Lifetime을 줄이면 303 00:16:43.159 --> 00:16:46.719 당연히 띠에 남는 궤적이 짧게 되겠죠 304 00:16:46.719 --> 00:16:49.369 Spawn Rate가 3이 되면 305 00:16:49.369 --> 00:16:54.230 띠가 굉장히 간격이 각지게 되면서 306 00:16:54.230 --> 00:16:59.320 원래는 점 점 점 이렇게 스프라이트로 생성돼야 될 게 307 00:16:59.320 --> 00:17:01.760 첫 번째, 두 번째, 세 번째 생겼다고 하면 308 00:17:01.760 --> 00:17:06.439 이런 식으로 띠의 형태로 이렇게 궤적이 만들어지는 겁니다 309 00:17:06.439 --> 00:17:10.439 그래서 Spawn Rate 값이 커지면 커질수록 310 00:17:10.439 --> 00:17:13.199 훨씬 부드러운 형태의 이런 식으로 311 00:17:13.199 --> 00:17:16.959 다이내믹한 방향들을 만들어줄 수 있게 되는 겁니다 312 00:17:16.959 --> 00:17:19.319 이렇게 되면 준비가 끝났고요 313 00:17:19.319 --> 00:17:21.419 다시 Run_Fwd로 가서 314 00:17:21.419 --> 00:17:25.040 달릴 때만 속도감을 좀 느낄 수 있도록 315 00:17:25.040 --> 00:17:27.640 Notify Track을 하나 추가해서 316 00:17:27.640 --> 00:17:30.199 Ribbon이라고 입력을 하고요 317 00:17:30.199 --> 00:17:32.280 달리기 시작하면서부터 나와야 되니까 318 00:17:32.280 --> 00:17:37.400 0 프레임에서부터 Particle Effect 노티피를 추가해 줍니다 319 00:17:37.400 --> 00:17:42.479 그리고 여기에는 FX_Ribbon이 추가가 되겠죠 320 00:17:42.479 --> 00:17:46.000 만약에 지금 재생이 된다면 321 00:17:46.000 --> 00:17:49.599 이 스켈레탈이 가지고 있는 가장 기본 루트가 되는 322 00:17:49.599 --> 00:17:54.079 이 루트를 향해서 여기에 이펙트가 발생이 될 건데 323 00:17:54.079 --> 00:17:58.599 그러면 이상하니까 Socket Name에다가 head라고 324 00:17:58.599 --> 00:18:04.119 머리에다가 마치 띠처럼 남을 수 있게 만들어 주고요 325 00:18:04.119 --> 00:18:07.119 시작하기 전에 이 미리 보기를 위해서 켜놨던 326 00:18:07.119 --> 00:18:10.560 Velocity는 꺼 주도록 하겠습니다 327 00:18:10.560 --> 00:18:14.360 그래서 이 Ribbon은 머리를 쫓아가게끔 328 00:18:14.360 --> 00:18:16.400 세팅이 되어 있는 상태고요 329 00:18:16.400 --> 00:18:19.400 저장한 다음에 플레이를 해 보면 330 00:18:19.400 --> 00:18:23.479 평소에는 발생하지 않다가 달리면 331 00:18:23.479 --> 00:18:25.520 이게 느릴 때는 걸어간다고 해서 332 00:18:25.520 --> 00:18:30.439 걷는 애니메이션이 되느라고 잘 작동을 안 하는 거고요 333 00:18:30.439 --> 00:18:33.560 뛰어갈 때는 이렇게 머리를 통해서 334 00:18:33.560 --> 00:18:36.239 이런 식으로 궤적이 남죠 335 00:18:36.239 --> 00:18:40.479 저는 일부러 여러분들께 좀 더 잘 보여드리기 위해서 336 00:18:40.479 --> 00:18:45.160 1초로 줄여놨던 Ribbon을 다시 3초로 늘리긴 했는데 337 00:18:45.160 --> 00:18:48.520 너무 길죠, 멈춰 있을 때도 작동을 하니까 338 00:18:48.520 --> 00:18:50.839 그래서 이걸 줄여놓고, 1초로 다시 339 00:18:50.839 --> 00:18:54.489 이런 식으로 짧게 궤적이 남는 것을 340 00:18:54.489 --> 00:18:56.239 확인하실 수가 있습니다 341 00:18:56.239 --> 00:18:59.389 노티피를 이용해서 풋스텝을 만들거나 342 00:18:59.389 --> 00:19:00.719 트레일을 만들거나 하는 건 343 00:19:00.719 --> 00:19:02.959 단순히 달리는 거 말고도 344 00:19:02.959 --> 00:19:08.040 검을 이렇게 내려 칠 때 검의 궤적에 맞춰서 345 00:19:08.040 --> 00:19:11.359 이러한 트레일 이펙트를 남기는 것도 동일하고요 346 00:19:11.359 --> 00:19:15.560 어떤 타격을 입힐 때 특정한 타격 지점에서 347 00:19:15.560 --> 00:19:19.812 꽝 하고 내려치는 타격 지점에서 이펙트를 터뜨릴 때 348 00:19:19.812 --> 00:19:22.126 풋스텝의 원리를 이용하는 것도 동일합니다 349 00:19:22.513 --> 00:19:26.077 스켈레탈 메시를 이용한 3D 표면 데이터 활용 350 00:19:26.680 --> 00:19:31.880 지금까지는 스켈레탈 메시의 본의 정보를 이용해서 351 00:19:31.880 --> 00:19:36.280 파티클을 스폰하고 애니메이션 되는 시간 타이밍에 맞춰서 352 00:19:36.280 --> 00:19:39.079 재생하는 방법들을 알아봤는데 353 00:19:39.079 --> 00:19:42.160 이번에는 스켈레탈 메시라고 하는 354 00:19:42.160 --> 00:19:45.313 3D 표면의 데이터를 355 00:19:45.313 --> 00:19:47.400 활용하는 방법들에 대해서 다뤄볼 겁니다 356 00:19:47.400 --> 00:19:50.300 우선은 나이아가라 이펙트를 먼저 357 00:19:50.300 --> 00:19:52.160 하나 생성을 해 주겠습니다 358 00:19:52.160 --> 00:19:53.910 가장 기본이 될 수 있는 359 00:19:53.910 --> 00:19:58.398 Fountain 템플릿을 선택해서 생성해 주겠습니다 360 00:19:58.398 --> 00:20:01.031 FX_SKM 361 00:20:01.031 --> 00:20:04.080 이렇게 SKM이라고만 이름을 지어줄게요 362 00:20:04.080 --> 00:20:07.230 우리가 일반적으로 파티클을 363 00:20:07.230 --> 00:20:10.560 스폰할 장소 혹은 범위에 대해서 364 00:20:10.560 --> 00:20:13.320 이런 Shape Location 같은 것들을 이용하거나 365 00:20:13.320 --> 00:20:15.520 혹은 Static Mesh와 같이 366 00:20:15.520 --> 00:20:17.920 특정한 3D 오브젝트를 대상으로 367 00:20:17.920 --> 00:20:19.870 파티클이 어느 위치에 생성되는지 368 00:20:19.870 --> 00:20:22.240 이런 것들을 실습을 해봤었는데 369 00:20:22.240 --> 00:20:25.790 마찬가지로 스켈레탈 메시도 이러한 370 00:20:25.790 --> 00:20:28.520 파티클을 스폰하기 위한 정보들 371 00:20:28.520 --> 00:20:32.000 위치 정보를 제공하는 데 사용할 수가 있습니다 372 00:20:32.000 --> 00:20:35.000 그래서 Skeletal Mesh Location이라고 373 00:20:35.000 --> 00:20:36.599 이렇게 지정을 해놓고요 374 00:20:36.599 --> 00:20:40.199 여기에서 프리뷰가 되는 기본 메시는 375 00:20:40.199 --> 00:20:42.040 SKM_Quinn을 사용하도록 하겠습니다 376 00:20:42.040 --> 00:20:45.340 지금은 이 이펙트 자체가 377 00:20:45.340 --> 00:20:48.080 속도값에 따라서 움직이고 있으니까 378 00:20:48.080 --> 00:20:50.759 이런 속도와 관련되어 있는 Velocity라든가 379 00:20:50.759 --> 00:20:52.119 Gravity Force라든가 380 00:20:52.119 --> 00:20:55.680 Drag 같은 것들은 꺼준 상태에서 확인해 보겠습니다 381 00:20:55.680 --> 00:20:59.280 보시면 이런식으로 파티클의 입자가 382 00:20:59.280 --> 00:21:02.560 마치 뼈대의 형상을 지는 것처럼 383 00:21:02.560 --> 00:21:03.680 이렇게 보이고 있죠 384 00:21:03.680 --> 00:21:07.000 여기에서 Skeletal Mesh Location의 385 00:21:07.000 --> 00:21:09.559 Mesh Sampling Type 이라는 것이 있습니다 386 00:21:09.559 --> 00:21:14.440 Mesh Sampling Type을 Skeleton(Bone)이라고 기본 값이 되어 있는데 387 00:21:14.440 --> 00:21:17.294 이것을 Surface의 Triangle이나 388 00:21:17.294 --> 00:21:21.199 버텍스와 같이 메시 데이터를 활용하게 되면 389 00:21:21.199 --> 00:21:24.480 지금 보시는 것처럼 약간의 형태가 바뀌었죠 390 00:21:24.480 --> 00:21:26.930 이 Initialize의 사이즈를 6이 아니라 391 00:21:26.930 --> 00:21:30.160 조금 작게 1이나 2 정도로 작게 바꿔서 392 00:21:30.160 --> 00:21:35.400 이 Spawn Rate의 값을 한 1500 정도로 높여 보면 393 00:21:35.400 --> 00:21:38.879 우리가 프리뷰 메시에서 선택한 이런 형식의 394 00:21:38.879 --> 00:21:42.400 메시의 대략적인 실루엣 같은 것들이 드러나게 됩니다 395 00:21:42.400 --> 00:21:48.480 그리고 여기에서 Skeletal Mesh의 CPU Access라는 기능이 396 00:21:48.480 --> 00:21:51.440 비활성화 되어있기 때문에 Fix Now를 눌러서 397 00:21:51.440 --> 00:21:53.360 경고창을 없애 주도록 하고요 398 00:21:53.360 --> 00:21:56.800 이 Skeletal Mesh Location을 그대로 Ctrl+C 399 00:21:56.800 --> 00:21:59.650 그리고 업데이트 부분에도 400 00:21:59.650 --> 00:22:02.400 Ctrl+V로 붙여 주도록 하겠습니다 401 00:22:02.400 --> 00:22:05.200 이렇게 똑같은 Skeletal Mesh 항목이 402 00:22:05.200 --> 00:22:07.959 업데이트에도 추가된 것을 보실 수가 있는데요 403 00:22:07.959 --> 00:22:10.880 이제 이것을 어떻게 활용하는지 404 00:22:10.880 --> 00:22:13.919 한번 블루프린트를 만들어서 405 00:22:13.919 --> 00:22:17.479 기본적인 이 작동 조건에 대해서 알아볼 겁니다 406 00:22:17.479 --> 00:22:19.479 우선은 오른쪽 클릭 하셔가지고 407 00:22:19.479 --> 00:22:22.399 블루프린트 클래스에서 일반적으로 Skeletal Mesh가 408 00:22:22.399 --> 00:22:25.679 가장 많이 사용되는 것은 캐릭터 클래스라고 하는 건데 409 00:22:25.679 --> 00:22:27.320 캐릭터 클래스를 선택한 상태에서 410 00:22:27.320 --> 00:22:32.919 BP_SKMfx라고 이름 지어 주고요 411 00:22:32.919 --> 00:22:34.600 더블 클릭해서 열겠습니다 412 00:22:34.600 --> 00:22:38.119 원래 캐릭터를 만들 땐 이러한 캡슐에다가 413 00:22:38.119 --> 00:22:39.679 여기 보면은 메시 항목 있죠 414 00:22:39.679 --> 00:22:42.080 스켈레톤 모양의 아이콘을 가진 415 00:22:42.080 --> 00:22:45.279 여기에 우리가 사용할 Skeletal Mesh 416 00:22:45.279 --> 00:22:50.440 이를테면 퀸이면 이런식으로 퀸 애셋을 집어 넣고 417 00:22:50.440 --> 00:22:51.960 위치를 좀 맞춰 줄게요 418 00:22:51.960 --> 00:22:53.240 회전을 시켜 가지고요 419 00:22:53.240 --> 00:22:54.600 이렇게 세팅해 놓고 420 00:22:54.600 --> 00:22:59.039 일반적으로는 이제 애니메이션 블루프린트 라고 하는 것을 421 00:22:59.039 --> 00:23:00.559 이렇게 지정해 줘서 422 00:23:00.559 --> 00:23:02.959 우리가 블루프린트에서 423 00:23:02.959 --> 00:23:05.880 키보드 입력을 받는다든가 하는 식으로 424 00:23:05.880 --> 00:23:08.119 사용자 정보를 전달받아서 425 00:23:08.119 --> 00:23:10.069 여기에서 구현한 기능을 426 00:23:10.069 --> 00:23:12.479 애니메이션 블루프린트에 전해 주게끔 427 00:23:12.479 --> 00:23:14.279 일반적으로 설계를 합니다 428 00:23:14.279 --> 00:23:17.059 다만 지금은 블루프린트 교육이 아닌 429 00:23:17.059 --> 00:23:21.520 FX 교육이니까 실제로 애니메이션이 되고 있다고 430 00:23:21.520 --> 00:23:23.199 전제를 하기 위해서 431 00:23:23.199 --> 00:23:25.800 이 애니메이션 모드를 블루프린트가 아닌 432 00:23:25.800 --> 00:23:29.800 애니메이션 애셋이라고 이렇게 지정을 해 놓고요 433 00:23:29.800 --> 00:23:31.800 Anim to Play에다가 434 00:23:31.800 --> 00:23:35.520 MF_Run이라고 검색하시면 435 00:23:35.520 --> 00:23:38.919 MF_Run_Fwd라고 하는 항목이 검색이 되죠 436 00:23:38.919 --> 00:23:41.919 이 애니메이션 시퀀스를 등록을 해 줍니다 437 00:23:41.919 --> 00:23:44.519 그렇게 되면 우리가 지정한 438 00:23:44.519 --> 00:23:47.240 애니메이션 시퀀스가 재생이 되고 있죠 439 00:23:47.240 --> 00:23:49.960 여기에다가 나이아가라를 붙여 볼 건데요 440 00:23:49.960 --> 00:23:53.453 +Add 버튼을 눌러서 Niagara 441 00:23:53.453 --> 00:23:55.479 이렇게 Particle System을 442 00:23:55.479 --> 00:23:58.240 Mesh에 자식으로 추가를 해 줍니다 443 00:23:58.240 --> 00:24:04.179 그리고 나서 FX_SKM 지정을 해 주면요 444 00:24:04.179 --> 00:24:05.399 지금 보시는 것처럼 445 00:24:05.399 --> 00:24:09.199 이렇게 메시 표면에 파티클이 생성이 되고요 446 00:24:09.199 --> 00:24:12.240 그리고 캐릭터가 애니메이션 동작을 하는 것에 맞춰서 447 00:24:12.240 --> 00:24:15.290 파티클이 같이 따라서 움직이는 것을 448 00:24:15.290 --> 00:24:17.079 확인하실 수가 있습니다 449 00:24:17.079 --> 00:24:20.480 여기서 만약에 메시에 보이는 기능을 450 00:24:20.480 --> 00:24:22.160 쭉 아래쪽으로 내려가서 451 00:24:22.160 --> 00:24:24.959 렌더링에서 Visible 기능을 꺼보면 452 00:24:24.959 --> 00:24:28.428 지금 보시는 것처럼 이렇게 메시가 그대로 453 00:24:28.428 --> 00:24:30.359 애니메이션 되는 것에 맞춰서 454 00:24:30.359 --> 00:24:31.760 그대로 움직이고 있죠 455 00:24:31.760 --> 00:24:34.480 다시 한번 나이아가라 화면으로 이동해 보겠습니다 456 00:24:34.480 --> 00:24:36.200 이 나이아가라 화면에서 457 00:24:36.239 --> 00:24:38.440 Particle Update에 있는 458 00:24:38.440 --> 00:24:41.720 Skeletal Mesh Location을 비활성화 해 주게 되면 459 00:24:41.720 --> 00:24:43.239 지금 보시는 것처럼 460 00:24:43.239 --> 00:24:45.920 미리보기 창에서는 크게 차이가 없는데요 461 00:24:45.920 --> 00:24:48.320 만약에 블루프린트 화면으로 가보면 462 00:24:48.320 --> 00:24:52.079 이런 식으로 메시의 동작에 맞춰 가지고 463 00:24:52.079 --> 00:24:54.519 잠깐 잠깐 잠깐 생성이 되기 때문에 464 00:24:54.519 --> 00:24:59.040 그 형태가 정확하게 모션을 쫓아오지 못하고 있어서 465 00:24:59.040 --> 00:25:02.000 물론 이제 이 파티클 자체에 466 00:25:02.000 --> 00:25:04.119 Lifetime을 0.1과 같이 467 00:25:04.119 --> 00:25:06.920 아주 짧은 시간을 만들게 되면 468 00:25:06.920 --> 00:25:08.399 어느 정도 보이긴 하죠 469 00:25:08.399 --> 00:25:09.679 어느 정도 보이지만 470 00:25:09.679 --> 00:25:12.000 정확하게 알아보기는 좀 힘들죠 471 00:25:12.000 --> 00:25:15.160 그래서 이 파티클 이펙트가 472 00:25:15.160 --> 00:25:17.760 메시를 따라서 움직이게 하고 싶으시면 473 00:25:17.760 --> 00:25:19.679 반드시 업데이트 항목에도 474 00:25:19.679 --> 00:25:22.079 Location 항목이 들어가 있어야 475 00:25:22.079 --> 00:25:24.959 메시의 정보들을 지속적으로 업데이트를 받으면서 476 00:25:24.959 --> 00:25:29.640 이렇게 이펙트가 따라오는 것을 확인하실 수 있을 겁니다 477 00:25:29.640 --> 00:25:32.200 여기에서 파티클의 위치라든가 478 00:25:32.200 --> 00:25:34.079 이런 것들이 내 마음에 들지 않아서 479 00:25:34.079 --> 00:25:37.079 약간씩 변형하고 싶으실 수도 있습니다 480 00:25:37.079 --> 00:25:40.239 그래서 간단하게 스크래치 패드라고 하는 481 00:25:40.239 --> 00:25:42.399 나이아가라에서 제공하지 않는 482 00:25:42.399 --> 00:25:46.399 확장된 기능을 만드는 방법을 보여드리도록 하겠습니다 483 00:25:46.399 --> 00:25:49.920 우선 여기에 있는 업데이트 항목에서 484 00:25:49.920 --> 00:25:51.720 Scratch Pad라고 485 00:25:51.720 --> 00:25:55.279 새로운 모듈을 추가하는 방법을 선택해 줍니다 486 00:25:55.279 --> 00:25:57.679 그러면 지금 보시는 것처럼 487 00:25:57.679 --> 00:26:01.239 비주얼 스크립트 방식의 새로운 기능을 488 00:26:01.239 --> 00:26:03.279 우리가 구현해서 짜넣을 수 있는 489 00:26:03.279 --> 00:26:05.320 스크래치 패드라는 것이 보이는데요 490 00:26:05.320 --> 00:26:08.000 위쪽에 있는 System Overview 탭을 누르면 491 00:26:08.000 --> 00:26:10.480 다시 원래 항목으로 돌아옵니다 492 00:26:10.480 --> 00:26:12.760 우리가 사용하는 Particle State 493 00:26:12.760 --> 00:26:15.200 Skeletal Location 이런 것들도 494 00:26:15.200 --> 00:26:16.480 더블 클릭을 해 보면 495 00:26:16.480 --> 00:26:20.359 지금 보시는 것처럼 아주 복잡한 노드를 이용해서 496 00:26:20.359 --> 00:26:23.799 기능이 구현되어 있는 것을 확인하실 수가 있습니다 497 00:26:23.799 --> 00:26:26.480 보이시죠? 노드가 아주 복잡하죠 498 00:26:26.480 --> 00:26:28.200 물론 우리가 이번 시간에 해 볼 건 499 00:26:28.200 --> 00:26:30.480 이 정도로 복잡한 노드를 할 건 아니고 500 00:26:30.480 --> 00:26:34.480 대략 5개에서 6개 정도의 노드를 이용해서 501 00:26:34.480 --> 00:26:35.679 표현을 해 볼 건데요 502 00:26:35.679 --> 00:26:40.920 나이아가라의 ScratchModule을 이름을 바꿔서 503 00:26:40.920 --> 00:26:44.320 Rename으로 VoxelModule이라고 504 00:26:44.320 --> 00:26:46.239 이름 지어 주도록 하겠습니다 505 00:26:46.239 --> 00:26:49.519 VoxelModule, 더블 클릭하고 다시 506 00:26:49.519 --> 00:26:51.839 이 스크래치 패드는 기본적으로 507 00:26:51.839 --> 00:26:56.640 InputMap이라는 항목과 Map Get 그리고 Map Set 508 00:26:56.640 --> 00:27:00.320 마지막으로 아웃풋 이렇게 네 가지 구성으로 되어 있습니다 509 00:27:00.320 --> 00:27:03.880 보면 이 흰색의 화살표처럼 보이는 것들은 510 00:27:03.880 --> 00:27:06.200 실행하는 순서를 의미합니다 511 00:27:06.200 --> 00:27:11.519 그래서 Map Get에서 어떠한 정보를 받아오는 겁니다 512 00:27:11.519 --> 00:27:17.200 이를테면 메시에 대한 정보 혹은 컬러에 대한 정보 513 00:27:17.200 --> 00:27:19.600 그 외 기타 등등 나이아가라에서 514 00:27:19.600 --> 00:27:22.440 수집할 수 있는 정보들을 가지고 와서 515 00:27:22.440 --> 00:27:27.679 우리가 가공을 해서, 새로 기존의 파티클 정보에다가 516 00:27:27.679 --> 00:27:30.429 덧입혀주는 Map Set을 통해서 517 00:27:30.429 --> 00:27:32.239 커스터마이징을 할 수 있는 것이죠 518 00:27:32.239 --> 00:27:35.880 그래서 InputMap하고 Output Module은 519 00:27:35.880 --> 00:27:40.200 일단 크게 여러분들이 신경 쓰실 필요는 없고 520 00:27:40.200 --> 00:27:43.160 우리는 어느 정보를 가지고 와서 521 00:27:43.160 --> 00:27:45.359 여기에다가 집어 넣을 거냐 522 00:27:45.359 --> 00:27:48.399 이것만 먼저 생각하시면 됩니다 523 00:27:48.399 --> 00:27:51.440 우선은 Voxel의 형식을 만들기 위해서 524 00:27:51.440 --> 00:27:54.640 Voxel이라고 하는 건 기본적으로 525 00:27:54.640 --> 00:27:57.399 이렇게 굉장히 큐브의 형태로 526 00:27:57.399 --> 00:28:00.640 마치 모자이크처럼 이렇게 각진 형태의 527 00:28:00.640 --> 00:28:05.239 이런 3D 공간을 일정한 크기로 나눈 것들을 528 00:28:05.239 --> 00:28:07.000 흔히 Voxel이라고 얘기하는데 529 00:28:07.000 --> 00:28:10.000 그걸 위해서는 기존의 파티클의 530 00:28:10.000 --> 00:28:12.399 위치값이 표현이 돼야 됩니다 531 00:28:12.399 --> 00:28:15.679 그래서 여기 있는 Map Get에 +를 눌러서 532 00:28:15.679 --> 00:28:19.079 Particle Position이라고 검색을 하고요 533 00:28:19.079 --> 00:28:21.429 이 Particle Position에다가 534 00:28:21.429 --> 00:28:23.880 일정한 간격으로 배치를 해야 되니까 535 00:28:23.880 --> 00:28:28.559 간격을 의미하는 + 눌러서 Float 생성해 주시고 536 00:28:28.559 --> 00:28:33.320 이 Float의 이름은 grid라고 gridsize라고 정해 놓겠습니다 537 00:28:33.320 --> 00:28:35.679 이 두 가지 정보를 이용해서 538 00:28:35.679 --> 00:28:41.200 우리는 파티클을 일정한 간격으로 배치할 수 있게끔 539 00:28:41.200 --> 00:28:42.320 지정을 할 겁니다 540 00:28:42.320 --> 00:28:45.280 우선 포지션 정보를 받아 오셨다면 541 00:28:45.280 --> 00:28:50.239 이것을 연산하기 편하게 벡터의 형태로 542 00:28:50.239 --> 00:28:52.639 Transform Vector 노드를 이용해서 543 00:28:52.639 --> 00:28:53.919 변환을 해 줘야 됩니다 544 00:28:53.919 --> 00:28:56.559 Transform Vector만 선택을 하더라도 545 00:28:56.559 --> 00:29:00.640 포지션 정보를 XYZ에 이런 식으로 546 00:29:00.640 --> 00:29:04.200 벡터의 형식으로 바꿔주는 노드까지 함께 생성이 되고요 547 00:29:04.200 --> 00:29:07.200 기본 스페이스는 World와 Simulate 548 00:29:07.200 --> 00:29:10.719 Source는 World, Destination은 Simulation 549 00:29:10.719 --> 00:29:12.280 이걸 그대로 두겠습니다 550 00:29:12.280 --> 00:29:14.430 그대로 두고 이것을 551 00:29:14.430 --> 00:29:17.799 아웃 벡터를 그대로 이렇게 핀을 뽑아내서 552 00:29:17.799 --> 00:29:21.400 슬래시 혹은 디바이드라고 나누기죠 553 00:29:21.400 --> 00:29:23.119 나누기를 하는 겁니다 554 00:29:23.119 --> 00:29:27.080 그래서 gridsize로 나누기를 해 주시게 되면 555 00:29:27.080 --> 00:29:30.440 지금 보시는 것처럼 조금만 창을 정리하겠습니다 556 00:29:30.440 --> 00:29:34.840 이렇게 현재 위치 값을 gridsize로 나눠주고 557 00:29:34.840 --> 00:29:36.760 이것을 반올림을 해 줍니다 558 00:29:36.760 --> 00:29:40.520 Round라는 반올림 기능을 이용하고요 559 00:29:40.520 --> 00:29:43.119 마지막으로 이것을 다시 한번 560 00:29:43.119 --> 00:29:46.080 Round된 결과를 Multiply를 통해서 561 00:29:46.080 --> 00:29:49.559 gridsize로 한 번 더 이렇게 곱해 줍니다 562 00:29:49.559 --> 00:29:54.719 이렇게 곱해진 결과를 Map Set에다가 + 눌러서 563 00:29:54.719 --> 00:29:58.599 Particle Position이라고 다시 한번 검색을 해 보시면 564 00:29:58.599 --> 00:30:01.520 이렇게 Particle Position을 추가해 주고 565 00:30:01.520 --> 00:30:07.200 이 Particle Position에다가 곱하기까지 완료된 결과물을 566 00:30:07.200 --> 00:30:10.760 이렇게 연결을 해 주시면 기본적인 준비가 끝났습니다 567 00:30:10.760 --> 00:30:12.320 Apply를 눌러 주시고요 568 00:30:12.320 --> 00:30:15.760 현재는 여기에 점으로 기존의 메시 형태가 아닌 569 00:30:15.760 --> 00:30:17.679 점의 형태로 나와 있죠 570 00:30:17.679 --> 00:30:20.559 이거는 현재 gridsize의 기본 값이 571 00:30:20.559 --> 00:30:22.760 0으로 잡혀 있기 때문에 그런 겁니다 572 00:30:22.760 --> 00:30:26.080 그래서 System Overview로 가서 VoxelModule이라고 573 00:30:26.080 --> 00:30:28.799 이 모듈에 gridsize 항목이 있죠 574 00:30:28.799 --> 00:30:32.320 이것을 8이라고 입력을 하시고 575 00:30:32.320 --> 00:30:34.400 이 Initial Particle에 가서 576 00:30:34.400 --> 00:30:39.159 Lifetime을 1초로 좀 오래 나올 수 있게끔 바꿔 보면 577 00:30:39.159 --> 00:30:43.320 지금 보시는 것처럼 Particle의 입자들의 위치가 578 00:30:43.320 --> 00:30:45.719 일정해진 것을 확인하실 수가 있습니다 579 00:30:45.719 --> 00:30:48.080 원리를 간단하게 설명 드리면요 580 00:30:48.080 --> 00:30:52.760 이 한 칸을 0, 1, 2 이런 식으로 좀 두겠습니다 581 00:30:52.760 --> 00:30:56.119 현재 여러분 화면에 보이는 이런 그리드를 582 00:30:56.119 --> 00:30:59.200 이런 식으로 1, 2, 3 583 00:30:59.200 --> 00:31:01.359 그럼 만약에 이렇게 소수점 위치에 584 00:31:01.359 --> 00:31:03.239 대략 0.6 이라고 하죠 585 00:31:03.239 --> 00:31:05.960 0.6 에다가 나누기 3을 하고 586 00:31:05.960 --> 00:31:10.039 다시 곱하기 gridsize를 3 이라고 가정을 하는 거예요 587 00:31:10.039 --> 00:31:14.760 Round된 결과에다가 곱하기 3을 해 준 거죠 588 00:31:14.760 --> 00:31:17.359 식으로 따지면 이렇게 표현이 됩니다 589 00:31:17.359 --> 00:31:22.919 포지션의 위치에다가 나누기 3, Round하고 곱하기 3 590 00:31:22.919 --> 00:31:26.080 이런 식으로 하면은 0.6을 3으로 나누면 591 00:31:26.080 --> 00:31:28.880 대략 0.2 정도가 되겠죠 592 00:31:28.880 --> 00:31:32.640 0.2를 라운딩하면 0이 될 거고요 593 00:31:32.640 --> 00:31:36.520 반올림을 하면 0.2에다 3을 곱해도 그대로 0이겠죠 594 00:31:36.520 --> 00:31:40.880 그럼 원래는 0.6에 위치해 있어야 될 점이 595 00:31:40.880 --> 00:31:44.840 이렇게 0에 위치하게끔 바뀌게 될 겁니다 596 00:31:44.840 --> 00:31:49.040 마찬가지 맥락으로 1.8에 있는 점의 위치를 597 00:31:49.040 --> 00:31:51.280 나누기 3을 하면 몇이 되겠어요? 598 00:31:51.280 --> 00:31:55.679 0.6이 되고 라운딩을 하면 Round를 하면 599 00:31:55.679 --> 00:31:57.559 반올림을 하게 되면 600 00:31:57.559 --> 00:32:01.359 이것이 1이 된 다음에 ×3을 하니까 601 00:32:01.359 --> 00:32:03.119 3에 위치하게 되겠죠 602 00:32:03.119 --> 00:32:05.019 그럼 여기 있어야 될 점이 603 00:32:05.019 --> 00:32:08.080 이렇게 정수의 위치에 딱 가게 됩니다 604 00:32:08.080 --> 00:32:12.320 이런 식으로 일정한 정수 위치에다가 605 00:32:12.320 --> 00:32:14.479 점들을 옮길 수 있게 되는 거죠 606 00:32:14.479 --> 00:32:18.080 그래서 여기에다가 스프라이트로 하면 607 00:32:18.080 --> 00:32:19.730 그 형태를 조금 더 608 00:32:19.730 --> 00:32:21.799 Voxel의 느낌을 알 수가 없으니까 609 00:32:21.799 --> 00:32:23.880 Sprite Renderer는 꺼 주도록 하고 610 00:32:23.880 --> 00:32:25.960 렌더에 + 버튼을 눌러서 611 00:32:25.960 --> 00:32:29.080 Mesh Renderer를 추가해 줍니다 612 00:32:29.080 --> 00:32:32.640 그리고 이 Mesh Renderer의 Meshes 항목을 613 00:32:32.640 --> 00:32:36.000 기본 큐브 항목으로 넣어 주도록 하겠습니다 614 00:32:36.000 --> 00:32:38.760 보면 첫 번째로 검색되는 게 615 00:32:38.760 --> 00:32:42.640 이 노란색 테두리를 가진 VR 에디터에 있는 616 00:32:42.640 --> 00:32:46.200 베이직 메시, Cube_01 이라고 되어 있는데요 617 00:32:46.200 --> 00:32:48.520 이걸 이렇게 넣어 보면 컴파일이 좀 끝나면 618 00:32:48.520 --> 00:32:50.000 이런 식으로 큐브가 생기죠 619 00:32:50.000 --> 00:32:52.440 사이즈는 나중에 수정해 주도록 하고요 620 00:32:52.440 --> 00:32:55.679 이 메시의 방향이 지금 제각각으로 621 00:32:55.679 --> 00:32:58.400 이렇게 랜덤하게끔 생성되고 있으니까 622 00:32:58.400 --> 00:33:03.080 이것의 축을 Lock Axis Enable를 활성화해서 623 00:33:03.080 --> 00:33:07.680 Lock Axis를 X축으로 1, Z축으로 0 624 00:33:07.680 --> 00:33:10.599 Y축도 0이 되게끔 해 놓겠습니다 625 00:33:10.599 --> 00:33:13.479 방향을 Axis를 고정해 놓고 626 00:33:13.479 --> 00:33:15.479 Skeletal Mesh의 아래쪽에 보시면 627 00:33:15.479 --> 00:33:18.880 Orientation Sampling이라고 Apply 되어 있습니다 628 00:33:18.880 --> 00:33:22.119 이것이 사실 눈으로 보기엔 랜덤하게끔 보이는데 629 00:33:22.119 --> 00:33:24.760 실제로는 3D 표면에 맞춰 가지고 630 00:33:24.760 --> 00:33:27.799 만약에 3D 표면이 이렇게 되어 있으면 631 00:33:27.799 --> 00:33:30.799 Skeletal Mesh의 표면이 되어 있으면 632 00:33:30.799 --> 00:33:32.760 이 표면이 바라보는 방향에 맞춰서 633 00:33:32.760 --> 00:33:35.559 이렇게 정렬이 되는 거거든요 634 00:33:35.559 --> 00:33:39.320 이런 식으로, 이것을 3D 표면을 기준으로 하지 않고 635 00:33:39.320 --> 00:33:43.080 우리가 Lock을 지정해 둔 방향대로 작동하게끔 636 00:33:43.080 --> 00:33:47.400 Orientation Sampling 부분을 Output으로 바꿔 주게 되면 637 00:33:47.400 --> 00:33:49.960 업데이트도 마찬가지로 638 00:33:49.960 --> 00:33:53.799 Orientation Sampling을 Output으로 바꿔 놓게 되면 639 00:33:53.799 --> 00:33:56.999 이제 그리드하게 일정하게 640 00:33:56.999 --> 00:33:59.159 크기가 정해진 걸 보실 수가 있고요 641 00:33:59.159 --> 00:34:02.440 지금은 이제 빽빽하게 크기가 워낙에 커서 642 00:34:02.440 --> 00:34:04.000 겹쳐져 있는 상태인데 643 00:34:04.000 --> 00:34:05.919 Initialize Particle에 가셔서 644 00:34:05.919 --> 00:34:08.440 Mesh Scale 모드를 Uniform으로 645 00:34:08.440 --> 00:34:11.799 그리고 사이즈를 드래그해서 줄여 보시면 646 00:34:11.799 --> 00:34:15.119 이런 식으로 일정한 형태로 647 00:34:15.119 --> 00:34:17.369 일정한 간격과 형태로 648 00:34:17.369 --> 00:34:19.440 큐브가 배치된 걸 보실 수가 있습니다 649 00:34:19.440 --> 00:34:22.359 이것을 실제로 블루프린트에서 확인을 해 보면 650 00:34:22.359 --> 00:34:23.400 이렇게 보입니다 651 00:34:23.400 --> 00:34:26.840 마치 큐브가 애니메이션 되듯이 652 00:34:26.840 --> 00:34:28.599 이런 식으로 보이는 것이죠 653 00:34:28.599 --> 00:34:31.880 그런데 그리드 사이즈에 맞춰서 654 00:34:31.880 --> 00:34:35.119 만약에 우리가 그리드의 간격이나 655 00:34:35.119 --> 00:34:37.400 이런 것들이 마음에 들지 않아서 656 00:34:37.400 --> 00:34:39.880 VoxelModule에서 gridsize를 657 00:34:39.880 --> 00:34:41.799 이를테면 5로 바꾸게 되면 658 00:34:41.799 --> 00:34:43.400 또다시 겹치게 되고 659 00:34:43.400 --> 00:34:45.200 10으로 바꾸게 되면은 660 00:34:45.200 --> 00:34:47.080 간격이 더 벌어지게 되고 661 00:34:47.080 --> 00:34:49.599 큐브의 사이즈가 일정하다 보니까 662 00:34:49.599 --> 00:34:52.119 gridsize를 바꾸는 것에 맞춰 가지고 663 00:34:52.119 --> 00:34:54.039 계속해서 사이즈 바꿔 주고 664 00:34:54.039 --> 00:34:56.599 크기 바꿔 주고 이런 식으로 번잡하죠 665 00:34:56.599 --> 00:34:58.520 그래서 User Parameters에다가 666 00:34:58.520 --> 00:35:01.200 파라미터 항목을 하나 추가를 해 주겠습니다 667 00:35:01.200 --> 00:35:04.599 Make New에 Common에 있는 float 668 00:35:04.599 --> 00:35:07.119 여기를 그리드 이름을 669 00:35:07.119 --> 00:35:10.320 UserGrid라고 이름을 지어 주도록 하고요 670 00:35:10.320 --> 00:35:12.320 gridsize에 있는 항목을 671 00:35:12.320 --> 00:35:14.440 아래쪽의 화살표를 눌러서 672 00:35:14.440 --> 00:35:17.679 UserGrid라고 검색해 보시면 673 00:35:17.679 --> 00:35:20.880 User Parameters에 만들었던 항목을 그대로 674 00:35:20.880 --> 00:35:22.440 사용하실 수가 있게 됩니다 675 00:35:22.440 --> 00:35:24.840 그럼 여기에 우리가 UserGrid를 676 00:35:24.840 --> 00:35:28.080 5로 입력하거나 10으로 입력하거나 하면 677 00:35:28.080 --> 00:35:30.799 자연스럽게 연결이 되어 있으니까 678 00:35:30.799 --> 00:35:31.960 바뀌게 되겠죠 679 00:35:31.960 --> 00:35:35.640 이것을 Initialize Particle에다가도 680 00:35:35.640 --> 00:35:37.440 동일하게 연동해 주게끔 681 00:35:37.440 --> 00:35:40.880 한번 추가적인 작업을 해 볼 겁니다 682 00:35:40.880 --> 00:35:43.320 자 우리가 Initialize Particle에서 683 00:35:43.320 --> 00:35:46.000 Mesh Scale Mode를 이용해서 바꿔 줬죠 684 00:35:46.000 --> 00:35:49.359 여기에는 0.12 이런 식으로 값을 넣어 줬는데 685 00:35:49.359 --> 00:35:51.520 여기에다가 Uniform Scale에서도 686 00:35:51.520 --> 00:35:53.960 아래쪽 화살표를 눌러서 687 00:35:53.960 --> 00:35:56.159 New Expression이라고 하는 688 00:35:56.159 --> 00:35:59.119 이것은 쉽게 얘기해서 스크래치 패드처럼 689 00:35:59.119 --> 00:36:00.599 복잡한 노드가 아니라 690 00:36:00.599 --> 00:36:05.080 이런 명령어를 직접 타이핑 하는 방식으로 쓰는 건데요 691 00:36:05.080 --> 00:36:07.159 사용하는 방법은 이런 겁니다 692 00:36:07.159 --> 00:36:08.400 직접 타이핑을 해서 693 00:36:08.400 --> 00:36:11.799 여기에서 얘기하는 유저는 이 유저입니다 694 00:36:11.799 --> 00:36:13.840 User Parameters에 유저라고 써 있죠 695 00:36:13.840 --> 00:36:17.719 유저가 가지고 있는 파라미터들 중에 696 00:36:17.719 --> 00:36:21.440 UserGrid를 받아올 것이다 697 00:36:21.440 --> 00:36:22.479 라고 하는 겁니다 698 00:36:22.479 --> 00:36:26.719 이렇게만 한다면 엔터를 치면 그대로 작동을 합니다 699 00:36:26.719 --> 00:36:29.320 UserGrid라고 그 값을 그대로 가져오면 700 00:36:29.320 --> 00:36:31.640 여기에 10이라고 입력하면 701 00:36:31.640 --> 00:36:34.520 원래 사이즈의 10배가 되는 겁니다 702 00:36:34.520 --> 00:36:38.840 원래 큐브가 가지고 있는 사이즈의 10배가 된 거예요 703 00:36:38.840 --> 00:36:41.359 그럼 큐브의 사이즈가 중요하겠죠 704 00:36:41.359 --> 00:36:43.280 여기 Mesh Renderer에서 보시면 705 00:36:43.280 --> 00:36:45.320 이 큐브를 더블 클릭해 보시면 706 00:36:45.320 --> 00:36:47.540 이 큐브의 사이즈, Approx Size가 707 00:36:47.540 --> 00:36:50.320 대략 49×49 이렇게 되어있는데 708 00:36:50.320 --> 00:36:52.840 대략 50cm 정도라고 가정하겠습니다 709 00:36:52.840 --> 00:36:56.039 그러면 50cm의 10배가 되니까 710 00:36:56.039 --> 00:36:58.320 5m짜리 큐브가 배치가 된 거고요 711 00:36:58.320 --> 00:37:00.960 그래서 Initialize Particle에 가서 712 00:37:00.960 --> 00:37:03.510 원래 큐브가 가지고 있는 사이즈에 713 00:37:03.510 --> 00:37:05.520 나누기 50을 해주시면 714 00:37:05.520 --> 00:37:08.160 이런 식으로 빈틈 없이 715 00:37:08.160 --> 00:37:12.239 메꿔진 형태의 Voxel를 보실 수가 있고요 716 00:37:12.239 --> 00:37:14.439 실제로 사이즈를 줄여도 717 00:37:14.439 --> 00:37:18.319 여전히 빈틈 없이 작동하는 것을 확인하실 수가 있죠 718 00:37:18.319 --> 00:37:21.119 실제로 스켈레탈 메시 쪽에서 보셔도 719 00:37:21.119 --> 00:37:24.640 이런 식으로 우리가 지정한 사이즈에 맞춰서 720 00:37:24.640 --> 00:37:28.280 캐릭터가 애니메이션 되는 것을 확인하실 수 있습니다 721 00:37:28.280 --> 00:37:31.239 지금은 제가 Run 이미지를 넣어 놔서 그런데 722 00:37:31.239 --> 00:37:33.040 Run 뿐만 아니라 723 00:37:33.040 --> 00:37:35.959 스켈레탈 메시에다가 애니메이션 클립을 724 00:37:35.959 --> 00:37:39.479 Idle을 집어 넣어도 그대로 위치하게 되고요 725 00:37:39.479 --> 00:37:44.839 Walk를 집어 넣어도 그대로 걷는 모션에 맞춰 가지고 726 00:37:44.839 --> 00:37:46.539 Voxel 동작이 그대로 727 00:37:46.539 --> 00:37:48.719 메시의 표면을 따라서 작동하게 됩니다 728 00:37:48.719 --> 00:37:52.119 이런 식으로 나이아가라 같은 경우에는 729 00:37:52.119 --> 00:37:56.599 단순히 기본 제공되는 모듈에서 벗어나서 730 00:37:56.599 --> 00:38:01.319 스크래치 패드와 혹은 익스프레션과 같은 형태로 731 00:38:01.319 --> 00:38:04.169 우리가 임의로 조작해서 732 00:38:04.169 --> 00:38:06.640 사용할 수 있는 기능들이 있습니다 733 00:38:06.640 --> 00:38:08.000 마무리하기에 앞서서 734 00:38:08.000 --> 00:38:10.160 여러분들이 지금 보시는 것처럼 735 00:38:10.160 --> 00:38:13.880 이 큐브가 Voxel이 계속해서 깜빡깜빡 거리면서 736 00:38:13.880 --> 00:38:17.640 왔다갔다 이렇게 이동하는 게 눈에 좀 거슬리시죠 737 00:38:17.640 --> 00:38:20.640 이거는 파티클이 계속 사라졌다가 생겼다 하면서 738 00:38:20.640 --> 00:38:23.280 위치들이 랜덤하게 잡히다 보니까 739 00:38:23.280 --> 00:38:24.680 이런 일이 생기는 건데 740 00:38:24.680 --> 00:38:29.280 이때는 Emitter State를 한 번만 741 00:38:29.280 --> 00:38:32.319 Emitter가 한 번만 작동되게 해 주시고요 742 00:38:32.319 --> 00:38:35.771 그러면 시간이 지나면 서서히 사라질 겁니다 이런 식으로 743 00:38:35.771 --> 00:38:39.640 근데 Rate 값이 아닌 Burst를 추가해서 744 00:38:39.640 --> 00:38:43.439 한 번에 이를테면 1000개가 생성되라든가 745 00:38:43.439 --> 00:38:46.880 이런 식으로 세팅 값을 바꿔 주시고 746 00:38:46.880 --> 00:38:49.640 그러면 한 번에 생성됐다 한 번에 사라지죠 747 00:38:49.640 --> 00:38:54.199 다만 사라지지 않게끔 파티클의 스테이트 748 00:38:54.199 --> 00:38:58.199 이것을 Particle Kill 되는 기능을 해제해 주시면 749 00:38:58.199 --> 00:39:00.800 계속해서 파티클이 유지가 됩니다 750 00:39:00.800 --> 00:39:05.560 Initialize Particle 항목에서 Lifetime이 몇이 되건 751 00:39:05.560 --> 00:39:10.439 Particle State가 Kill되는 항목을 비활성화해 주시면 752 00:39:10.439 --> 00:39:14.119 생성된 파티클이 사라지지 않고 계속 유지가 되기 때문에 753 00:39:14.119 --> 00:39:16.000 이런 식으로 파티클의 입자수를 754 00:39:16.000 --> 00:39:20.640 어느 정도 여러분들이 일정하게 유지할 수 있게 되고요 755 00:39:20.640 --> 00:39:23.119 그렇게 되면 가만히 있는다고 했을 때 756 00:39:23.119 --> 00:39:26.579 깜빡거리는 증상을 완화시켜 줄 수 있습니다 757 00:39:26.579 --> 00:39:29.719 여러분들이 보기 좋다고 생각하는 밀도를 758 00:39:29.719 --> 00:39:31.839 지금 UserGrid 5에 맞춰 가지고 759 00:39:31.839 --> 00:39:35.439 1,000개를 생성하거나 혹은 2,000개를 생성하게끔 760 00:39:35.439 --> 00:39:38.680 이 상태가 마음에 든다 라고 하시면 761 00:39:38.680 --> 00:39:41.439 이것도 New Expression을 이용해서 762 00:39:41.439 --> 00:39:46.280 대문자 U로 시작하는 User.UserGrid 763 00:39:46.280 --> 00:39:50.640 UserGrid를 아까는 UserGrid 나누기 764 00:39:50.640 --> 00:39:51.920 큐브의 사이즈만큼 해줬는데 765 00:39:51.920 --> 00:39:54.119 이번에는 나누기를 앞에다 하겠습니다 766 00:39:54.119 --> 00:39:59.520 10000/UserGrid 이런 형태가 되게끔 767 00:39:59.520 --> 00:40:01.479 10000은 그냥 임의의 숫자입니다 768 00:40:01.479 --> 00:40:04.400 엔터를 해주시면 10000 나누기 5가 되면서 769 00:40:04.400 --> 00:40:06.119 2,000개가 생기게 되죠 770 00:40:06.119 --> 00:40:10.920 당연히 그리드 사이즈가 많아지면, 커지게 되면 771 00:40:10.920 --> 00:40:13.880 파티클의 개수는 자연스럽게 줄게 되고요 772 00:40:13.880 --> 00:40:16.959 그리드 사이즈가 작아지게 되면 773 00:40:16.959 --> 00:40:20.880 파티클의 생성 개수가 늘어나게 되겠죠 774 00:40:20.880 --> 00:40:22.920 이걸 꼭 10000을 안하시고 775 00:40:22.920 --> 00:40:26.680 이걸 20000, 30000 이런 식으로 776 00:40:26.680 --> 00:40:28.560 임의의 숫자를 주시면 됩니다 777 00:40:28.560 --> 00:40:31.079 그러면 자연스럽게 이렇게 파티클들이 778 00:40:31.079 --> 00:40:35.680 밀도들을 이렇게 제어를, 그리드 사이즈에 맞춰서 779 00:40:35.680 --> 00:40:37.280 사용해 줄 수가 있게 되고요 780 00:40:37.280 --> 00:40:41.000 이런 식으로 그래서 지금 연계된 것들이 781 00:40:41.000 --> 00:40:43.880 스폰 개수도 유저의 그리드 수에 맞춰서 782 00:40:43.880 --> 00:40:47.959 그리고 Voxel의 간격도 UserGrid에 맞춰서 783 00:40:47.959 --> 00:40:51.239 파티클의 사이즈도 UserGrid에 맞춰서 784 00:40:51.239 --> 00:40:54.520 이런 식으로 차곡차곡 연계를 해 두신다면 785 00:40:54.520 --> 00:40:58.079 조금 더 단일한 값 한두 개만 가지고도 786 00:40:58.079 --> 00:41:00.119 제어하기가 쉬워지겠죠 787 00:41:00.119 --> 00:41:02.959 이상으로 스켈레탈 메시와 연계된 788 00:41:02.959 --> 00:41:05.745 나이아가라 이펙트 마무리 하겠습니다 789 00:41:07.359 --> 00:41:10.680 이번 시간에는 스켈레탈 메시를 활용한 790 00:41:10.680 --> 00:41:13.839 파티클 기법에 대해서 알아봤습니다 791 00:41:13.839 --> 00:41:17.000 단순히 정적인 위치에서 제어되는 792 00:41:17.000 --> 00:41:19.520 기존의 파티클들과는 다르게 793 00:41:19.520 --> 00:41:22.839 메시를 기본 베이스로 두고 활용하다 보니 794 00:41:22.839 --> 00:41:26.760 고려해야 될 사항이 많았습니다 795 00:41:26.760 --> 00:41:30.479 나이아가라 구성뿐만 아니라 블루프린트 상에서 796 00:41:30.479 --> 00:41:34.119 컴포넌트의 구성까지 고려해야 하는 만큼 797 00:41:34.119 --> 00:41:37.239 스켈레탈 메시를 활용한 파티클 제작은 798 00:41:37.239 --> 00:41:41.640 사전에 고려해야 될 사항이 많습니다 799 00:41:41.640 --> 00:41:44.640 하지만 제대로 활용할 수 있게 된다면 800 00:41:44.640 --> 00:41:48.980 나이아가라만을 이용해서 제작하는 파티클들과는 다르게 801 00:41:48.980 --> 00:41:52.719 굉장히 다이내믹한 효과를 제작할 수 있으니 802 00:41:52.719 --> 00:41:56.560 다양하게 활용해 보시면 좋을 것 같습니다 803 00:41:56.560 --> 00:41:59.710 이상으로 언리얼 이펙트에 대한 강의를 804 00:41:59.710 --> 00:42:01.084 마치도록 하겠습니다 805 00:42:01.084 --> 00:42:02.084 감사합니다 806 00:42:02.760 --> 00:42:03.723 스켈레탈 메시를 활용한 파티클 기법 스켈레톤 애셋 Content > Characters > Mannequins > Meshes에서 SK_Mannequin 애셋 선택 807 00:42:03.723 --> 00:42:04.766 뷰포트에서 Character > Bones > All Hierarchy 선택 FX_FootStep 제작 808 00:42:04.766 --> 00:42:05.759 나이아가라 시스템에서 Fountain 템플릿 선택 후 FX_FootStep으로 이름 설정 ShapeLocation, Gravity Force 비활성화 809 00:42:05.759 --> 00:42:06.844 Emitter State의 Loop Behavior: Once, Loop Duration 0.2 설정 810 00:42:06.844 --> 00:42:07.842 Initialize Particle의 Lifetime min 0.2, Lifetime max 0.3 설정 811 00:42:07.842 --> 00:42:08.342 애니메이션 시퀀스 애셋 뷰포트 우측 상단 애니메이션 시퀀스 아이콘 선택 애셋 브라우저창에서 MF_Run_Fwd 더블 클릭 타임라인창 Notifies 항목 Track 클릭 후 812 00:42:08.342 --> 00:42:09.077 Add Notify Track 선택하고 step로 트랙 이름 설정 발이 닿는 시간대에 마우스 우클릭 후 Add Notify > Play Niagara Particle 813 00:42:09.077 --> 00:42:09.679 Niagara System: FX_FootStep 연결 왼쪽 발이 땅에 닿을 때 Rotation Offset : x -90, SocketName: ball_l 오른쪽 발이 814 00:42:09.679 --> 00:42:10.272 땅에 닿을 때 Rotation Offset : x 90, SocketName: ball_r FX_Ribbon 생성 나이아가라 시스템에서 Dynamic Beam 템플릿 선택 후 815 00:42:10.272 --> 00:42:10.868 FX_Ribbon으로 이름 설정 Beam Emitter Setup, Spawn Burst, Spawn Beam, Beam Width, Update Beam 비활성화 816 00:42:10.868 --> 00:42:11.554 Spawn Rate 모듈 추가 후 Spawn rate 10 Initialize Particle에서 Lifetime 3, Ribbon Width Mode: Direct Set, 817 00:42:11.554 --> 00:42:12.206 Ribbon Width: 5 타임라인창 Notifies 항목 Track 클릭 후 Add Notify Track 선택하고 Ribbon으로 이름 설정 발이 닿는 시간대에 818 00:42:12.206 --> 00:42:12.703 마우스 우클릭 후 Add Notify > Play Niagara Particle Socket Name: head 819 00:42:12.703 --> 00:42:13.603 스켈레탈 메시를 이용한 3D 표면 데이터 활용 FX_SKM 생성 나이아가라 시스템에서 Fountain 템플릿 선택 후 FX_SKM으로 이름 설정 820 00:42:13.603 --> 00:42:14.403 Skeletal Mesh Location 추가 Cpu Access error: Fix Now 클릭 Preview: SKM_Quinn Mesh Sampling Type: 821 00:42:14.403 --> 00:42:15.203 Surface(Triangles), Spawn Rate: 1500 Skeletal Mesh Location 복사 > Particle Update에 붙여넣기 822 00:42:15.203 --> 00:42:16.053 FX_FootStep 제작 블루프린트 클래스에서 Character 클래스 선택 후 BP_SKMfx으로 이름 설정 Mesh 컴포넌트의 Animation Mode: 823 00:42:16.053 --> 00:42:16.903 Use Animations Asset, Anim to Play: MF_Run_Fwd Skeletal Mesh Asset: SKM_Quinn Visible: 비활성화 824 00:42:16.903 --> 00:42:17.719 [+] Add Niagara 컴포넌트 생성 후 Niagara System Asset에 FX_SKM 연결 825 00:42:17.719 --> 00:42:18.219 FX_SKM 모듈 제작 Particle Update에 New Scratch Pad Module 추가 후 이름을 VoxelModule로 변경 Map Get 노드 [+] 클릭 후 826 00:42:18.219 --> 00:42:18.719 Particle Position 추가, Float 추가 후 gridsize로 이름 설정 Particle Position 아웃풋 핀에서 Transform Vector 추가 827 00:42:18.719 --> 00:42:19.219 Map Set 노드 [+] 클릭 후 Particle Position 추가 Round(Transform Vector / gridsize) * gridsize 계산 결과를 828 00:42:19.219 --> 00:42:19.719 Map Set Particle Position에 연결 Sprite Renderer 모듈 비활성화 Mesh Renderer 모듈 추가 후 Meshes [0]에 SM_Cube_01 829 00:42:19.719 --> 00:42:20.219 설정 Lock Axis Enable 활성화 후 Lock Axis 값은 (1, 0, 0) 두 Skeletal Mesh Location 모듈의 Orientation Sampling을 830 00:42:20.219 --> 00:42:20.719 Output으로 설정 UserParameter [+] 클릭 후 Make New > Common > float 선택해 UserGrid로 이름 설정 Mesh Uniform Scale 831 00:42:20.719 --> 00:42:21.307 아래 화살표 클릭해 New Expression 선택 후 (User.UserGrid/50) 입력 Particle State의 Kill Particles When Lifetime 832 00:42:21.307 --> 00:42:21.891 항목, Spawn Rate 비활성화 Spawn Burst 추가 Spawn Count 아래 화살표 클릭해 New Expression 선택 후 833 00:42:21.891 --> 00:42:22.630 (10000/User.UserGrid) 입력