Realistic
Realistic Intergrated Niagara System Control
Hi, I am Park Hyun Sang
Today, we will learn about controlling the Niagara System
Effects create changes during content execution
When linked with the system, it can utilize various graphics and interact with external variables
They can be used in conjunction with Blueprints, 3D mesh data
or controlled directly in Niagara through materials
Dynamic Material for Controlling Material Effects
Go to the Props folder in the Start Content section
Open the Materials folder inside
Since we will use a chair, drag and copy
the material labeled M_Chair into the VFX folder
So the material in the Props folder
has been copied to the VFX folder
To avoid naming conflicts,
rename the material to Chair_Dissolve
Open the renamed material
and we will modify this material on our chair
to create a dissolve effect
First, let's select the area
so that the nodes
can fit in here
Check the master node now
For its opacity
we need to adjust its transparency
For this, change the blend mode
from Opaque to Masked
activating the Opacity Mask property
By default, the Opacity Mask is visible even when 0.5 is entered
It does not support partial transparency
For instance, entering 0 will make the object invisible
while entering 0.3 also results in invisibility
It's either fully visible or fully invisible
so either 0 or 1
as the Masked mode only recognizes binary visibility
We will control this Masked effect
dynamically through the Niagara System
To allow Niagara to input values directly into the material
create a Dynamic Parameter node
his node appears to control color at first glance
but it provides four slots
for inputting float values or decimal numbers
So we have four parameters
We will use these four parameters
to control the dissolve effect
First, assign names to each parameter
and set their default values
Name the first parameter Noise Scale
the second Dissolve Value
the third Dissolve Edge
and the fourth Emissive Power
In this example, these names
are predefined for convenience
However, in real-world scenarios
these names are often assigned later
as the effect develops and requirements arise
We don’t typically start off with specific name
As we work on the effects, we gather the things we need
and that’s when the naming often happens later on
Let's work with this much
Now, in the default values
the Red parameter is linked to slot 0
Green is slot 1, Blue is slot 2, and Alpha is slot 3
The parameters are connected like so
For Red, we’ll input 0.01
Green, let’s go with 0.5, blue will be 0.2, and for Alpha, we’ll set it to 8
With these settings
for the Noise Scale parameter
the value that gets output for Red is 0.01
You don’t really need to worry about the actual colors
in these default values
These aren’t being used to create colors
Now, if we want the image to dissolve naturally
we’ll need to apply some noise
The usual node for generating noise
in a material is called the Noise node
this node takes a position value
so we’ll grab the World Position
It comes up as Absolute Position
Now, we’re going to multiply the position value
with 0.01
Calculate the position value with 0.01
and feed it into the World Position input
Let’s connect this to the Opacity Mask
What happens is
it looks like parts are torn away
with some areas visible
either that or others transparent
Let’s temporarily disconnect this from the Base Color node
and instead connect it to the Base Color
Now you can see the noise pattern
applied as an image
The white areas are visible
and black areas are transparent
That's how it works
If we don’t adjust the scale before applying this
the noise will appear extremely fine
But if we zoom in
you can see these tiny noise patterns
This is because it’s applied based on the World Unit scale
To make the noise pattern bigger
we multiplied the unit by 0.01 earlier
Another way to use noise
aside from the Noise node, is to utilize textures
Let’s create a Texture Sample
and search for Noise in the texture options
here are plenty of noise textures available
For this example
I’ll select Offset Noise Distance Field
and connect
this noise to the Base Color here
As you can see, the noise pattern is applied here
Most noise textures are tiled
so we can use Texture Coordinates to control the tiling
You could set it to repeat three times horizontally and vertically
By connecting this to the UV input
you can create finer
or larger patterns
The UV values in this texture sample are influenced by
how the UVs of a 3D object
are unwrapped from the polygon into a flat surface
If you apply this directly to opacity
it will depend on how the UV is unwrapped
This is commonly referred to as a seam
These seams are
the boundaries where polygons are separated
like the edges of UVs that don’t connect
If we unwrap the UV of a cube
we can lay it out in a traditional unfolded shape
Just like this
or separate all six sides individually
These disconnected areas
are what we call seams
Because of these seams, patterns may not appear continuous
which can make the object look messy
To avoid this
we use noise textures
also called noise nodes
Noise nodes, as you can see here
are based on the world position values, allowing us
to apply effects cleanly without being affected by UV seams
Now, let’s clean up unnecessary effects
remove the textures
and reconnect the base color to restore the original appearance
Using this noise value
we’ll create an additional dissolve effect
First, we use a Step node
By connecting the noise value
to X and the dissolve value
to Y, we can create a step effect
Like this
When we connect this to the alpha opacity mask
the green channel
Dissolve value, index 01
Lower the value increases the visible area
Let's lower it by a lot
It eventually shows more of the object
Raising the value for the green channel
so much that it is now over 1
eventually hides most of the object
You can see how the value is getting adjusted
This demonstrates how the dissolve value
can control visible and invisible areas through the Step node
Next, we’ll duplicate the Step node with Ctrl-C and Ctrl-V
To the dissolve value, we’ll add
the dissolve edge value
of 0.2, which we set earlier
Connect it to the Y input of the copied Step node
leaving the noise connection the same
Then, we use a Subtract node
Subtract
Let’s label the dissolve value Step output
as a
Let's just call it an a
And the dissolve value with the edge added
Let's call it as b
By subtracting a from b
the result is
that we highlight the boundary of the noise pattern
The Step node operates by transitioning from black to white
or by converting gradients
We have this grey for the smooth gradient
but now we will set a standard
For example, if the input is less than 0.5, it outputs 0
If it’s greater than 0.5, it outputs 1
That's what the Step node does
This means areas with a value of 1 are visible
and areas with 0 are invisible
If we set the dissolve value to 0.5
visibility will be determined by
whether the value is above or below that that threshold
Then we add the edge value
the edge value of 0.2
represented by a red line
It reduces the overall visible area
The red area here is b
When applied to a single mesh with a noise pattern
the green is a
and the red is b
These regions appear differently, as you can see
and when we subtract a from b
only the orange part remains visible
Using this principle, we’ve created an edge
and now, we can determine the dissolve color
using a vector parameter node
named Emissive Color
Let’s set this to red for now
Next, we multiply the Emissive Power value
and the result from the Subtractive node
then connect this to the Emissive Color
When you check the result
you’ll see the edge area now has a glowing effect
If we connect the a region
back to the opacity mask
the area visible after subtracting the red b region
Let me mark it in green
This is a region
the green, the a region
We subtracted the red, b, from the green, a
So that results in that natural-looking
glowing boundary like so
With that, we’ve created the dissolve material
Let’s save this
and turn it into a material instance
By creating an instance
you’ll be able to adjust
parameter values later
or change colors
or things like that
like turning the Emissive Color green
or adding blue
You could do all that
We created the instance to allow for more variations
Now, the next step is
to use Niagara for this dynamic parameter
to dynamically control these parameters
The material is ready
so let’s create a Niagara asset
In the content browser, right-click
and select Niagara System
This time, we’ll use a template
Among the available templates
Blowing Particles generates particles that move beautifully
Let’s select it and click the Create button
We’ll name the Niagara system FX_Chair Dissolve
With that, we’ve created the system that includes an emitter
from the Blowing Particles template we selected earlier
Normally, we’d delete unnecessary modules
but in this case
I’ll simply disable them so you can see
what’s been removed while we proceed
Let’s deactivate the Shape Location under the Particle Spawn section
Then, let’s also turn off the Gravity Force
The petal-like effects that were previously falling downward
now appear to be floating sideways
Under the Particle Spawn section, click the plus button
to add the StaticMesh Location module
Set the Preview Mesh field of StaticMesh Location
to sm_chair, and we see a warning pop up
This means that one of the options in this Static Mesh
specifically the CPU Access option, is currently disabled
which is causing an issue
You can simply click the Fix Now button to resolve it
Now, let’s temporarily turn off the Initial Mesh Orientation
Also, let’s disable other modules like Wind Force for now
Here's what StaticMesh Orientation that we added does
You can already see the shape of the chair
It might have been hard to discern with the movement
but you can now see that StaticMesh Location
can use the Mesh itself as the particle
This allows particles to form naturally
around the shape of the chair
and then disappear accordingly
From here, let’s start modifying the Emitter step by step
Currently, the Emitter is set to run infinitely
continuously operating 24/7
We’re going to adjust this so that it runs only once
And since it won’t loop, we’ll set it to operate for just 5 seconds
Next, let’s increase the Spawn Rate of 15
We’ll adjust it to generate 100 particles per second
The Lifetime at the Initialize Particle section is 12 seconds, which is very long
We’ll shorten this to a range between
3 and 5 seconds
allowing the particles to disappear much faster
For the starting color
we had previously set the material’s Red
The color value to RGB, Red, Green 0, and Blue 0
We multiplied this by 8
This corresponds to the Emissive Power value
of 8 for the alpha channel in the Dynamic Parameter
So Red is 8
creating a brightly glowing red color
To achieve a similar effect
we’ll set Red as 8, Green as 1, and Blue as 0.2
This results in a more nuanced color
not entirely pure red but leaning strongly towards red
Since the particle size is currently quite large
let’s reduce it to a range between 2 and 5
This will create a smaller, petal-like appearance
For the particle
for example, the original size of 4 to 8
was generally too large to resemble petals
By reducing the size, we can create
a more delicate, petal-like look
Finally, let’s adjust the Wind Force value
If the particles are blown away too strongly, we can't see the chair well
So, in this Wind Force setting, the X-axis value
which controls the forward movement, down to 20
This way, they will form a recognizable chair shape
Instead of having the particles move forward
we’ll make them rise slightly upward, like flames
I’ll set the Z value to 50
Now, as you can see, the particles appear briefly
in the shape of the chair at the beginning
and then fade away nicely
Let me highlight only the modules where I’ve made changes
We modified the Emitter State and the Spawn Rate
Arranging them sequentially, this is what we did
For now, I’ll stop here for this particular particle effect
So, that concludes my adjustments to this Particle
There are additional features like Mesh Orientation
Instead of using billboards
you can see how the particles
can rotate as sprites
These functionalities have been added here
With these additional options
you can experiment with turning effects on and off
and think about
what fits best with your intended outcome
So I made adjustments to the Emitter, Spawn Rate
Initialize Particle, StaticMesh Location, and Wind Force
I’ll highlight all the modules where I modified specific parameters
to give you a clear overview
Next, we’ll add another module
but this time, it won’t be for the Particle itself
It’ll be to display the chair
Right now, while the particles are being generated, the chair itself is not visible
First, right-click and select Add Emitter
Then, from the list of templates, choose Single Looping Particle
Click the Add button
As you can see, a white particle has now been generated
We’ll deactivate the modules we don’t need for this
We’re going to use a mesh this time, so turn off the Sprite Renderer
Now, nothing is visible on the screen
So, let’s add a Mesh Renderer under the Renderer section
In the Mesh Renderer, we’ll add the chair
Click on Mesh
and you’ll see that the current mesh is set to a gizmo
which is displayed as an arrow-shaped gizmo
You can see this
Open the Mesh settings and search for _chair
Once you select the chair, you’ll be able to see it
At this point, you’ll see the default Material applied to the chair
However, this isn’t what we’ll be using
We need to change the Material to the Dissolve Material
Currently, this is default Material set in the StaticMesh Editor
To use the new Material
we’ll activate the Material Override option located just below
This enable the Override Material option below
Clicking this plus button
allows us to replace the existing Material
where you can assign a custom Material to the Index field
I’ll connect it to M Chair Dissolve
You can now see the dissolve effect applied
We need to access the dynamic parameters in the Material
so to the Update section
we’ll add the Dynamic Material Parameter module
We’re adding it to Update
because we want the effect to change over time
That's why we did this
Now, as this Emitter is already linked to the Material
This Material here
This data with dynamic parameters, connects to Emitter
Without any setup
the defined parameter names are automatically listed here
The default values we set in the Material are ignored
and the values are defined in the module
If we increase the Noise Scale value here
you can see how the size of the noise pattern changes
Increasing the Dissolve Value allows us
to control the appearance and disappearance of the object
The Emissive Power for the edge is set to 0, so you can’t see the boundary
If we adjust the edge value slightly
and set the Emissive Power to a stronger value
for example, let's try 8 again
you’ll notice
that the edges of the dissolving area now glow
You can also adjust the thickness of the edge
making it appear
wider or narrower
These adjustments are flexible
For Noise, for example, you could leave it
at a single value like 0.01
For Dissolve Value, since it needs to transition from fully visible
to gradually disappearing
a single value won’t work
To handle this, click the arrow next to the value
We’ll change the value type to Float From Curve
The curve will now align
with the particle’s lifetime
If the particle lifetime is 10 seconds
the curve starts at a value of 1
and transitions to 0 at the end of 10 seconds
This isn't what we want
It is not gradually disappearing
It is gradually appearing
So we’ll reverse the curve
Using the template, I’ll flip the graph
At the 0% time mark, it isn't entirely visible
Let me zoom in so that the graph fits here
At the 0% time mark the value should be around -2
ensuring it’s invisible at the start
At the 100% time mark, the value will be set to 2
1 won't make it disappear completely
So let's make it disappear completely
Just as you can see here
Let's zoom again
From -2 to 2 over time
We created the desired effect of a smooth transition
At this point, when you enable the Override Material option below, the plus button becomes active and clickable
If you want, you can change the curve to Auto in the middle
which lets you adjust the speed of how it fades out
You could make the fade out slow down gradually
or the opposite to this curve
The steeper the curve
the more noticeable the change becomes
This could be a good opportunity
to experiment and try out interesting effects
Like this
You can control how things change over time
using this type of graph
It’s a useful way to test different things
Currently, the effect we’re working with
the Blowing Particle, has a factory runtime of 5 seconds
and the particle lifetime is also set to a maximum
of 5 seconds
What this means is
So, after the factory stops at 5 seconds
the particles can last for another 5 seconds of lifetime
So they disappear here
The entire visible duration for the Blowing Particle
is estimated as around 10 seconds
The default lifetime for the Single Looping Particle is set to 10 seconds
10 seconds
If left as is, the particles will remain visible
even after the other effects disappear
For instance, the dissolved chair would still linger partially
which may not be what you want
But you have several ways to control this
Adjust the graph in the Dynamic Parameter module to a straight line
witching it to a Linear curve
Again, a Linear curve
So it won't last for the entire lifetime
But just the half
Changing more quickly for just half the lifetime
That's one way of doing it
Alternatively, you could manually adjust the values for 5
Every time, one value
5 seconds again
Blowing Particle, Emitter time, all 5 seconds
It'd be more efficient
if a single parameter controlled everything at once
Instead of chaining each value
we can control everything with one value
I will show you how
Synchronize the Lifetime value in Initialize Particle
with the Emitter State’s duration
Open the Lifetime dropdown, and from the options
select Current Looping Duration
under the Emitter section
Now, the particle lifetime is linked to the emitter state
keeping them synchronized
Next, since the State values
that for Single Looping
and Blowing Particle are currently different
so we need to unify them using a shared parameter
Go to User Parameter, click the Plus button
Make New, Common
Select Float
Name it Share Loop Duration
and set its default value to 5
Once that’s done, same thing
Blowing Particle's Emitter State and Loop Duration fields
Click on the arrow below
Search for ShareLoop Duration
You can search for User Parameter to connect them
So it's connected
Also, Single Looping's Emitter State
Lifecycle mode, Self
Loop Behavior, Once
Duration, ShareLoop Duration
Click on the arrow below to connect
All the values at Share
are now synched with Loop Duration of each Emitter State
By changing just this one value
The value at Emitter State was connected with Particle's Lifetime
Like this, you can adjust the duration for all emitters at once
We created both the Material and Material Instance earlier
The Mesh Render is currently connected to the Material
When we connect it
let’s try that now
We switched the connection to the Material Instance instead
At Instance, the Dynamic Parameter section isn’t visible
However, when using the Dynamic Material Parameter
values such as Noise Scale and Loop Value in the Material
are still passed through
and the applied effect on the chair works just fine
Through the User Parameter
we’ve established shared connections across components
including Initial Particle
Material to Instance
Instance to Mesh Render
and finally to the Dynamic Parameter
Not only are Niagara systems internally linked
but they’re also seamlessly connected with external assets
Configuring Blueprint for Niagara Control
To wrap up the example, we’ll explore
how to integrate Blueprint
Niagara, and Static Mesh to manage effects
Let’s start by creating a Blueprint asset
We’ll set its base class to Actor
and name it BP_Dissolve
Once created, open the Blueprint editor
Blueprints generally serve two roles
One is to group different components
and the other is to enable programming
For grouping, we can combine
different types of actors
like how we grouped multiple emitters in Niagara
We’ll link a Static Mesh with Niagara
Through simple programming
we’ll add an interactive toggle mechanism
to turn these on and off as needed
For Niagara effects
different user interactions
often trigger a reaction
This allows effects to manifest or deactivate
in response to the desired scenario
Let's start with the components
Start by adding a Static Mesh component
For this, for Static Mesh
select sm_chair
which will be the base of everything
Next, click on the plus button
to add a Niagara Particle System component
By default, newly added components
often become children of the previously added component
For this setup, it’s not a major issue
However, if the parent-child relationship affects movement
you can drag the component to the Root to Attach
This allows the Niagara system
and Static Mesh to function independently
or be controlled separately
So, let’s connect the Niagara component
to the FX_Chair Dissolve system we created earlier
That's set
Click the Add and include a Box Collision component
Once added, drag it back to Root and attach it
The Box Collision’s role is
to detect when a user-controlled player character
gets close to the chair, triggering it so that
it dissolves gradually
You can adjust its size
by scaling it up as needed
With this, the component setup is complete
Currently, the chair is visible
and the Niagara system is also active
We see both of them together
When the player enters the Box
of when the character approaches it
we'll deactivate the Static Mesh and activate the Niagara effect
First, press Compile
to ensure the three components are properly recognized
Next, go to Event Graph for some simple programming
To prevent the Particle system
from starting on its own when the scene loads
so we’ll take two precautions
Locate the Begin Play event node
This node triggers once when the actor
is placed in the world or
when the simulation starts
Drag the Niagara component into the graph
We want the Niagara component disabled
so its active state as disabled when it begins
Use the Set Active node for this
For this box called New Active
Disable this box so that we can't tick it
Also, for this Niagara component
ensure that its default Auto Active
is turned off
For player interaction, use the Actor Begin Overlap event node
For Actor Begin Overlap
copy and paste the Niagara component and Set Active node
then connect them to the Overlap event
Now, enable Active and also activate Reset
Enabling Reset
ensures the Niagara system
starts from the beginning of its timeline
rather than resuming from where it paused
It will start from 0 and continue when Set Active and Reset are activated
Let's compile with these two setups
Let's return to the level
and test this out
Place the dissolve chair in the world
and click the Play button to test the setup
Now, when it runs
we see our Third Person character
We can click to control the viewport
Now, as you approach the chair
let’s move closer slowly
Once you step into the chair’s Box Collision area
you’ll notice the effect is triggered
But the chair itself remains visible, which feels a bit off
To address this, we’ll add a step to the Blueprint logic
During the Begin Overlap event
or when the player enters the Box Collision
we’ll drag in the StaticMesh component
and toggle its visibility off
This is Set Visibility node
Set Visibility
By doing this, the chair will disappear visually
So for you
you need to know the difference between Active and Visibility
Let's first compile
and run this again
Press Play
and approach the chair once more
It disappears
Did you notice something strange?
Let me do it again
Press ESC to pause
Take a look at the shadow of the chair
Let's Play it again
The chair casts a shadow on the ground
Entering the collision area, this happens
Particles function purely as effects
which means they don’t cast shadows
By placing a StaticMesh in the world
you can ensure that shadows are drawn
even when the effect isn’t active
Let’s press ESC to go back
At Begin Play
let's activate Active
This is for a quick comparison
Let's disable the Niagara's Visibility
I’ll use the Set Visibility node and set it to false
Then, Set Active and Set Visibility for the StaticMesh remain unconnected and won’t function
We’ve turned off the visibility for the Niagara effect
When I start the simulation
and quickly move into the Box Collision area
The visible effect will deactivate as expected
Let’s compile
Let's Play to test it out
During the effect’s activation, the particles suddenly disappear
When I step into the active particles
they vanish abruptly
This highlights the difference between Visibility and Active
Setting Active to false essentially
halts the factory process of generating particles
However, even with the cessation
particles that have already been generated
remain in the world
Conversely, disabling Visibility
stops both of these things
both the display of particles and the factory process
So the effect that was in action
vanishes entirely as we saw in our project
If you want particles to fade out naturally
letting each particle
exist for its assigned lifetime before disappearing
so to manage deactivation
you should use Active instead of Visibility
to manage activation or deactivation
So this is what we have
There’s an unusual behavior I’d like to show you
Approach the back of the chair repeatedly, something is off
Let’s rotate this
Rotate
Let's Play
Let's approach the chair
The chair suddenly snaps back to its original orientation
This happens because the effect
should operate in Local Space
We rotated the chair in the world
but it is the Actor that rotated
The rotated Actor’s components
such as the mesh, Niagara system, and collision box, all align accordingly
It is all synchronized
To fix this, enable Local Space
for both the Single Looping Particle
and the Blowing Particle components
Let's Play and compare
With Local Space enabled
when I approach the chair
it disappears as we designed it so
Finally, besides controlling visibility
you might find that the playback duration
of the particles feels too long or too short
Using the Share Loop Duration parameter
we’ve ensured consistent control
We can adjust the playback duration dynamically within the Blueprint
increasing or decreasing it as needed
In Begin Play, if you search for Set Parameter in Niagara
you can assign values to various parameter variables
Since we created the Loop Duration as a float type
we first create a Niagara Float node
and connect it to the event graph
Next, name the value exactly the same as before
as Share Loop Duration
If you want the effect to last only 2 seconds
assign that value
and run the play test
Now, it fades out much faster
If you set the duration to 10 seconds
Like this, let's lengthen it before we test it
It remains active for a much longer time now
When handling effects like this
there are many factors to consider
Beyond what we covered in this lecture video
Conduct thorough testing
to create your own stunning effects
Today, we explored how to control the Niagara system
by creating a dissolve material and applying it practically
Because effects are real-time assets that change dynamically
planning and pre-design are even more critical
than for 3D meshes or materials
Let’s wrap up by summarizing what we’ve learned today
Thank you
Controlling Material Effects with Dynamic Materials To directly control materials in Niagara, create a Dynamic Parameter node
Noise Texture Multiply the World Position with the Noise Scale parameter using a Multiply node Connect the result to World Position
When using general textures, patterns may appear awkward due to UV mapping
To directly control materials in Niagara, create a Dynamic Parameter node
Creating Dissolve Material Generate a Step node, then connect Noise to X and DissolveVal to Y Connect DissolveVal to DissolveEdge
Use the boundary between wide and narrow areas to create edges
Creating Niagara System Add a Static Mesh Location module If an error message appears, click Fix Now to resolve it
Emitter Settings Add Dynamic Material Parameters in Particle Update Dynamic material data is directly connected to the emitter
User Parameter Select each Emitter State and link them to Share Loop Duration Allows controlling multiple emitter values with a single parameter
A material instance can be linked to the material Enables integration with both internal Niagara systems and external assets
Blueprint Setup for Niagara Control Blueprint Creation Add a Static Mesh component
Add a Niagara Particle System component Add a Box Collision component