Realistic Commons Portal Effect
GCC Academy
Hello, this is Park Hyun-sang
Today, we'll be creating a portal effect,
simulating the separation of space
when transitioning to another location
Such effects are widely used
not only in games but also in movies
For instance, the ending sequence of the Unreal 5 showcase featured a similar effect
We’ll design an effect with naturally flowing particle movements
to draw users’ attention effectively
Creating Portal Effect
To begin,
let’s create a Niagara System
This time, instead of using a preset template,
we’ll create an empty Niagara System
to create one
Let's name it FX_Portal
Open it
You’ll notice that no emitter exists
making an empty Niagara system
This is likely your first time building from scratch
without pre-existing templates
Right-click
and don't select an existing template
Let's go with Add Empty Emitter
to work with each step
First, in the Emitter Update section,
add the Emitter State module,
which controls how long
the system is going to operate
Set the Lifecycle to Self
and enable Infinite
Next, same with the Update,
add the Spawn Rate module
We'll set it to generate around 100–300 particles at a time
Because rendering and other functions are not yet configured,
these particles won’t be visible
When particles are spawned,
let's add Initialize Particle
which allows us to set basic things
like the size and others
We'll do other thing like Update later
add the Sprite Renderer in the Renderer section
Now the particles are visible
With this Spawn Rate,
the particles are generated, by 100 a second,
though they’re overlapping in a cluster
Add the Initialize Particle to set a constant spawn rate
and include the Shape Location
By default, this is set to a sphere shape,
which gives the particles a rough, spherical distribution
Since portal effects
often feature circular
or flat, round shapes
to visually connect to other spaces,
it is usually a sphere
Or more like a flat circle
For that, we need Torus
We’ll change the Shape Primitive setting
to Torus, or a donut-like shape
While it might appear
similar to a ring or disc
at first glance,
Flat ring or disc shapes
lack vertical dimensions
while torus shapes have height with a constant thickness
If we increase
the radius to 300
and widen the handle radius,
the handle
represents the thickness of the torus,
or the donut here
This range can be adjusted to your preference,
allowing you to create a consistent thickness
and size for the portal effect
Currently, the particles appear too large,
so go to the Initialize Particle module and set the sprite size to Uniform
Instead of a size of 10, reducing it to 1 is sufficient
I initially exaggerated the size
for better visibility
Portals often allow people to pass through,
so a radius of 300 units for the Shape Location
means a portal with a 6-meter diameter
It's a very large portal
It's big enough for a building or a truck to fit through
We’ll reduce the radius to 150 for a more moderate size
You can now see particles forming
the torus shape at closer range
To make the portal effect appear
as though dimensions are shifting
in a more naturalistic way,
I made the handle thicker for demonstration
But for this, rather than
the thick spread of the particles,
the clump will look much better
We’ll set the Handle Radius to 5,
creating a thin ribbon-like shape
For color adjustments, we move to Initialize Particle
Previously, we used red with an RGB value of 8, 1, 0.2
This time, we’ll use blue, setting the RGB to 0.2, 1, 8
to emit a bluish glow like this
The particles need to rotate now
A portal is inherently an unnatural phenomenon,
because a sudden spatial opening
is unstable by nature
To emphasize this instability,
the particles should not remain static
Instead, they should appear
as if they are constantly moving
and fluctuating
To create the swirling, dynamic effect,
we add Vortex Force to the Particle Update module
Initially, you may encounter a warning indicating that SolveForcesAndVelocity is missing
Clicking Fix Issue will automatically resolve this
The Vortex Force simulates a swirling, whirlpool-like motion
that makes the particles rotate
and spread outward in a natural, circular motion
It should move to make this shape
This rotation is
useful for achieving this shape
As you see,
we need more particles
With a spawn rate of around 300–600 particles,
the effect becomes more pronounced
However, it’s important to adjust the force
and verify the effect from different angles
Things like the value or axis of the Vortex matter
The Vortex Force Amount is not set to 200
This determines the rotational intensity of the particles
A higher value causes faster dispersion,
while a lower value
creates slower movement.
As of now,
they are just being pulled towards outside
Adjusting Origin Pull Amount
to around 100 pulls particles inward
before they disperse outward,
creating a visually dynamic effect
So this is the sketch of that movement
The particles are spawned, and they meet the vortex,
and they are puled outward,
just like this, like so
As particles swirl around the vortex, their movement is centered
at the origin and gradually disperses outward
The degree to which the particles
are pulled inward and their circular motion around the center
are determined by two key parameters,
Origin Pull Amount
and Vortex Force Amount, for which,
I will assign values like 100 and 300 respectively
It results in particles orbiting near the center
before breaking free and dispersing,
which creates a compelling swirling motion
However, at this moment,
because the particles currently appear as small dots,
the visual impact of the effect is not as prominent
To address this, we'll use the Scale Sprite Size module,
meaning changing the size of Sprite
We used a random graph to change its size
We'll be using the Speed value to do it now
We’ll press the Fix issue button here
Before entering the Vortex,
after pressing Fix issue,
let's observe how the particles behave
How have they changed?
At lower speed values,
the particles maintain their original size at 100%
However, at higher speed values, they grow to a maximum of twice their size
We’ll leave the X-axis scale as it is
and increase the Y-axis scale to 10 times,
or even 20 times, if needed
This adjustment makes the particles stretch vertically based on their speed
For the Y axis, it stretches upwards
They're spinning as if
they are all standing straight
Like this,
faster particles are elongated, while slower ones remain shorter
We can make them like so
However,
the current rotation flow is around a specific axis,
but the sprites, aligned with the Y-axis,
stand straight like so
Ideally, the elongation should align
with the rotation flow for a more natural appearance
To address this, the alignment in the Sprite Renderer
This Alignment
Let's adjust it to match the speed-based rotation,
and see what happens to the particles
The upright particles dynamically change
their orientation likest his, to other directions
To be exact,
initially, sprites that faced the camera
that looked like these
now stretch due to their speed
and adjust to align
with their direction of movement
So based on the direction of movement,
our Sprites now look elongated,
making them look more natural
That's the module we've set
Now, you could increase
the sprite size of Initialize Particle
and make it thicker,
the particle boundaries more pronounced
Adjusting the vortex rotation value to 500 allows the particles to spread further
For example, comparing a Pull Amount of 0
o values like 150 or 100 reveals
that the particles briefly converge inward before spreading outward,
enhancing the ring’s definition
So boundaries of the particle effect
are more distinct than when there was no Pull Amount
Those were some basic movements
of the particles
When observing the current application of Vortex Force,
the boundaries appear highly uniform,
giving a clean and precise appearance
However, such perfection may seem monotonous
To introduce variation to this monotonous look,
let's add a Curl Noise Force module
This module, Curl Noise Force, is added
Let's disable Vortex, because movements
make it harder for us to look at Curl Noise Force
ressing the F key in the viewport
helps focus on and compare the particles’ behavior
before and after the Curl Noise is applied
By using the Strength parameter,
increasing the Strength value
makes the particles spread more erratically,
adding a sense of movement
Additionally, for the Frequency parameter,
a higher Frequency
results in more compact in-and-out motion,
whereas a lower Frequency
produces a clearer distinction
between the outward
and inward area
Like out and in
Once these frequency settings are adjusted
to a certain amount
and the Vortex effect reactivated,
with the Noise module placed higher in the stack,
We can change the edge area
or the boundary area over here
Let's exaggerate the effect
I didn't go in too far,
but if Strength is stronger,
the shape of the spread
will have a completely different volume
I tried something stronger now
Let's set it to 150 for some change
Now, the particles are
not making a perfect circle,
but leaving a volumetric spread of particles
That's the change we have
To adjust the values dynamically later,
we will set minimum and maximum values
to allow continuous changes
However, the current work
focuses on establishing baseline values
If patterns appear too uniform,
experimenting with different values
can reveal how the patterns dissipate
or transform, but these values will
not be permanently used in reality
The spreading speed of the particles
can also be adjusted in
the Particle Spawn section using Velocity
By changing the Velocity Mode
to From Point, for instance,
you can make the particles
spread further outward like so
It should be greater than the Force value
to rotate outward like this
Let's make it smaller now
Reduce Velocity Speed,
maybe to a negative number
Then, the pattern shifts to behave differently,
as you can observe
Mixing positive and negative velocity values
all mixed in,
with Vortex and Noise results in this
Let's decrease Force Amount in this Vortex
They're moving inwards like this
Increasing the Force Amount too much
spreads them outward more significantly
600 particles are not a fixed number
If you want,
go ahead with around 3,000
If the Vortex Force Amount
is set too high, such as 1,000,
it can overpower other forces like Noise,
as the bigger Force often ignores the other
So if you want more Noise,
you need to increase Noise
That's how the value
for Noise will be applied
Using the Force value,
you need to be careful with this
If you do not want them to move too far away,
Use Initialize to reduce
their Lifetime to 0.5 to 0.7 seconds
Let's decrease the velocity by a bit
Like this
So these are the three modules
Velocity, Curl Noise, and Vortex Force
These three modules
can be used to adjust the movement,
providing a basic frame while not making it too obvious
By adjusting the settings, you can create
a silhouette with a fluctuating circular outline,
which I'm drawing right now
This is how it looks like
If you change the simulation target from CPU to GPU,
the number of particles
that can be utilized increases
Of course, if you increase
the particles or their Lifetime,
it will also increase in the quantity
And as there are more of them,
it's not advised to use CPU,
though it's not impossible,
because using GPU is
much more helpful in terms of performance
when you're using multiple particles
To achieve visually appealing effects
with distinct patterns,
such as the grainy details visible in this demonstration,
you may need to emit a significant number of particles
After setting the intensity back to 0.7,
you can extend the factory line’s operating time
by doubling,
tripling, or even quadrupling it
Instead of limiting the value to 1,
you can adjust parameters like
the factory’s runtime, rate, lifetime,
and the individual particle’s lifespan
By doing so, some particles will continuously
spawn and decay, maintaining a consistent count,
which naturally outlines the circle’s boundary
When using GPUs, you should address
any warnings that arise, as you see here
It says Missing fixed bounds
Missing fixed bounds, for your emitter
In the Bounds section of the emitter settings,
you can click the three-dot menu
and select Set Fixed Bounds (Emitters)
This action removes the warning
by updating the Fixed Bounds property
Bounds essentially
define the maximum area
where particles can spread
That's the Bounds value
If you reset the Fixed Bounds
to a smaller range,
it can cause problems later when placing effects
This issue will be explained further
when we discuss placing emitters in the world
For now, you should set the Bounds
to accommodate the maximum range
of the emitter’s spread
to ensure more stable particle control
Let's leave it be
Let's do other effects now
Detailed adjustments to the particles will occur
after all components are configured
In the center,
place the particle system in the world
It's there
Let's move it to our world
and make it float a little
Now, let's rotate it
You may notice that rotating it
can cause alignment issues due to the vortex force
It somehow appears correct only
in a specific orientation
To resolve this, for this Vortex,
change the Axis Coordinate simulation
of the Vortex module to Local
Without this adjustment, the simulation’s alignment will differ
depending on whether it’s set to Simulation Space
or Local Space, which is now
For this effect, we aim for the particles
to maintain consistent alignment in the desired local orientation
Now, what we need to do is,
instead of the back of the center,
you need to render a completely new location
Let's start by setting up
a level that represents the destination
For instance, for the level,
if you add a blue cube to the level,
it will help distinguish the area
Let’s assume that this blue cube
symbolizes the destination space
To implement this, you’ll need
a camera that captures this alternate area
From the Place Actor section,
search for Capture,
and you’ll find the Scene Capture 2D camera
Place this camera in the level,
and it will capture the scene from its perspective
The Scene Capture 2D camera
works differently from other cameras we know
Instead of the third-person setups,
let's actually look at the components
by pressing F8 before we move on
The FollowCamera component is the camera attached to the character,
which displays the scene directly
to the player’s screen
To exit the play mode, press ESC
The Scene Capture
captures what it sees and sends it as a texture,
rather than directly displaying it to the user
The Scene Capture camera requires a texture asset
to store the captured visuals,
functioning similarly to a micro SD card
To create this asset, open the Content Browser, right-click,
and select Texture > Render Target
It's usually referred to as RT
PortalDest
Dest as in destination
Once the texture is created,
go to the Details panel for the Scene Capture camera
In the Texture Target field,
assign the newly created Render Texture
After doing so, you can double-click on the texture to open it
Let’s enlarge the window to see it more clearly
Double-click on the texture
You will see the scene being captured by the camera,
albeit at a very low resolution
of 256 pixels
If you want, you can simply change it to 512 or 1024,
which will be applied immediately
This allows for real-time adjustments
to the rendering resolution
Returning to the Niagara system,
we proceed by adding a sprite emitter
to incorporate the captured scene
So let's go back to our Niagara screen
I will add a sprite in Niagara
Right-click and add Add emitter
Then, select SingleLoopingParticle
For SingleLoopingParticle,
the emitter defaults to Self
and runs continuously when switched, from Once to Infinity,
resulting in a loop of one second.
The Initialize Particle module
also syncs the particle lifetime with LoopDuration,
so no further adjustments are necessary
At this stage, you can see
a small sprite point floating
I’ll slightly increase the sprite size from its default
of 10 to better fit the framework
of the effect
that we've roughly created
While viewing from above, no issues appear,
but tilting the angle reveals a problem
This issue arises because the sprite property forces it to always face the camera
As you can see, we have our particle effect to compare to
Looking from above, there is no problem
Even if you check
the Local Space option for the simulation area,
the issue persists
To address this, there are a couple of methods
One way is
to modify the Facing Mode,
which is a viable way
To Particle Spawn,
search for Facing
Facing as in the facing direction
So Sprite Facing and Alignment
Let's add that part
Now, looking at it in all angles,
we can see how the angle is now consistent
In the Sprite Facing options, you can see alignment
for the X, Y, and Z axes
Currently, it’s aligned along the X-axis,
as you see here,
as shown by the vertical alignment
based on the X-axis' Facing
being set to 1
To match the particle’s direction instead,
we set Z-axis alignment to 1
and X-axis to 0
After making this change, save it
and verify that it displays correctly in the world
When viewing in the world,
the alignment looks correct
But if you disable the Local Simulation option,
the particles will revert to aligning with the world’s Z-axis,
which requires caution
Therefore, always ensure that the Local Space option is enabled for proper alignment
Portal Material and Dynamic Parameters
Remember the render texture we created earlier?
In the Sprite Renderer,
let's connect it to the Material property
Start by right-clicking to create a new material
and naming it M_PortalTex
Open the Material Editor,
and since this portal
doesn’t need to be affected by lighting,
set it to Unlit
Additionally, to make the portal transparent
with a circular opening,
configure the material to Masked
This will allow only the circular opening
within the rectangular sprite to remain visible,
which is the desired result for us
To begin, the render texture created earlier
is connected to the Emissive Color in the material,
resulting in the image becoming visible
After applying the settings,
the material is linked directly
to the Sprite Renderer,
making the image appear as intended
At this stage, resizing or masking specific circular areas
will be necessary to refine the appearance
So now we have the image
The next step is masking the material
In material, we need to display a circular image
So we need the masking work done
Right-click and search for Radial
You can add the RadialGradientExponential node
Connecting this node to the Emissive output
initially shows a preview
A white circular gradient in the center
surrounded by black fading edges
So we see a gradient effect
applied to this shape here
This node is then linked to the Opacity Mask,
transforming the material into a masked state
where only the circular area is visibl
Now connect it back to the Emissive Color,
as you see here,
combining the masked circular shape with the rendered image
This alone isn't too cool
To enhance the material’s aesthetic, we'll do a few more things
For example, a Texture Sample node
is added to include a noise texture
A basic Perlin Noise texture is selected
Let's bring it in
It's under Start Contents
Now, we will incorporate
this Noise with this gradient here
Here, the noise texture,
which operates in grayscale,
the red or green channel from the noise can be used,
as they both provide the same grayscale image
This noise texture is added
to the radial gradient like so
So, this is disconnected from the gradient and linked to the Step node,
where it is connected to the X input
After that, it’s reconnected to the Opacity Mask
We’ll set this value to approximately 0.5
ooking at it now, it doesn’t quite resemble a perfect circle
Instead, it appears quite messy,
with only the edges looking rough and torn
The values of the circle itself are 1 at the center
and 0 at the edges
The gradient in between
transitions from 1 to 0
The noise itself is also composed of
values ranging from 0 to 1 in black and white
So, when any value is added to 1,
it ends up exceeding 1
That’s why the center consistently appears intact
However, if the values from the noise,
like 1, are added to the edges where the value is 0,
it becomes visible
These visible sections,
which weren’t meant to be,
occur when 0 has a value added to it
This creates a torn or punctured appearance
Now, we’ll utilize this effect
Currently, the range of values between 0 and 1 is too large
To address this, we’ll use a Multiply node
with the texture and reduce it to 1/10
By applying Multiply, the values that were previously between 0 and 1
will now range from 0 to 0.1
Multiplying 1 by 0.1 gives 0.1,
whereas 0 remains 0
Apply an Add operation
It will create a slight jagged noise effect
only along the edge of the circle,
as you see over here
Naturally, for the original clean circle,
adding a value of 0.1
or subtracting it
to or from the inside
and outside creates these
highlighted areas in white
Then, using the Step node,
we take what was previously a smooth gradient transition
of values and redefine it
sharply between 0 and 1
At this stage, if the image is left static,
it will look very different from the rotating particles
To address this,
we’ll connect a Rotator node
When we link the Rotator,
as you can see, it starts to rotate
Opening the settings below,
you’ll find Speed and Center values
Like this,
when this says Coordinates,
it means that UV is the information that is to be included
The UV values span from 0, 0 to 1, 1
This means the rotation is centered around 0.5, 0.5,
which represents the center of the UV space
If you want to control the speed of this rotation,
you can temporarily remove this and connect a Time node,
combining it with Multiply to adjust the speed
By doing so, you can make the rotation twice as fast,
five times as fast,
or otherwise control its speed
Next, we’ll extend the application of the Step node
to make the edges
glow like the colors of particles
To achieve this, we’ll duplicate it using Ctrl+C and Ctrl+V
hTen, we’ll connect the Add result to X as before
Make it bigger than the Step node used for the Opacity Mask,
by around 0.7, not too much
When applied to the Opacity Mask,
the visible area becomes much smaller than when the value was 0.5
Assuming the entire range spans from 1 to 0,
as viewed from the side, you can consider
a gradient graph
that gradually decreases from 1 to 0
This results in a visible effect, depending on whether
values above 0.7 are treated as 1
the difference being in terms of the visibility
That's what we just created
At this point, the edge is refined by subtracting a wider are
When you observe this adjustment,
the smaller the difference in values,
which I will set as around 0.5,
the thinner the boundary becomes
he boundary is styled to glow like the particle’s colors,
with RGB values set to X: 0.2, Y: 1, and Z or blue: 8
These color values and the texture are blended using the Lerp node
Since only the boundary needs to glow,
the color is connected to B and the texture to A
Let's redo the order
The Subtract output is linked to Alpha
and then to Emissive Color,
which creates the glowing effect along the boundary
For the Step node where the value 0.5 was used,
restore it for the Opacity Mask
that it looks as though a glowing boundary
surrounds a hole in mid-air,
just like this
Next, the Sprite Size in Niagara is adjusted
to align with the boundary,
something like this
Now the rotating image
and particle movements fit seamlessly
If you wish
to reverse the rotation direction,
add a negative value into the Time Multiply
And it'll rotate in reverse
When observing this result,
you might notice one issue
with the boundary’s pattern
Let's slow it down
to something very low like -0.1
Now we see that it has a fixed pattern
Right? So for these,
the portion multiplied by Time and Texture,
Let's copy using Ctrl+C and Ctrl+V
and adjust the spacing slightly
One of the Time values is set to a negative direction
and the other to a positive direction
The results of these two
are then multiplied
This creates a combined effect
where the Noise image rotating in a positive direction
and the Noise image rotating in a negative direction
Both blend together and,
let's zoom in a little more,
you may be able to see this slight movement
Now it just needs a bigger difference in value
Let's try 0.3 for the reverse direction
Then the rough boundary
is changing constantly as you can see
Because the rotation values are identical,
the image has a rough texture
but lacks a strong sense of rotation
So regardless of the direction,
let's make
the value difference for Time Multiply
around tenfolds
Then we can add that flowing effect as well
You could go with the plus direction for both
But I personally think this combination of minus and plus
creates a prettier Noise, that's why I did this
In the area where the Texture
is multiplied to adjust the intensity of the Noise,
if you apply a strong value such as 0.3,
the Noise becomes much more pronounced
So, that concludes
the basic settings in Materials
Now, we align this with Niagara
to allow dynamic adjustments of parameters
using a dynamic parameter
This is the final step to organize the values
First, we’ll create a Dynamic Parameter
and proceed step by step from here
For the first parameter at Index 0,
we’ll create RotSpeed to control the rotation speed
One element will receive the value directly,
while another will reverse it by applying a negative Multiply,
creating a speed difference
So let's say -0.2 for now
That's the default value
to produce an effect where the Noise
subtly oscillates
For the second parameter, we’ll add Noise Strength
to control the intensity of the Noise
Let's connect to this node
The default value can be 0.3,
or even around 0.4
Let's change it so that the Noise effect becomes visible
Let's pull down a little
Then, to allow it to connect with Step,
set the third parameter at Index 2
as StepVal with a default value of 0.5
For the final parameter at Index 4,
we’ll set Line Width to determine the thickness of the line
Set this to a default value of around 0.03
The Line Width will then be added
to this over here,
the Step Value, with Line Width
Let's zoom in
The result of this addition
is connected to the second Step
This allows us to control
the parameters in Niagara
The color node here,
which I created
as a Constant3Vector for explanation purposes,
will be replaced with Particle Color
to pass RGB values
Remove the Constant3 node,
and currently, it’s set to output a white value
Apply this change
And now,
the leftover Alpha value feels incomplete,
so we’ll connect it to the Radius
in the Radial Gradient
This will allow us to control the size of the circle
Let's move this aside separately
Now, save
Now, moving to Niagara,
under the Update section,
create a Dynamic Parameter
Then, the Dynamic Parameter connected to the material
is automatically listed up
Set RotSpeed to 5,
NoiseStrength to 0.3,
StepVal to 0.5,
and LineWidth to 0.03
As you can see, a slight effect has appeared
just outside the rectangle
Since we’ve connected the Particle Color,
we now need
to switch the color mode from Unset to Direct Set
Set the Red value to 0.2,
Green to 1, and Blue to 8
Now, the Alpha value is linked to the gradient of the radial texture
When you input 0.5 for Alpha, the circle shrinks
While the naming convention for Alpha,
as for the name goes,
may not be ideal
We could use this to reduce the circle's size as the Alpha value decreases,
and increase the circle's size
as the Alpha value increases
To add more detail to this,
rename the item previously labeled Empty
to OuterCircle
Now Ctrl + C
And keep a blank space to the side
to reduce the size of the details panel
Now, Ctrl V
Let's rename the other one
to InnerCircle
At InnerCircle, let's reduce
the Force Amount of the Vortex Force
Gradually decrease the value to make it negative,
and you’ll see it draw inward like this
Also, observe how adjusting the Origin Pull Amount
changes the result, because as the value increases,
the shape pulls further inwards
Be cautious not to set the value too high
Adjust the Force Amount and Origin Pull Amount
because it can push elements outward instead
So adjust the values accordingly
so you can create a shape
that draws inward in this manner
Additionally, by slightly altering the Noise,
you can achieve a look where even
the inner elements appear to be sucked inward
This softens the previously sharp edges of the image
and makes the transitions smoother
Let’s apply this to the world and see how it looks
When viewed in the game view, this is how it looks
This concludes the creation of the portal effect
Particle Movements in Unreal
We especially explored adding noise
to uniform shapes like circles
We also learned how to utilize GPU simulation
to handle a large number
of particles effectively
Additionally, we discussed using render textures and multiple cameras
to create the illusion of elements existing in the same space.
Let’s summarize what we’ve covered in this session
and conclude here
Thank you
Portal Effect Creation Create an empty Niagara system and name it FX_Portal Select Add Empty Emitter to add an empty emitter
Add Emitter State, set LifeCycle Mode to Self, and Loop Behavior to Infinite
Spawn Rate : 600 After Initialize Particle, Lifetime : 0.5 After Initialize Particle,
Color(0.2, 1, 8, 1), Sprite Size mode: Uniform, 1 After Shape Location, Shape Orimitive: Torus,
LargeRadius : 150, HandleRadius : 5 After Vortex Force Vortex Force Amount : 1000,
Vortex Axis : (0, 0, 1) Click Fix Issue to add Solve Force and Velocity Scale Sprite Size By Speed
min: (1, 1) max: (1, 20) Click Fix Issue to add Particle State Curl Noise 추가 후 Noise Strength:
220, Noise Frequency: 25 Add Velocity, Velocity Mode: From Point, VelocitySpeed: -62
Sim Target of Emitter Properties: GPU Compute Sim Fix Bounds: Set Fixed Bounds(Emitters)
Render Texture and Portal Effect Place a Scene Capture 2D actor in the level
Create a Render Target texture asset named RT_PortalDest with a size of 512×512
Connect the Render Target to the Texture Target of Scene Capture 2D Add Effect and SingleLoopingParticle
Emitter State's LoopBehavior: Infinity Initialize Particle's Sprite Size: 280
Add Sprite Facing and Alignment Sprite Facing: (0, 0, 1)
Enable Emitter Properties Local Space
Portal Material and Dynamic Parameters Create M_PortalTex Material, Shading Model: Unlit, Blend Mode: Masked
Connect M_PortalTex to the Sprite Renderer material Add a RadialGradientExponential node and connect it to Opacity Mask
Connect the RT_PortalDest texture to Emissive Color Create Texture Sample, select T_Perlin_Noise_M
RadialGradientExponential and Add Connect Step Result to Opacity Mask with Step X
Create a Time node and multiply it by 5 Connect the result to a Rotator, and use the output to connect to the UV input of the Perlin Noise
Add a Step node and input the value 0.55 Connect the Add to X and subtract it from Step Create a Constant3, (0.2, 1, 8)
Create a Lerp node Connect RT_PortalDest to Lerp A, Constant3Vector to Lerp B, and the result of the subtraction to Lerp Alpha
Copy all nodes from Time ~ Multiply, then adjust the copied Multiply values so that the two Time nodes use different values
Dynamic Parameter Setup Index[0] (RotSpeed): Connect to Time Multiply B Multiply by -0.2 and connect to other time
Index[1] (NoiseStrength): Connect to two Noise Texture Multiply B, G value 0.4
Index[2] (StepVal): Default 0.5. Connect the result to Subtract in Step Y Index[3] (LineWidth): Determines line thickness, default 0.03
Add StepVal and LineWidth using Add and connect the result to Subtract in Step Y
Use Particle Color for RGB values Delete the Constant3Vector node
Configure Dynamic Material Parameters: RotSpeed: 5, NoiseStrength: 0.3, StepVal: 0.5, LineWidth: 0.03
Adjust Initialize Particle Color to (0.2, 1, 8, 0.5) Duplicate the emitter and name it OuterCircle
Duplicate the emitter and name it InnerCircle Vortex Force Amount: -223 Vortex Origin: 180
Curl Noise Strength: 98