WEBVTT 1 00:00:04.310 --> 00:00:09.002 Realistic Commons Skeletal Effect 2 00:00:09.002 --> 00:00:11.573 GCC Academy 3 00:00:27.205 --> 00:00:30.194 Hello, this is Park Hyun-sang 4 00:00:30.194 --> 00:00:32.094 We will practice 5 00:00:32.094 --> 00:00:36.040 particle expression techniques using skeletal meshes 6 00:00:36.040 --> 00:00:37.990 Skeletal meshes refer 7 00:00:37.990 --> 00:00:42.000 to objects capable of animations, such as walking or running 8 00:00:42.000 --> 00:00:44.300 As the term suggests, 9 00:00:44.300 --> 00:00:47.360 it refers to objects with a skeletal structure 10 00:00:47.360 --> 00:00:50.610 These skeletal meshes can dynamically 11 00:00:50.610 --> 00:00:53.080 move within the content, 12 00:00:53.080 --> 00:00:58.200 creating complex movements 13 00:00:58.200 --> 00:01:01.400 To utilize these skeletal meshes, 14 00:01:01.400 --> 00:01:04.320 you can control particles separately 15 00:01:04.320 --> 00:01:08.440 using features like animation blueprints 16 00:01:08.440 --> 00:01:11.240 However, it can be challenging to match 17 00:01:11.240 --> 00:01:14.919 the exact timing of the animations 18 00:01:14.919 --> 00:01:17.219 Today, we'll learn techniques for synchronizing 19 00:01:17.219 --> 00:01:20.419 the timing accurately as well ass for adding 20 00:01:20.419 --> 00:01:22.675 a sense of speed and dynamism to particle expressions 21 00:01:23.361 --> 00:01:27.163 Particle Techniques Using Skeletal Meshes 22 00:01:28.671 --> 00:01:33.040 Before diving into creating examples, 23 00:01:33.040 --> 00:01:36.540 we will first review 24 00:01:36.540 --> 00:01:41.279 the skeletal meshes we will use 25 00:01:41.279 --> 00:01:45.279 If you want to display skeletal meshes, 26 00:01:45.279 --> 00:01:48.879 make sure your project 27 00:01:48.879 --> 00:01:51.479 includes Starter Content and Third Person assets 28 00:01:51.479 --> 00:01:54.160 in that project 29 00:01:54.160 --> 00:01:56.460 Navigate to the Content folder, then to Characters, 30 00:01:56.460 --> 00:01:58.680 where you will find a folder named Mannequins 31 00:01:58.680 --> 00:02:01.630 Inside the Mannequins folder, locate the Meshes folder 32 00:02:01.630 --> 00:02:06.279 You will see multiple mesh types available there 33 00:02:06.279 --> 00:02:09.997 Among them, you will find an asset labeled SK_Mannequin 34 00:02:09.997 --> 00:02:12.240 Double-click to open this asset, 35 00:02:12.240 --> 00:02:14.740 and you will see the same screen 36 00:02:14.740 --> 00:02:16.960 I am currently viewing 37 00:02:16.960 --> 00:02:19.660 At the top-right corner of the interface, 38 00:02:19.660 --> 00:02:24.960 you’ll notice various icons 39 00:02:24.960 --> 00:02:28.360 The first icon represents the Skeleton, 40 00:02:28.360 --> 00:02:33.360 often abbreviated as SK, 41 00:02:33.360 --> 00:02:37.010 and the second represents 42 00:02:37.010 --> 00:02:41.502 the Skeletal Mesh, or SKM 43 00:02:41.502 --> 00:02:48.880 We usually use them as the prefix of an asset name 44 00:02:48.880 --> 00:02:52.780 Unreal Engine uses a skeletal structure 45 00:02:52.780 --> 00:02:55.600 as the foundation for animations 46 00:02:55.600 --> 00:02:59.500 and the meshes associated with these skeletons 47 00:02:59.500 --> 00:03:01.880 They work together to form a system 48 00:03:01.880 --> 00:03:07.199 that integrates animations, 49 00:03:07.199 --> 00:03:10.080 which are controlled through Animation Blueprints 50 00:03:10.080 --> 00:03:12.800 In summary, skeletal structures form the base, 51 00:03:12.800 --> 00:03:18.039 multiple skeletal meshes are attached to them, 52 00:03:18.039 --> 00:03:20.789 and these meshes 53 00:03:20.789 --> 00:03:24.559 are linked to animation sequences 54 00:03:24.559 --> 00:03:27.359 These sequences include animations 55 00:03:27.359 --> 00:03:30.980 like running, jumping, and walking 56 00:03:30.980 --> 00:03:33.000 And after these, 57 00:03:33.000 --> 00:03:35.800 animation sequences 58 00:03:35.800 --> 00:03:39.279 are later connected via Animation Blueprints 59 00:03:39.279 --> 00:03:42.929 to control specific actions, such as 60 00:03:42.929 --> 00:03:45.759 when to run and when to jump 61 00:03:45.759 --> 00:03:49.880 These blueprints, in turn, are linked to skeletal meshes 62 00:03:49.880 --> 00:03:52.520 through Blueprint Characters 63 00:03:52.520 --> 00:03:54.970 For example, in the Third Person folder 64 00:03:54.970 --> 00:03:57.866 under Blueprints, 65 00:03:57.866 --> 00:04:00.279 you can find BP_ThirdPersonCharacter, 66 00:04:00.279 --> 00:04:05.119 where you can observe the connection 67 00:04:05.119 --> 00:04:07.769 between the skeletal mesh 68 00:04:07.769 --> 00:04:09.759 and the animation blueprint 69 00:04:09.759 --> 00:04:14.520 Let's start with something 70 00:04:14.520 --> 00:04:17.470 that does not need a blueprint on its own 71 00:04:17.470 --> 00:04:20.000 To integrate skeletal meshes with Niagara, 72 00:04:20.000 --> 00:04:23.760 you can utilize animation sequences 73 00:04:23.760 --> 00:04:27.519 like MF_Run_Fw 74 00:04:27.519 --> 00:04:30.769 This is where we can 75 00:04:30.769 --> 00:04:33.079 load our Niagara 76 00:04:33.079 --> 00:04:36.119 By accessing the Notify track in the animation sequence, 77 00:04:36.119 --> 00:04:38.440 you can add a new track, 78 00:04:38.440 --> 00:04:41.040 We have markers here, 79 00:04:41.040 --> 00:04:44.399 such as left and right 80 00:04:44.399 --> 00:04:48.849 Click on Track, and add this 81 00:04:48.849 --> 00:04:51.320 Add Notify Track 82 00:04:51.320 --> 00:04:54.520 Let's not name our Track a number, 83 00:04:54.520 --> 00:04:56.359 but as step 84 00:04:56.359 --> 00:04:58.920 This figure is too fast, 85 00:04:58.920 --> 00:05:02.000 it's hard to pinpoint a location 86 00:05:02.000 --> 00:05:07.440 Reducing the animation playback speed to 0.1 87 00:05:07.440 --> 00:05:14.000 allows for precise marking of 88 00:05:14.000 --> 00:05:16.760 when a foot touches the ground 89 00:05:16.760 --> 00:05:22.679 Say, you want some effects 90 00:05:22.679 --> 00:05:28.000 on the ground as this figure steps on it, 91 00:05:28.000 --> 00:05:31.799 like some dust effect 92 00:05:31.799 --> 00:05:34.920 While it’s possible to manually mark frames 93 00:05:34.920 --> 00:05:38.000 and control effects through blueprints, 94 00:05:38.000 --> 00:05:40.000 which isn't impossible for sure 95 00:05:40.000 --> 00:05:44.200 Animators can provide frame information 96 00:05:44.200 --> 00:05:47.880 For example, 7th frame for the right foot, 97 00:05:47.880 --> 00:05:51.040 17th frame for the left foot, 98 00:05:51.040 --> 00:05:54.279 and 26th frame, another foot 99 00:05:54.279 --> 00:05:58.239 As animators can provide frame information 100 00:05:58.239 --> 00:06:01.640 of the steps on the ground in terms of frames, 101 00:06:01.640 --> 00:06:06.200 we could ask for writing a code according to those frames 102 00:06:06.200 --> 00:06:08.679 so that the effects can come into play 103 00:06:08.679 --> 00:06:13.040 But that's too much work for the two 104 00:06:13.040 --> 00:06:16.600 The animator should record all the information 105 00:06:16.600 --> 00:06:20.399 about the frame so that they can deliver the information 106 00:06:20.399 --> 00:06:23.679 And the programmer should save all the information 107 00:06:23.679 --> 00:06:27.760 in some sort of a data in some storage 108 00:06:27.760 --> 00:06:29.640 to load later 109 00:06:29.640 --> 00:06:31.519 That's a lot of work 110 00:06:31.519 --> 00:06:34.947 If changes to the animation result in frame adjustments 111 00:06:34.947 --> 00:06:38.799 or timing shifts here and there, 112 00:06:38.799 --> 00:06:42.239 the updated frame information would need to be communicated 113 00:06:42.239 --> 00:06:46.600 and revised each time, which is inconvenient 114 00:06:46.600 --> 00:06:50.600 To address this, Unreal Engine allows you 115 00:06:50.600 --> 00:06:53.959 to integrate Niagara directly into the animation track 116 00:06:53.959 --> 00:06:56.909 For instance, at the precise moment 117 00:06:56.909 --> 00:07:00.079 a character’s foot hits the ground, 118 00:07:00.079 --> 00:07:05.320 you can use the Add Notify feature to execute a Niagara particle effect 119 00:07:05.320 --> 00:07:09.559 That's a function that Unreal has 120 00:07:09.559 --> 00:07:11.239 The right foot 121 00:07:11.239 --> 00:07:13.399 Of course, the left foot goes 122 00:07:13.399 --> 00:07:16.149 to this indicator, 123 00:07:16.149 --> 00:07:20.640 or the marker that tells us the current location 124 00:07:20.640 --> 00:07:23.040 Right click, Add Notify 125 00:07:23.040 --> 00:07:25.279 Play Niagara Particle Effect 126 00:07:25.279 --> 00:07:27.640 Let's add this 127 00:07:27.640 --> 00:07:31.240 Then, this assigns it 128 00:07:31.240 --> 00:07:34.279 to enable the effect we want 129 00:07:34.279 --> 00:07:37.239 at this specific frame 130 00:07:37.239 --> 00:07:39.789 Let’s create a quick effect 131 00:07:39.789 --> 00:07:41.959 to be used here 132 00:07:41.959 --> 00:07:45.839 First, I created a folder named SkeletalFX, 133 00:07:45.839 --> 00:07:50.640 then right-clicked to add a new Niagara System 134 00:07:50.640 --> 00:07:52.840 and the Fountain template, 135 00:07:52.840 --> 00:07:57.839 which resembles a fountain-like particle effect 136 00:07:57.839 --> 00:08:01.720 Instead of focusing on the details here, 137 00:08:01.720 --> 00:08:04.239 we’ll focus on how it works 138 00:08:04.239 --> 00:08:06.339 I named the effect 139 00:08:06.339 --> 00:08:12.399 FX_FootStep and keep it open 140 00:08:12.399 --> 00:08:15.760 Disable the Shape 141 00:08:15.760 --> 00:08:18.040 and Gravity options 142 00:08:18.040 --> 00:08:23.160 In Initialize Particle, for one footstep, 143 00:08:23.160 --> 00:08:26.320 if the effect persists for a few seconds, 144 00:08:26.320 --> 00:08:28.420 though we walk a few steps 145 00:08:28.420 --> 00:08:31.760 in that one second, 146 00:08:31.760 --> 00:08:34.310 the effect will stay there 147 00:08:34.310 --> 00:08:36.080 even after a few steps 148 00:08:36.080 --> 00:08:39.380 So set the particle lifespan to around 0.2 to 0.3 seconds, 149 00:08:39.380 --> 00:08:42.799 or for a very short time 150 00:08:42.799 --> 00:08:47.840 I also limited the loop to a single execution 151 00:08:47.840 --> 00:08:51.090 and reduced the duration to 152 00:08:51.090 --> 00:08:54.400 a brief moment for a simple pop, pop 153 00:08:54.400 --> 00:08:56.080 It's a simple effect 154 00:08:56.080 --> 00:08:58.530 Once the effect is ready, 155 00:08:58.530 --> 00:09:02.039 you can search for FX_FootStep in NiagaraEffect 156 00:09:02.039 --> 00:09:03.719 and assign it 157 00:09:03.719 --> 00:09:05.919 FX_FootStep 158 00:09:05.919 --> 00:09:07.719 When played, you’ll see the effect 159 00:09:07.719 --> 00:09:12.719 activate briefly with each footstep hitting the ground 160 00:09:12.719 --> 00:09:15.400 However, if you observe closely, 161 00:09:15.400 --> 00:09:19.039 sometimes the effect lingers in the air 162 00:09:19.039 --> 00:09:21.919 even after the foot has moved 163 00:09:21.919 --> 00:09:25.239 To fix this, I’ll show you how 164 00:09:25.239 --> 00:09:29.189 to align the effect with the skeletal bone 165 00:09:29.189 --> 00:09:31.400 corresponding to the foot’s tip 166 00:09:31.400 --> 00:09:35.400 In the character settings, check Bones - All Hierarchy 167 00:09:35.400 --> 00:09:39.239 to visually display all 168 00:09:39.239 --> 00:09:41.520 the skeletal bone data of the character 169 00:09:41.520 --> 00:09:48.799 You can identify the foot-tip bones labeled as ball_l and ball_r 170 00:09:48.799 --> 00:09:53.300 When the right foot moves, 171 00:09:53.300 --> 00:09:57.359 set ball_r to Socket Name 172 00:09:57.359 --> 00:10:02.520 and for left, ball_l for Footstep 173 00:10:02.520 --> 00:10:07.880 So for the first one, ball_r, and press enter 174 00:10:07.880 --> 00:10:11.760 The second, ball_l 175 00:10:11.760 --> 00:10:13.359 Check accordingly 176 00:10:13.359 --> 00:10:18.880 Now we see the effect moving along the foot 177 00:10:18.880 --> 00:10:22.719 So now, to this remaining right foot, 178 00:10:22.719 --> 00:10:25.000 go to the spot with the R 179 00:10:25.000 --> 00:10:29.200 Copy this Footstep Notify 180 00:10:29.200 --> 00:10:31.760 and paste it here 181 00:10:31.760 --> 00:10:34.280 To the L, or left, 182 00:10:34.280 --> 00:10:38.679 copy, right-click on L, paste 183 00:10:38.679 --> 00:10:41.760 Paste it in here 184 00:10:41.760 --> 00:10:45.760 If locating it is too hard for you, 185 00:10:45.760 --> 00:10:50.799 you can use the scroll to zoom in 186 00:10:50.799 --> 00:10:54.559 and drag to get the precise location 187 00:10:54.559 --> 00:10:55.559 Like this 188 00:10:55.559 --> 00:10:59.239 Save, and let's play it 189 00:10:59.239 --> 00:11:01.840 As they walk, you see the effect 190 00:11:01.840 --> 00:11:02.614 Just like that 191 00:11:02.614 --> 00:11:06.479 In the FX_FootStep effect, 192 00:11:06.479 --> 00:11:09.512 the shape of the velocity cone is aligned with the Z-axis 193 00:11:09.512 --> 00:11:13.862 This configuration ensures that the particle effect 194 00:11:13.862 --> 00:11:15.359 emits upward 195 00:11:15.359 --> 00:11:17.909 In contrast, 196 00:11:17.909 --> 00:11:21.359 when examining the direction of the selected ball component, 197 00:11:21.359 --> 00:11:23.919 you can accurately determine its orientation 198 00:11:23.919 --> 00:11:28.599 Set the coordinate display mode to Local, 199 00:11:28.599 --> 00:11:31.359 represented by a cube icon, 200 00:11:31.359 --> 00:11:32.599 in this cube, 201 00:11:32.599 --> 00:11:34.479 as opposed to the globe icon 202 00:11:34.479 --> 00:11:36.799 for the World coordinate system 203 00:11:36.799 --> 00:11:39.799 In the local coordinate view, you’ll notice that the Z-axis 204 00:11:39.799 --> 00:11:41.559 of the ball is pointing to the right 205 00:11:41.559 --> 00:11:43.359 This is why 206 00:11:43.359 --> 00:11:47.080 Because the Z-axis is set as the primary direction, 207 00:11:47.080 --> 00:11:50.039 the particles are configured to extend along the Z-axis 208 00:11:50.039 --> 00:11:53.960 As a result, the particles naturally 209 00:11:53.960 --> 00:11:57.119 emit outward along this axis 210 00:11:57.119 --> 00:11:58.719 On the left side, this alignment is clearly visible 211 00:11:58.719 --> 00:12:00.969 For the right side, 212 00:12:00.969 --> 00:12:04.280 while the Z-axis also points outward, 213 00:12:04.280 --> 00:12:05.719 a key difference 214 00:12:05.719 --> 00:12:09.599 is observed when the two feet are positioned closer together for comparison 215 00:12:09.599 --> 00:12:11.200 ay attention to the direction of the Y-axis 216 00:12:11.200 --> 00:12:15.200 For the ball on the left side, the Y-axis points downward, 217 00:12:15.200 --> 00:12:18.919 whereas for ball_r on the right side, the Y-axis points upward 218 00:12:18.919 --> 00:12:21.440 In such cases, aligning uniformly 219 00:12:21.440 --> 00:12:22.799 along either the Z-axis 220 00:12:22.799 --> 00:12:25.239 or Y-axis becomes 221 00:12:25.239 --> 00:12:28.359 a challenging task 222 00:12:28.359 --> 00:12:31.559 To address this, 223 00:12:31.559 --> 00:12:34.119 you can adjust 224 00:12:34.119 --> 00:12:37.119 the Rotation Offset value here 225 00:12:37.119 --> 00:12:38.640 That's how you can adjust it 226 00:12:38.640 --> 00:12:41.840 For ball_r, to make the Z-axis 227 00:12:41.840 --> 00:12:45.200 align upward like the Y-axis, 228 00:12:45.200 --> 00:12:48.000 you would rotate the X-axis by 90 degrees 229 00:12:48.000 --> 00:12:51.440 This moves the Y-axis horizontally and aligns the Z-axis upward 230 00:12:51.440 --> 00:12:56.790 Enter a positive Rotation Offset of 90 231 00:12:56.790 --> 00:12:59.520 on the X-axis, 232 00:12:59.520 --> 00:13:04.280 and the particle will emit upward when the foot makes contact 233 00:13:04.280 --> 00:13:07.359 For the left foot, it's the same 234 00:13:07.359 --> 00:13:11.640 Since the Y-axis is downward, 235 00:13:11.640 --> 00:13:15.359 set the Rotation Offset value 236 00:13:15.359 --> 00:13:19.359 to -90, not 90, on the X-axis 237 00:13:19.359 --> 00:13:24.080 This adjustment ensures that particles for both feet 238 00:13:24.080 --> 00:13:28.239 consistently emit upward 239 00:13:28.239 --> 00:13:30.280 in the direction of the instep 240 00:13:30.280 --> 00:13:32.159 If you compare the modified particles 241 00:13:32.159 --> 00:13:35.640 to the unadjusted ones I deliberately left unchanged, 242 00:13:35.640 --> 00:13:39.400 you’ll notice that the unmodified ones 243 00:13:39.400 --> 00:13:41.039 emit particles outward instead of upward 244 00:13:41.039 --> 00:13:43.039 For example, the unedited right foot particles 245 00:13:43.039 --> 00:13:45.239 still flow outward 246 00:13:45.239 --> 00:13:50.159 By setting the Rotation Offset values to 90 for the right foot 247 00:13:50.159 --> 00:13:54.400 and -90 for the left, 248 00:13:54.400 --> 00:13:59.039 the intended effect 249 00:13:59.039 --> 00:14:02.840 of dust particles shooting upwards with each step 250 00:14:02.840 --> 00:14:05.200 is achieved as you see 251 00:14:05.200 --> 00:14:07.599 When you test this 252 00:14:07.599 --> 00:14:10.479 in third-person mode, 253 00:14:10.479 --> 00:14:11.679 let's walk on 254 00:14:11.679 --> 00:14:13.929 You’ll observe the particles 255 00:14:13.929 --> 00:14:17.520 bursting upwards at each footstep, 256 00:14:17.520 --> 00:14:21.599 In addition to these short bursts, 257 00:14:21.599 --> 00:14:26.640 we can also create effects that leave 258 00:14:26.640 --> 00:14:28.840 trails in the direction the player is running 259 00:14:28.840 --> 00:14:31.320 These effects are also 260 00:14:31.320 --> 00:14:36.000 what the Notify can adjust 261 00:14:36.000 --> 00:14:40.960 Such effects are commonly referred to as trail effects, 262 00:14:40.960 --> 00:14:45.599 or ribbon effects in Niagara 263 00:14:45.599 --> 00:14:48.799 A rhythmic gymnast holding a ribbon 264 00:14:48.799 --> 00:14:51.400 creates beautiful patterns 265 00:14:51.400 --> 00:14:53.159 that follow 266 00:14:53.159 --> 00:14:56.400 their hand movements 267 00:14:56.400 --> 00:14:58.400 It's the same effect 268 00:14:58.400 --> 00:15:03.000 Let's create a new Niagara system 269 00:15:03.000 --> 00:15:05.280 using the Dynamic Beam template 270 00:15:05.280 --> 00:15:09.320 and name it FX_Ribbon 271 00:15:09.320 --> 00:15:11.599 Next, disable 272 00:15:11.599 --> 00:15:14.119 any unnecessary modules 273 00:15:14.119 --> 00:15:17.280 Start by turning off Update Beam, 274 00:15:17.280 --> 00:15:18.599 which is a beam 275 00:15:18.599 --> 00:15:21.359 that shoots a straight line 276 00:15:21.359 --> 00:15:23.000 This isn't what we want 277 00:15:23.000 --> 00:15:26.159 We want a natural curve 278 00:15:26.159 --> 00:15:28.359 according to the movement 279 00:15:28.359 --> 00:15:32.239 Spawn Beam, Beam Width, Update Beam, 280 00:15:32.239 --> 00:15:36.359 and Beam Emitter Setup under Emitter Update 281 00:15:36.359 --> 00:15:40.559 All the four beam-related modules 282 00:15:40.559 --> 00:15:45.239 are now disabled or deleted 283 00:15:45.239 --> 00:15:48.200 Let's disable Spawn Burst too 284 00:15:48.200 --> 00:15:50.039 So that's five 285 00:15:50.039 --> 00:15:52.689 Once these modules are turned off, 286 00:15:52.689 --> 00:15:55.440 add a Spawn Rate module to the update section 287 00:15:55.440 --> 00:16:00.000 This is enough for the module setup 288 00:16:00.000 --> 00:16:03.880 Set its value to 10 to define the particle generation rate 289 00:16:03.880 --> 00:16:07.000 For particle size adjustments, 290 00:16:07.000 --> 00:16:11.239 go to the Ribbon Attributes section 291 00:16:11.239 --> 00:16:14.719 and set the Ribbon Width to Direct Set, 292 00:16:14.719 --> 00:16:16.599 assigning it a value of 5 293 00:16:16.599 --> 00:16:19.399 At this point, 294 00:16:19.399 --> 00:16:21.599 no effects may visibly occur 295 00:16:21.599 --> 00:16:24.000 So we won't be using it 296 00:16:24.000 --> 00:16:26.200 But for this example of a ribbon, 297 00:16:26.200 --> 00:16:29.239 add a Velocity module, but instead of using Linear, 298 00:16:29.239 --> 00:16:32.479 set it to From Point 299 00:16:32.479 --> 00:16:34.979 This setting ensures that as the particles are generated, 300 00:16:34.979 --> 00:16:37.159 they align and leave behind a trail 301 00:16:37.159 --> 00:16:40.280 in a ribbon-like form 302 00:16:40.280 --> 00:16:43.159 By reducing the Lifetime, 303 00:16:43.159 --> 00:16:46.719 the ribbon trail becomes shorter 304 00:16:46.719 --> 00:16:49.369 If the Spawn Rate is set to 3, 305 00:16:49.369 --> 00:16:54.230 the ribbon effect appears more segmented, 306 00:16:54.230 --> 00:16:59.320 creating distinct gaps between particle instances, 307 00:16:59.320 --> 00:17:01.760 instead of sprites 308 00:17:01.760 --> 00:17:06.439 So that's the trail in the shape of a ribbon 309 00:17:06.439 --> 00:17:10.439 Increasing the Spawn Rate value 310 00:17:10.439 --> 00:17:13.199 creates a smoother, more continuous ribbon effect 311 00:17:13.199 --> 00:17:16.959 as particles are generated more frequently 312 00:17:16.959 --> 00:17:19.319 That's all set 313 00:17:19.319 --> 00:17:21.419 Back to Run_Fwd, 314 00:17:21.419 --> 00:17:25.040 and to add a sense of speed for running, 315 00:17:25.040 --> 00:17:27.640 add a Notify Track 316 00:17:27.640 --> 00:17:30.199 and label it as Ribbon 317 00:17:30.199 --> 00:17:32.280 At the start of the animation, 318 00:17:32.280 --> 00:17:37.400 or frame 0, insert a Particle Effect Notify 319 00:17:37.400 --> 00:17:42.479 and assign the FX_Ribbon effect 320 00:17:42.479 --> 00:17:46.000 If this plays, 321 00:17:46.000 --> 00:17:49.599 the ribbon will follow the skeletal root, 322 00:17:49.599 --> 00:17:54.079 meaning the effect is going for this root, 323 00:17:54.079 --> 00:17:58.599 which can look unnatural So assign the Socket Name as head, 324 00:17:58.599 --> 00:18:04.119 so the ribbon trail originates from the head 325 00:18:04.119 --> 00:18:07.119 For testing, ensure that 326 00:18:07.119 --> 00:18:10.560 the Velocity module is disabled 327 00:18:10.560 --> 00:18:14.360 So this Ribbon is set 328 00:18:14.360 --> 00:18:16.400 to follow the head 329 00:18:16.400 --> 00:18:19.400 Let's save and play 330 00:18:19.400 --> 00:18:23.479 The ribbon effect will not activate during normal walking 331 00:18:23.479 --> 00:18:25.520 Meaning, the animation 332 00:18:25.520 --> 00:18:30.439 for walking does not enable it properly 333 00:18:30.439 --> 00:18:33.560 but will appear dynamically when the character transitions into running 334 00:18:33.560 --> 00:18:36.239 You can see the trail like so 335 00:18:36.239 --> 00:18:40.479 For the demonstration, 336 00:18:40.479 --> 00:18:45.160 I extended Ribbon from 1 to 3 seconds 337 00:18:45.160 --> 00:18:48.520 It creates a long trail but might appear excessive 338 00:18:48.520 --> 00:18:50.839 Reducing it to 1 second 339 00:18:50.839 --> 00:18:54.489 provides a balanced, concise ribbon trail 340 00:18:54.489 --> 00:18:56.239 as you can see here 341 00:18:56.239 --> 00:18:59.389 Using Notify to create effects 342 00:18:59.389 --> 00:19:00.719 such as footsteps or trails 343 00:19:00.719 --> 00:19:02.959 is not limited to running animations 344 00:19:02.959 --> 00:19:08.040 For instance, when swinging a sword, 345 00:19:08.040 --> 00:19:11.359 you can use the same principle to leave a trail effect 346 00:19:11.359 --> 00:19:15.560 Similarly, at the moment of impact, 347 00:19:15.560 --> 00:19:19.812 you can trigger effects like bursts or debris 348 00:19:19.812 --> 00:19:22.126 at the point of contact, applying the same approach as used for foot 349 00:19:22.513 --> 00:19:26.077 Utilizing the 3D Surface Data of Skeletal Meshes 350 00:19:26.680 --> 00:19:31.880 So far, we’ve focused on spawning particles 351 00:19:31.880 --> 00:19:36.280 and playing them in sync with animation timing 352 00:19:36.280 --> 00:19:39.079 by using skeletal mesh bone data 353 00:19:39.079 --> 00:19:42.160 This time, we will explore how to leverage 354 00:19:42.160 --> 00:19:45.313 the surface data 355 00:19:45.313 --> 00:19:47.400 of skeletal meshes for particle effects 356 00:19:47.400 --> 00:19:50.300 First, create a new Niagara effect 357 00:19:50.300 --> 00:19:52.160 Let's create one 358 00:19:52.160 --> 00:19:53.910 using the basic 359 00:19:53.910 --> 00:19:58.398 Fountain template 360 00:19:58.398 --> 00:20:01.031 and name it FX_SKM 361 00:20:01.031 --> 00:20:04.080 Let's just name it as SKM 362 00:20:04.080 --> 00:20:07.230 Typically, to determine 363 00:20:07.230 --> 00:20:10.560 the particle spawn area, 364 00:20:10.560 --> 00:20:13.320 we used modules like Shape Location 365 00:20:13.320 --> 00:20:15.520 or like static meshes 366 00:20:15.520 --> 00:20:17.920 to target specific 3D objects, 367 00:20:17.920 --> 00:20:19.870 to see where particles 368 00:20:19.870 --> 00:20:22.240 are being created 369 00:20:22.240 --> 00:20:25.790 Similarly, skeletal meshes can provide 370 00:20:25.790 --> 00:20:28.520 location data 371 00:20:28.520 --> 00:20:32.000 to guide particle spawning 372 00:20:32.000 --> 00:20:35.000 For this, use the Skeletal Mesh Location module 373 00:20:35.000 --> 00:20:36.599 Set it up like so 374 00:20:36.599 --> 00:20:40.199 Set the preview mesh 375 00:20:40.199 --> 00:20:42.040 to SKM_Quinn to visualize the effect 376 00:20:42.040 --> 00:20:45.340 Currently, the effect 377 00:20:45.340 --> 00:20:48.080 is influenced by speed, 378 00:20:48.080 --> 00:20:50.759 so the related aspects like velocity, 379 00:20:50.759 --> 00:20:52.119 gravity force, 380 00:20:52.119 --> 00:20:55.680 and drag, causing motion, should be disabled 381 00:20:55.680 --> 00:20:59.280 We can now see 382 00:20:59.280 --> 00:21:02.560 the backbone-like particles 383 00:21:02.560 --> 00:21:03.680 just like so 384 00:21:03.680 --> 00:21:07.000 In the Skeletal Mesh Location module, 385 00:21:07.000 --> 00:21:09.559 there is an option called Mesh Sampling Type, 386 00:21:09.559 --> 00:21:14.440 which is set to Skeleton (Bone) by default 387 00:21:14.440 --> 00:21:17.294 This setting can be switched to use Surface data, 388 00:21:17.294 --> 00:21:21.199 such as Triangles or Vertices, 389 00:21:21.199 --> 00:21:24.480 enabling particle effects to leverage mesh surface details 390 00:21:24.480 --> 00:21:26.930 To better visualize this, reduce the Initialize Particle size 391 00:21:26.930 --> 00:21:30.160 from 6 to smaller values like 1 or 2 392 00:21:30.160 --> 00:21:35.400 and increase the Spawn Rate to around 1500 393 00:21:35.400 --> 00:21:38.879 This adjustment reveals the silhouette 394 00:21:38.879 --> 00:21:42.400 of the preview mesh based on the selected sampling type 395 00:21:42.400 --> 00:21:48.480 Next, ensure that CPU Access for the skeletal mesh is enabled 396 00:21:48.480 --> 00:21:51.440 It's not, so click on Fix Now 397 00:21:51.440 --> 00:21:53.360 to remove the warning message 398 00:21:53.360 --> 00:21:56.800 Once resolved, copy the Skeletal Mesh Location module 399 00:21:56.800 --> 00:21:59.650 and paste it into the Update section 400 00:21:59.650 --> 00:22:02.400 of the Niagara system 401 00:22:02.400 --> 00:22:05.200 So we have this same Skeletal Mesh 402 00:22:05.200 --> 00:22:07.959 also in the Update section like so 403 00:22:07.959 --> 00:22:10.880 Let's now see how to use these 404 00:22:10.880 --> 00:22:13.919 by using a blueprint 405 00:22:13.919 --> 00:22:17.479 to learn about its basic conditions 406 00:22:17.479 --> 00:22:19.479 Right-click, 407 00:22:19.479 --> 00:22:22.399 select Blueprint Class, and generally, 408 00:22:22.399 --> 00:22:25.679 Skeletal mesh is used the most in a character class 409 00:22:25.679 --> 00:22:27.320 Choose Character Class, 410 00:22:27.320 --> 00:22:32.919 name it BP_SKMfx 411 00:22:32.919 --> 00:22:34.600 Double click to open 412 00:22:34.600 --> 00:22:38.119 For a character, we get a capsule like so 413 00:22:38.119 --> 00:22:39.679 See this mesh part? 414 00:22:39.679 --> 00:22:42.080 Inside, add a skeletal mesh component, 415 00:22:42.080 --> 00:22:45.279 the Skeletal Mesh we'll be using 416 00:22:45.279 --> 00:22:50.440 For example, for queen, we can add this asset 417 00:22:50.440 --> 00:22:51.960 Let's place it right 418 00:22:51.960 --> 00:22:53.240 Let's rotate 419 00:22:53.240 --> 00:22:54.600 Set it up like this 420 00:22:54.600 --> 00:22:59.039 Typically, an Animation Blueprint 421 00:22:59.039 --> 00:23:00.559 is assigned 422 00:23:00.559 --> 00:23:02.959 to integrate user inputs, 423 00:23:02.959 --> 00:23:05.880 such as keyboard commands 424 00:23:05.880 --> 00:23:08.119 The blueprint receives user data, 425 00:23:08.119 --> 00:23:10.069 processes it, 426 00:23:10.069 --> 00:23:12.479 and then passes the instructions to the animation blueprint 427 00:23:12.479 --> 00:23:14.279 That's the general design of it 428 00:23:14.279 --> 00:23:17.059 However, since this is an FX tutorial 429 00:23:17.059 --> 00:23:21.520 rather than a Blueprint-focused one, 430 00:23:21.520 --> 00:23:23.199 let's now 431 00:23:23.199 --> 00:23:25.800 set the animation mode not to Blueprint 432 00:23:25.800 --> 00:23:29.800 but to Animation Asset like so 433 00:23:29.800 --> 00:23:31.800 In the Anim to Play field, 434 00:23:31.800 --> 00:23:35.520 search for MF_Run 435 00:23:35.520 --> 00:23:38.919 You get MF_Run_Fwd 436 00:23:38.919 --> 00:23:41.919 Add this animation sequence 437 00:23:41.919 --> 00:23:44.519 Once registered, the specified animation sequence 438 00:23:44.519 --> 00:23:47.240 plays as intended, like so 439 00:23:47.240 --> 00:23:49.960 To incorporate Niagara into this setup, 440 00:23:49.960 --> 00:23:53.453 press the +Add button to include 441 00:23:53.453 --> 00:23:55.479 a Niagara Particle System 442 00:23:55.479 --> 00:23:58.240 as a child of the Mesh component 443 00:23:58.240 --> 00:24:04.179 Assign FX_SKM to the particle system 444 00:24:04.179 --> 00:24:05.399 As shown, 445 00:24:05.399 --> 00:24:09.199 particles now generate on the surface of the mesh 446 00:24:09.199 --> 00:24:12.240 and move in sync 447 00:24:12.240 --> 00:24:15.290 with the character’s animation, 448 00:24:15.290 --> 00:24:17.079 as you can see 449 00:24:17.079 --> 00:24:20.480 If you scroll down to the Rendering section 450 00:24:20.480 --> 00:24:22.160 of the mesh settings 451 00:24:22.160 --> 00:24:24.959 and disable the Visible property, 452 00:24:24.959 --> 00:24:28.428 the mesh will no longer be visible 453 00:24:28.428 --> 00:24:30.359 while the particles continue 454 00:24:30.359 --> 00:24:31.760 to animate in sync with the mesh’s motion 455 00:24:31.760 --> 00:24:34.480 Returning to the Niagara editor, 456 00:24:34.480 --> 00:24:36.200 if you go 457 00:24:36.239 --> 00:24:38.440 under Particle Update 458 00:24:38.440 --> 00:24:41.720 and disable the Skeletal Mesh Location, 459 00:24:41.720 --> 00:24:43.239 as you see, 460 00:24:43.239 --> 00:24:45.920 the preview might not show a significant difference 461 00:24:45.920 --> 00:24:48.320 However, in the Blueprint view, 462 00:24:48.320 --> 00:24:52.079 the particles will only generate momentarily 463 00:24:52.079 --> 00:24:54.519 according to the mesh movement 464 00:24:54.519 --> 00:24:59.040 That way, they fail to fully follow the mesh’s motion 465 00:24:59.040 --> 00:25:02.000 Although setting 466 00:25:02.000 --> 00:25:04.119 a very short Lifetime for the particles, 467 00:25:04.119 --> 00:25:06.920 such as 0.1, might make them 468 00:25:06.920 --> 00:25:08.399 partially visible, 469 00:25:08.399 --> 00:25:09.679 however, 470 00:25:09.679 --> 00:25:12.000 it won’t accurately track the mesh’s movement 471 00:25:12.000 --> 00:25:15.160 To ensure 472 00:25:15.160 --> 00:25:17.760 that the particles follow the mesh consistently, 473 00:25:17.760 --> 00:25:19.679 you must include 474 00:25:19.679 --> 00:25:22.079 the Location module in the update settings 475 00:25:22.079 --> 00:25:24.959 This allows the particle system to continuously receive and update 476 00:25:24.959 --> 00:25:29.640 the mesh’s location information 477 00:25:29.640 --> 00:25:32.200 If you are not satisfied 478 00:25:32.200 --> 00:25:34.079 with the default particle positions 479 00:25:34.079 --> 00:25:37.079 or any of its behavior, 480 00:25:37.079 --> 00:25:40.239 we have Scratch Pad tool 481 00:25:40.239 --> 00:25:42.399 which Niagara provides 482 00:25:42.399 --> 00:25:46.399 for creating custom modules to extend it 483 00:25:46.399 --> 00:25:49.920 To access this feature, navigate to the Update section 484 00:25:49.920 --> 00:25:51.720 and add a new Scratch Pad, 485 00:25:51.720 --> 00:25:55.279 a way to add a new module 486 00:25:55.279 --> 00:25:57.679 This module allows you 487 00:25:57.679 --> 00:26:01.239 to implement your desired functionality 488 00:26:01.239 --> 00:26:03.279 using a visual scripting interface 489 00:26:03.279 --> 00:26:05.320 That's this Scratch Pad 490 00:26:05.320 --> 00:26:08.000 For example, clicking on the System Overview tab 491 00:26:08.000 --> 00:26:10.480 lets you return to the main particle system setup 492 00:26:10.480 --> 00:26:12.760 Additionally, you can double-click 493 00:26:12.760 --> 00:26:15.200 on existing modules 494 00:26:15.200 --> 00:26:16.480 like Skeletal Location 495 00:26:16.480 --> 00:26:20.359 to see the complex node-based scripts they use 496 00:26:20.359 --> 00:26:23.799 to implement the effects 497 00:26:23.799 --> 00:26:26.480 See? The nodes are very complicated 498 00:26:26.480 --> 00:26:28.200 Of course, 499 00:26:28.200 --> 00:26:30.480 we won't be working on something like this today 500 00:26:30.480 --> 00:26:34.480 We'll only use about 5 to 6 nodes 501 00:26:34.480 --> 00:26:35.679 to express something similar 502 00:26:35.679 --> 00:26:40.920 Change the name of ScratchModule of Niagara 503 00:26:40.920 --> 00:26:44.320 Rename, and VoxelModule 504 00:26:44.320 --> 00:26:46.239 That's the new name 505 00:26:46.239 --> 00:26:49.519 VoxelModule, and double-click on it 506 00:26:49.519 --> 00:26:51.839 The Scratch Pad in Niagara 507 00:26:51.839 --> 00:26:56.640 consists of four main components, 508 00:26:56.640 --> 00:27:00.320 InputMap, Map Get, Map Set, and Output 509 00:27:00.320 --> 00:27:03.880 The white arrow-looking icons 510 00:27:03.880 --> 00:27:06.200 mean the order of activation 511 00:27:06.200 --> 00:27:11.519 So they're receiving the information from Map Get, 512 00:27:11.519 --> 00:27:17.200 such as information on the mesh or the color 513 00:27:17.200 --> 00:27:19.600 And other various types of information 514 00:27:19.600 --> 00:27:22.440 collected by Niagara 515 00:27:22.440 --> 00:27:27.679 are processed by layering new data 516 00:27:27.679 --> 00:27:30.429 onto the existing particle information using Map Set, 517 00:27:30.429 --> 00:27:32.239 enabling customization 518 00:27:32.239 --> 00:27:35.880 The InputMap and Output Module are pre-configured, 519 00:27:35.880 --> 00:27:40.200 so you don’t need to worry about them much 520 00:27:40.200 --> 00:27:43.160 Instead, focus on deciding 521 00:27:43.160 --> 00:27:45.359 what information you want 522 00:27:45.359 --> 00:27:48.399 to retrieve and how to apply it 523 00:27:48.399 --> 00:27:51.440 To create a voxel format, 524 00:27:51.440 --> 00:27:54.640 a voxel is essentially 525 00:27:54.640 --> 00:27:57.399 a cube-like structure, 526 00:27:57.399 --> 00:28:00.640 or grid-like sections, 527 00:28:00.640 --> 00:28:05.239 that divides a 3D space into uniform 528 00:28:05.239 --> 00:28:07.000 That's what Voxel is 529 00:28:07.000 --> 00:28:10.000 For that, you need to utilize 530 00:28:10.000 --> 00:28:12.399 the position values of existing particles 531 00:28:12.399 --> 00:28:15.679 Start by selecting Map Get 532 00:28:15.679 --> 00:28:19.079 and searching for Particle Position 533 00:28:19.079 --> 00:28:21.429 And to put them 534 00:28:21.429 --> 00:28:23.880 in a sequence within Particle Position, 535 00:28:23.880 --> 00:28:28.559 add a new Float by pressing the + button for the spacing 536 00:28:28.559 --> 00:28:33.320 Name this float as grid or gridsize 537 00:28:33.320 --> 00:28:35.679 These two pieces of information 538 00:28:35.679 --> 00:28:41.200 will allow you to arrange particles 539 00:28:41.200 --> 00:28:42.320 at regular intervals 540 00:28:42.320 --> 00:28:45.280 Once you’ve retrieved the position data, 541 00:28:45.280 --> 00:28:50.239 you must convert it into a vector format for easier processing 542 00:28:50.239 --> 00:28:52.639 Use the Transform Vector node 543 00:28:52.639 --> 00:28:53.919 for this processing 544 00:28:53.919 --> 00:28:56.559 By selecting Transform Vector, 545 00:28:56.559 --> 00:29:00.640 you automatically generate a node 546 00:29:00.640 --> 00:29:04.200 that converts the position data into an XYZ vector format 547 00:29:04.200 --> 00:29:07.200 The default settings for Source and Destination spaces 548 00:29:07.200 --> 00:29:10.719 should be left as World and Simulation, respectively 549 00:29:10.719 --> 00:29:12.280 Let's leave them be 550 00:29:12.280 --> 00:29:14.430 And then, 551 00:29:14.430 --> 00:29:17.799 bext, extract the output vector pin 552 00:29:17.799 --> 00:29:21.400 and connect it to a Divide or Slash, 553 00:29:21.400 --> 00:29:23.119 to divide them 554 00:29:23.119 --> 00:29:27.080 By dividing the current particle position by the gridsize, 555 00:29:27.080 --> 00:29:30.440 let's clean up the screen a bit 556 00:29:30.440 --> 00:29:34.840 Divide the particle’s position by gridsize 557 00:29:34.840 --> 00:29:36.760 and round it up 558 00:29:36.760 --> 00:29:40.520 by using Round 559 00:29:40.520 --> 00:29:43.119 Finally, once again, 560 00:29:43.119 --> 00:29:46.080 take the rounded result and use the Multiply function 561 00:29:46.080 --> 00:29:49.559 to multiply it by the gridsize once more 562 00:29:49.559 --> 00:29:54.719 This result, go to Map Set node, click on the plus button 563 00:29:54.719 --> 00:29:58.599 Search again for Particle Position 564 00:29:58.599 --> 00:30:01.520 add the Particle Position field, 565 00:30:01.520 --> 00:30:07.200 and connect the final multiplied result to it 566 00:30:07.200 --> 00:30:10.760 This completes the basic setup. 567 00:30:10.760 --> 00:30:12.320 Click Apply 568 00:30:12.320 --> 00:30:15.760 The particles now appear as points instead of following 569 00:30:15.760 --> 00:30:17.679 the original mesh shape 570 00:30:17.679 --> 00:30:20.559 This is because the default value of gridsize 571 00:30:20.559 --> 00:30:22.760 is currently set to 0 572 00:30:22.760 --> 00:30:26.080 In the System Overview, locate the VoxelModule, 573 00:30:26.080 --> 00:30:28.799 which contains the gridsize parameter 574 00:30:28.799 --> 00:30:32.320 Set this parameter to 8 575 00:30:32.320 --> 00:30:34.400 Next, go to Initial Particle 576 00:30:34.400 --> 00:30:39.159 and adjust the Lifetime to 1 second to ensure particles persist longer 577 00:30:39.159 --> 00:30:43.320 Now, you’ll notice that the particle positions 578 00:30:43.320 --> 00:30:45.719 are now aligned uniformly 579 00:30:45.719 --> 00:30:48.080 To explain the logic briefly, 580 00:30:48.080 --> 00:30:52.760 imagine dividing a grid into discrete sections, 581 00:30:52.760 --> 00:30:56.119 like the grid you're seeing here, 582 00:30:56.119 --> 00:30:59.200 like this, 1, 2, 3, 583 00:30:59.200 --> 00:31:01.359 If a particle’s position, for example, 584 00:31:01.359 --> 00:31:03.239 is at 0.6, 585 00:31:03.239 --> 00:31:05.960 divide it by gridsize of 3, 586 00:31:05.960 --> 00:31:10.039 then multiply it back by gridsize of 3 587 00:31:10.039 --> 00:31:14.760 That's multiplied to the rounded result 588 00:31:14.760 --> 00:31:17.359 So this is the expression 589 00:31:17.359 --> 00:31:22.919 The position divided by 3, rounded, then multiplied by 3 590 00:31:22.919 --> 00:31:26.080 So dividing 0.6 by 3 591 00:31:26.080 --> 00:31:28.880 equals to around 0.2, 592 00:31:28.880 --> 00:31:32.640 which is rounded as 0 593 00:31:32.640 --> 00:31:36.520 If it's rounded up, 0.2 by 3 is still 0 594 00:31:36.520 --> 00:31:40.880 So the point that should be at 0.6 595 00:31:40.880 --> 00:31:44.840 is instead now at 0 596 00:31:44.840 --> 00:31:49.040 Similarly, if a particle is at 1.8, 597 00:31:49.040 --> 00:31:51.280 dividing by 3 yields 0.6 598 00:31:51.280 --> 00:31:55.679 It yields 0.6, and let's round it 599 00:31:55.679 --> 00:31:57.559 Rounding it up 600 00:31:57.559 --> 00:32:01.359 results in 1, which is multiplied by 3 601 00:32:01.359 --> 00:32:03.119 So that's now at 3 602 00:32:03.119 --> 00:32:05.019 So the point that should be here 603 00:32:05.019 --> 00:32:08.080 is now instead at an integer position, 604 00:32:08.080 --> 00:32:12.320 like this, at an interval of integer positions 605 00:32:12.320 --> 00:32:14.479 The points are now all there 606 00:32:14.479 --> 00:32:18.080 The Sprite Renderer here 607 00:32:18.080 --> 00:32:19.730 will make the shape 608 00:32:19.730 --> 00:32:21.799 less like Voxel, 609 00:32:21.799 --> 00:32:23.880 so let's disable Sprite Renderer 610 00:32:23.880 --> 00:32:25.960 Instead, click on the plus button under the rendering section 611 00:32:25.960 --> 00:32:29.080 to add a Mesh Renderer 612 00:32:29.080 --> 00:32:32.640 In the Meshes field of the Mesh Renderer, 613 00:32:32.640 --> 00:32:36.000 assign a basic cube asset 614 00:32:36.000 --> 00:32:38.760 The first one we see 615 00:32:38.760 --> 00:32:42.640 is the one in the yellow VR Editor, 616 00:32:42.640 --> 00:32:46.200 which is Cube_01 617 00:32:46.200 --> 00:32:48.520 After compiling, 618 00:32:48.520 --> 00:32:50.000 the system will generate cubes representing the particles 619 00:32:50.000 --> 00:32:52.440 Adjust the size later if necessary 620 00:32:52.440 --> 00:32:55.679 The cubes might initially 621 00:32:55.679 --> 00:32:58.400 appear randomly oriented 622 00:32:58.400 --> 00:33:03.080 To fix this, enable Lock Axis in the renderer settings 623 00:33:03.080 --> 00:33:07.680 and lock the axes as X-axis to 1, Z-axis to 0, 624 00:33:07.680 --> 00:33:10.599 and Y-axis to 0 625 00:33:10.599 --> 00:33:13.479 Fix the axes like this 626 00:33:13.479 --> 00:33:15.479 Under the Skeletal Mesh section, 627 00:33:15.479 --> 00:33:18.880 check the Orientation Sampling field and confirm that it is set to Apply 628 00:33:18.880 --> 00:33:22.119 This may look random to our eyes 629 00:33:22.119 --> 00:33:24.760 But it's actually working with the 3D surface 630 00:33:24.760 --> 00:33:27.799 The 3D surface of the Skeletal Mesh 631 00:33:27.799 --> 00:33:30.799 can align the particles 632 00:33:30.799 --> 00:33:32.760 according to the surface’s orientation, 633 00:33:32.760 --> 00:33:35.559 doing something like this 634 00:33:35.559 --> 00:33:39.320 Like this, not using the 3D surface as the standard 635 00:33:39.320 --> 00:33:43.080 but the direction that we set Lock to 636 00:33:43.080 --> 00:33:47.400 Change the Orientation Sampling setting to Output 637 00:33:47.400 --> 00:33:49.960 Same with Update, 638 00:33:49.960 --> 00:33:53.799 Change the Orientation Sampling setting to Output 639 00:33:53.799 --> 00:33:56.999 Now the sizes are equal, 640 00:33:56.999 --> 00:33:59.159 in equal-sized grids 641 00:33:59.159 --> 00:34:02.440 Each part is very big, 642 00:34:02.440 --> 00:34:04.000 so they're all overlapping on each other 643 00:34:04.000 --> 00:34:05.919 Go to Initialize Particle, 644 00:34:05.919 --> 00:34:08.440 set Mesh Scale Mode to Uniform 645 00:34:08.440 --> 00:34:11.799 Now, drag the size to decrease 646 00:34:11.799 --> 00:34:15.119 Now we see a uniform 647 00:34:15.119 --> 00:34:17.369 shape and interval 648 00:34:17.369 --> 00:34:19.440 between each pair of cubes 649 00:34:19.440 --> 00:34:22.359 Let's go see it in our Blueprint 650 00:34:22.359 --> 00:34:23.400 This is what we have 651 00:34:23.400 --> 00:34:26.840 It's like cubes in an animation 652 00:34:26.840 --> 00:34:28.599 That's how we see it 653 00:34:28.599 --> 00:34:31.880 But, with the grid size, 654 00:34:31.880 --> 00:34:35.119 what if we don't like 655 00:34:35.119 --> 00:34:37.400 the grid interval that we have now? 656 00:34:37.400 --> 00:34:39.880 Let's go to VoxelModule 657 00:34:39.880 --> 00:34:41.799 and change gridsize to 5 658 00:34:41.799 --> 00:34:43.400 It'll overlap again 659 00:34:43.400 --> 00:34:45.200 With 10, 660 00:34:45.200 --> 00:34:47.080 the interval is bigger 661 00:34:47.080 --> 00:34:49.599 due to the equal sized cubes 662 00:34:49.599 --> 00:34:52.119 So should we go with changing gridsize, 663 00:34:52.119 --> 00:34:54.039 and keep changing the size, 664 00:34:54.039 --> 00:34:56.599 and now this size? That's too much work 665 00:34:56.599 --> 00:34:58.520 So let's go to User Parameter 666 00:34:58.520 --> 00:35:01.200 and add a parameter here 667 00:35:01.200 --> 00:35:04.599 Make New, Common, float 668 00:35:04.599 --> 00:35:07.119 Here, the grid name 669 00:35:07.119 --> 00:35:10.320 is UserGrid 670 00:35:10.320 --> 00:35:12.320 Go to gridsize, 671 00:35:12.320 --> 00:35:14.440 click on the arrow pointing downdard 672 00:35:14.440 --> 00:35:17.679 Search for UserGrid 673 00:35:17.679 --> 00:35:20.880 Now you can use the one 674 00:35:20.880 --> 00:35:22.440 that we made in User Parameters 675 00:35:22.440 --> 00:35:24.840 Now, if we type in 676 00:35:24.840 --> 00:35:28.080 either 5 or 10 to UserGrid, 677 00:35:28.080 --> 00:35:30.799 since everything is synched, 678 00:35:30.799 --> 00:35:31.960 it all changes accordingly 679 00:35:31.960 --> 00:35:35.640 Let's sync the same thing 680 00:35:35.640 --> 00:35:37.440 to Initialize Particle 681 00:35:37.440 --> 00:35:40.880 This requires an additional work 682 00:35:40.880 --> 00:35:43.320 So, at Initialize Particle, 683 00:35:43.320 --> 00:35:46.000 we changed it using Mesh Scale Mode 684 00:35:46.000 --> 00:35:49.359 We used to add in values like 0.12, 685 00:35:49.359 --> 00:35:51.520 and now at Uniform Scale, 686 00:35:51.520 --> 00:35:53.960 click on the arrow pointing downward 687 00:35:53.960 --> 00:35:56.159 and go to New Expression 688 00:35:56.159 --> 00:35:59.119 This is similar to Scratch Pad 689 00:35:59.119 --> 00:36:00.599 It's not a complex node 690 00:36:00.599 --> 00:36:05.080 You type in the command like this 691 00:36:05.080 --> 00:36:07.159 This is how you use it 692 00:36:07.159 --> 00:36:08.400 Type it yourself 693 00:36:08.400 --> 00:36:11.799 The user here means this user, 694 00:36:11.799 --> 00:36:13.840 as we see user in User Parameters 695 00:36:13.840 --> 00:36:17.719 Of all parameters that the user has, 696 00:36:17.719 --> 00:36:21.440 this will receive UserGrid 697 00:36:21.440 --> 00:36:22.479 That's what this means 698 00:36:22.479 --> 00:36:26.719 Now press Enter for this to work 699 00:36:26.719 --> 00:36:29.320 UserGrid, this gets the value of it 700 00:36:29.320 --> 00:36:31.640 So type in 10 701 00:36:31.640 --> 00:36:34.520 Then it's 10x the original size 702 00:36:34.520 --> 00:36:38.840 It's 10x bigger than the original cube 703 00:36:38.840 --> 00:36:41.359 Then the cube size matters 704 00:36:41.359 --> 00:36:43.280 Go to Mesh Renderer 705 00:36:43.280 --> 00:36:45.320 and double-click on teh cube 706 00:36:45.320 --> 00:36:47.540 The Approx Size of the cube 707 00:36:47.540 --> 00:36:50.320 is 49x49 708 00:36:50.320 --> 00:36:52.840 Let's just say 50 709 00:36:52.840 --> 00:36:56.039 Then 10 times 50cm 710 00:36:56.039 --> 00:36:58.320 is a cube with 5m long sides 711 00:36:58.320 --> 00:37:00.960 So go to Initialize Particle 712 00:37:00.960 --> 00:37:03.510 Now, to the cube's size, 713 00:37:03.510 --> 00:37:05.520 divide it by 50 714 00:37:05.520 --> 00:37:08.160 That's how we get 715 00:37:08.160 --> 00:37:12.239 the Voxel with no gaps in between 716 00:37:12.239 --> 00:37:14.439 Even if we reduce the size, 717 00:37:14.439 --> 00:37:18.319 we still do not see any gaps 718 00:37:18.319 --> 00:37:21.119 You can go to Skeletal Mesh 719 00:37:21.119 --> 00:37:24.640 And you can still see the animation 720 00:37:24.640 --> 00:37:28.280 of the character with the size we adjusted 721 00:37:28.280 --> 00:37:31.239 I'm using the Run image now, 722 00:37:31.239 --> 00:37:33.040 but it's not just Run 723 00:37:33.040 --> 00:37:35.959 You can use any animation clip to this Mesh 724 00:37:35.959 --> 00:37:39.479 Let's say Idle, and it still stays this way 725 00:37:39.479 --> 00:37:44.839 With Walk, it also has that walking animation 726 00:37:44.839 --> 00:37:46.539 retaining the Voxel action 727 00:37:46.539 --> 00:37:48.719 along with the mesh surface 728 00:37:48.719 --> 00:37:52.119 Like so, in Niagara, 729 00:37:52.119 --> 00:37:56.599 beyond the basic provided modules, 730 00:37:56.599 --> 00:38:01.319 you can utilize tools like Scratch Pads or expressions 731 00:38:01.319 --> 00:38:04.169 to manipulate 732 00:38:04.169 --> 00:38:06.640 and customize effects according to your needs 733 00:38:06.640 --> 00:38:08.000 Before we conclude, 734 00:38:08.000 --> 00:38:10.160 as you see right now, 735 00:38:10.160 --> 00:38:13.880 the flickering and shifting of the cubes or voxels 736 00:38:13.880 --> 00:38:17.640 may become visually distracting 737 00:38:17.640 --> 00:38:20.640 This occurs because particles are continuously 738 00:38:20.640 --> 00:38:23.280 spawning and disappearing, 739 00:38:23.280 --> 00:38:24.680 leading to random positioning 740 00:38:24.680 --> 00:38:29.280 To resolve this, adjust the Emitter State 741 00:38:29.280 --> 00:38:32.319 so that the emitter only runs once 742 00:38:32.319 --> 00:38:35.771 Over time, the particles will gradually fade out 743 00:38:35.771 --> 00:38:39.640 Alternatively, instead the Rate value, you can switch to a Burst setting 744 00:38:39.640 --> 00:38:43.439 Configure it to spawn 1,000 particles 745 00:38:43.439 --> 00:38:46.880 That's a setting you could have 746 00:38:46.880 --> 00:38:49.640 This change ensures that the particles spawn all at once and disappear in unison 747 00:38:49.640 --> 00:38:54.199 To prevent particles from disappearing, 748 00:38:54.199 --> 00:38:58.199 you can disable the Particle Kill functionality 749 00:38:58.199 --> 00:39:00.800 in the particle state settings 750 00:39:00.800 --> 00:39:05.560 Regardless of their lifetime value set in the Initialize Particle section, 751 00:39:05.560 --> 00:39:10.439 disabling the Kill state 752 00:39:10.439 --> 00:39:14.119 ensures that generated particles are maintained consistently 753 00:39:14.119 --> 00:39:16.000 This allows you 754 00:39:16.000 --> 00:39:20.640 to keep the particle count steady 755 00:39:20.640 --> 00:39:23.119 It also avoids 756 00:39:23.119 --> 00:39:26.579 flickering or disappearing effects 757 00:39:26.579 --> 00:39:29.719 This allows you to keep the particle count steady at a visually pleasing density 758 00:39:29.719 --> 00:39:31.839 With a grid size of 5, 759 00:39:31.839 --> 00:39:35.439 you can generate 1,000 or 2,000 particles 760 00:39:35.439 --> 00:39:38.680 and adjust until satisfied with the effect 761 00:39:38.680 --> 00:39:41.439 To further refine this, you can use a New Expression 762 00:39:41.439 --> 00:39:46.280 Set the parameter as User.UserGrid 763 00:39:46.280 --> 00:39:50.640 We used to set UserGrid as big as 764 00:39:50.640 --> 00:39:51.920 UserGrid divided by the cube 765 00:39:51.920 --> 00:39:54.119 But now let's divide first 766 00:39:54.119 --> 00:39:59.520 So let's do 10000/UserGrid 767 00:39:59.520 --> 00:40:01.479 10000 is a random number 768 00:40:01.479 --> 00:40:04.400 Press Enter, and we get 10000 divided by 5 769 00:40:04.400 --> 00:40:06.119 which equals to 2,000 770 00:40:06.119 --> 00:40:10.920 Naturally, as the grid size increases, 771 00:40:10.920 --> 00:40:13.880 the number of particles decreases, 772 00:40:13.880 --> 00:40:16.959 and conversely, as the grid size decreases, 773 00:40:16.959 --> 00:40:20.880 the particle count increases 774 00:40:20.880 --> 00:40:22.920 You don't need to use 10000 775 00:40:22.920 --> 00:40:26.680 You could use 20000, 30000, 776 00:40:26.680 --> 00:40:28.560 or any random number 777 00:40:28.560 --> 00:40:31.079 This allows you to control 778 00:40:31.079 --> 00:40:35.680 the density of particles more freely 779 00:40:35.680 --> 00:40:37.280 by adjusting the grid size 780 00:40:37.280 --> 00:40:41.000 By linking related parameters, 781 00:40:41.000 --> 00:40:43.880 such as the spawn count to the user-defined grid size, 782 00:40:43.880 --> 00:40:47.959 the Voxel spacing to the grid size, 783 00:40:47.959 --> 00:40:51.239 and even the particle size to the grid size, 784 00:40:51.239 --> 00:40:54.520 you can create a streamlined setup 785 00:40:54.520 --> 00:40:58.079 This enables you to control all aspects of the particle system 786 00:40:58.079 --> 00:41:00.119 using just one or two key variables 787 00:41:00.119 --> 00:41:02.959 That concludes this lecture 788 00:41:02.959 --> 00:41:05.745 on Niagara Effect along with Skeletal Meshes 789 00:41:07.359 --> 00:41:10.680 In this session, we explored particle techniques 790 00:41:10.680 --> 00:41:13.839 using skeletal meshes 791 00:41:13.839 --> 00:41:17.000 Unlike traditional particles 792 00:41:17.000 --> 00:41:19.520 that are controlled from static positions, 793 00:41:19.520 --> 00:41:22.839 as they use the mesh as the base for their effects, 794 00:41:22.839 --> 00:41:26.760 they required consideration of many additional factors 795 00:41:26.760 --> 00:41:30.479 Beyond configuring Niagara, we also had 796 00:41:30.479 --> 00:41:34.119 to account for the setup of components within Blueprints 797 00:41:34.119 --> 00:41:37.239 Thus, working with skeletal meshes for particle creation 798 00:41:37.239 --> 00:41:41.640 involve a significant amount of pre-planning 799 00:41:41.640 --> 00:41:44.640 However, if used effectively, 800 00:41:44.640 --> 00:41:48.980 skeletal mesh-based particles can create highly dynamic effects 801 00:41:48.980 --> 00:41:52.719 that go beyond those achievable with Niagara alone 802 00:41:52.719 --> 00:41:56.560 I encourage you to explore these techniques further 803 00:41:56.560 --> 00:41:59.710 This concludes 804 00:41:59.710 --> 00:42:01.084 the Unreal Engine effects lecture 805 00:42:01.084 --> 00:42:02.084 Thank you 806 00:42:02.760 --> 00:42:03.723 Skeletal Mesh-Based Particle Effects Navigate to Content, Characters, Mannequins, Meshes and select the SK_Mannequin asset 807 00:42:03.723 --> 00:42:04.766 In the viewport, select Character, Bones, All Hierarchy 808 00:42:04.766 --> 00:42:05.759 In Niagara, start with the Fountain template and name it FX_FootStep Disable Shape Location and Gravity Force 809 00:42:05.759 --> 00:42:06.844 Set Emitter State, Loop Behavior to Once and Loop Duration to 0.2 810 00:42:06.844 --> 00:42:07.842 In Initialize Particle, set Lifetime min to 0.2 and max to 0.3 811 00:42:07.842 --> 00:42:08.342 Animation Sequence In the viewport, select the animation sequence icon and double-click MF_Run_Fwd in the asset browser 812 00:42:08.342 --> 00:42:09.077 In the timeline, add a Notify Track named step At foot contact times, right-click and add Notify, Play Niagara Particle 813 00:42:09.077 --> 00:42:09.679 Set Niagara System to FX_FootStep For left foot: Rotation Offset: X -90, SocketName: ball_l 814 00:42:09.679 --> 00:42:10.272 For right foot: Rotation Offset: X 90, SocketName: ball_r FX_Ribbon Creation 815 00:42:10.272 --> 00:42:10.868 Use the Dynamic Beam template in Niagara and name it FX_Ribbon Disable Beam Emitter Setup, Spawn Burst, Spawn Beam, Beam Width, and Update Beam 816 00:42:10.868 --> 00:42:11.554 Add a Spawn Rate module, set Spawn rate to 10 In Initialize Particle, set Lifetime to 3, Ribbon Width Mode to Direct Set, and Ribbon Width to 5 817 00:42:11.554 --> 00:42:12.206 In the timeline, add a Notify Track named Ribbon, set Socket Name to head, and play FX_Ribbon 818 00:42:12.206 --> 00:42:12.703 Right-click, select Add Notify, Play Niagara Particle, and set the Socket Name to head 819 00:42:12.703 --> 00:42:13.603 Using Skeletal Mesh for 3D Surface Data Create FX_SKM using the Niagara system with the Fountain template and name it FX_SKM 820 00:42:13.603 --> 00:42:14.403 Add Skeletal Mesh Location, resolve CPU Access errors by clicking Fix Now Preview: SKM_Quinn Mesh Sampling Type: 821 00:42:14.403 --> 00:42:15.203 Surface(Triangles), Spawn Rate: 1500 Copy Skeletal Mesh Location, Paste in Particle Update 822 00:42:15.203 --> 00:42:16.053 Creating FX_FootStep Blueprint Choose Character Class in the Blueprint Class, name it BP_SKMfx Set the Mesh Component Animation Mode 823 00:42:16.053 --> 00:42:16.903 to Use Animations Asset, assign Anim to Play to MF_Run_Fwd, and the Skeletal Mesh Asset to SKM_Quinn Disable Visible in Mesh settings 824 00:42:16.903 --> 00:42:17.719 Add a Niagara component and assign the Niagara System Asset to FX_SKM 825 00:42:17.719 --> 00:42:18.219 Creating the FX_SKM Module In Particle Update, add a New Scratch Pad Module and rename it VoxelModule 826 00:42:18.219 --> 00:42:18.719 In the Map Get node, click [+] to add Particle Position. Add a float named gridsize From the Particle Position output pin, add a Transform Vector 827 00:42:18.719 --> 00:42:19.219 Add a Map Set node, click [+] to add Particle Position Compute (Round(Transform Vector / gridsize) * gridsize) 828 00:42:19.219 --> 00:42:19.719 and connect the result to Map Set > Particle Position Disable the Sprite Renderer module and add a Mesh Renderer module Set Meshes[0] to SM_Cube_01 829 00:42:19.719 --> 00:42:20.219 Enable Lock Axis and set its values to (1, 0, 0) Set Orientation Sampling in both Skeletal Mesh Location modules to Output 830 00:42:20.219 --> 00:42:20.719 Add a UserParameter by clicking [+], select Make New > Common > float, and name it UserGrid For Mesh Uniform Scale, 831 00:42:20.719 --> 00:42:21.307 click the down arrow and select New Expression, input (User.UserGrid / 50) In Particle State, disable Kill Particles When Lifetime 832 00:42:21.307 --> 00:42:21.891 Disable Spawn Rate and add Spawn Burst For Spawn Count, click the down arrow, select New Expression, 833 00:42:21.891 --> 00:42:22.630 and input (10000 / User.UserGrid)