🤖 Control Rig
Helps in Making animations from a rig, whereas the Backward solve helps editing existing animation
Create a control for a bone, drag it to forward solve as GET CONTROL. Drag it’s parent bone you want to manipulate and click SET BONE, pin in transform from control to bone node and connect it to the FORWARD SOLVE.
NOTE - Controls are generally not child of any bones, because moving the bones will make them move with them as well…
A way to manipulate bones from the child to parent, whereas in forward kinematics that is default bones are manipulated from parent to the child bone
Drag control rig in scene, key frame in the sequencer as it opens automatically. Right click on the left bar at control rig track -
Creates a baked animation sequence from the sequencer
Creates a linked animation sequence that can be edited as we edit the animation further in the sequencer.
Aim node helps to aim the specific location or direction, we can rotate the spine of the character to aim at a specific location/direction. Put weights for 3 different spine bones like 0.25 0.50 and 1.00 to smooth out the rotation.
Instead of the AIM NODE spine target being a control, we set it to a variable. Drag control rig in animation bp, set the value of this variable (expose the variable from control rig first). For the third person character the value to look at can be the camera forward vector direction.
Controls can be limited, for example a control should not move out of a box, or head shouldn’t move out of -70 to +70 degrees.
Takes an array of bones as input, and an affector transform to lean the bones towards the affector target.
The same as FABRIK just gives a rotation limit for each or all bones at once, so character doesn’t bend too much if the door knob is far away.
- Unlike Basic IK, FBIK treats the whole skeleton as a web. Moving a leg
can "pull" the body.
- Root: Usually the Pelvis.
- Effectors: The tip of each leg.
- Chain Depth: Set to 3 (for a 3-joint leg) to ensure the leg bones move
before the body starts to tilt.
- worldLockedTransforms: The "Starting Line." Where the foot was at the
beginning of the step.
- worldTargetTransforms: The "Finish Line." The coordinate in the world
where the foot wants to land.
- The Swap: Inside the Trigger function, we set Locked = Target (Old)
before calculating the New Target. This ensures the leg starts its next
step from exactly where it just landed.
- Prevents the spider from "hopping" with all legs.
- Groups: Split 8 legs into two groups: Group A [0, 3, 4, 7] and Group B
[1, 2, 5, 6].
- Logic: A timer flips a Boolean every 0.2s–0.25s. Leg Trigger = (Distance
> Threshold) OR (Is My Group's Turn).
- If a spider moves fast, a static target (e.g., 200 units ahead) isn't
enough. The body will outrun the foot.
- The Fix: New Target = Current Position + (Velocity * Step Duration).
This "over-predicts" the landing spot so the foot stays under the body
longer.
- Allows the spider to tilt its body on slopes/walls.
- Raycast (Line Trace): Shoots a ray from the pelvis to the floor to get
The Hit Normal.
- From Two Vectors: Compare "Vector Up" (0,0,1) to the Hit Normal. It
creates a rotation offset that is multiplied into the Pelvis rotation.
- The "Double-Jump" Jitter: Never measure the distance from the Locked (Start)
position. As the spider moves, the start point gets further away, causing
the leg to trigger repeatedly. Always measure distance from the Target
(Landing) position. Once the foot lands, the distance becomes 0, and the
logic stabilizes.
- Spring Interp Logic:
- Stiffness: How fast it tries to catch the target.
- Damping: 1.0 = smooth stop. < 1.0 = wobbly/overshoot.
- Used on the Pelvis to make the body "lag" behind turns, creating a sense
of weight and organic "juice."
🏡 Environment
Lighting
Environment Light Mixer
Reflections
Captures reflections around the environment as much as the size is given, projects those reflections on reflective surfaces.
Same as box reflection capture, just captures a spheric shape, better if reflective meshes are round.
Almost the same as the upper two, the difference is it’s heavy on GPU and captures in real time and puts reflections on reflective surfaces.
🎨 Materials
A complex logic can be put into a material function and reused again and again as a single node. Material Function Instances can alter variables in its parent material function to create a different but same logical material function.
These are like materials itself, but as layers those can be blended based upon the Material Layer Blend. Material Layer Instance is self explanatory.
Material layers use material attributes, so plug in make material attribute node to get roughness, albedo and others.
Material layer blends are used to Lerp between Top and bottom layer, all the logic of blending relies here as shown in the picture.
Material Layer Blend Instance is self explanatory.
Material parameter collection holds variables that can be changed from any blueprint and changes its value throughout all the materials it’s used in. It is used like a global variable for example wind speed.
How lights bounce inside a mesh. For example blood can be seen from our skin. It’s just a combination of variables that can be used in a material after setting its shading model to Subsurface profile.
An ONNX Neural Network model can be imported to process screen output at the very end and create effects like hand drawn, they are more precise than basic toon post process effects.
Requires Substrate Material Framework to be turned on. Specular is the reflection of the light source itself on a surface. It can be used to control the way this glint shows up from different angle for example how a CD glows irl. It uses a texture to mimic that CD glow.
Altering UV's
To rotate a vector with respect to origin is shown in the image. For rotation of the UV’s we have to rotate each with respect to PIVOT. The PIVOT in mid can be achieved by subtracting 0.5 from both. Subtracting 0.5 will make 0.5th position UV (ie center) and then the Rotation will happen with respect to centre of the UV map instead just 0,0
The 0.5 then needs to be re-added. An example of how it’s done.
This node does the whole upper complex part with just one node. It rotates a vector with respect to origin.
Drawing Shapes
Centre UV’s then use length into step node to draw a circle.
Centre UV’s and absolute them so all 4 corners are (0.5,0.5). Take the maximum out R and G and then a step node to draw squares. Maximum creates a gradient grid like Image 2. That step node then draws a square.
Make a circle of x length, another of x+width radius. OneMinus x radius circle and multiply both. Multiply makes common 1’s white and others black…
📏 Material Nodes
NODE NAME | INPUTS | OUTPUTS | WORKING |
Step | Y,X | Value 0/1 | Outputs one if Y is greater than zero, and zero if not. |
Max & Min | 2 | 1 | Returns max or min of 2 inputs… |
Abs | 1 | 1 | Drops minus sign, turns negative numbers into positive |
ComponentMask | 1 | 1 | Masks out R/G/B/A from a vector, or breaks a vector's dimensions |
Append/ AppendMany | Adds back a vector with its RGBA components. | ||
if | A B A>B A=B A<B | 1 | Takes A&B as input and returns 3rd, 4th, 5th input based on comparison of A & B. Step is faster than if…. |
sin | [-1.0, 1.0] | Outputs sin value of input, Input 1 = 2π Input ½ =π | |
cosin | [-1.0, 1.0] | Outputs cos value, input same as sin. | |
time | 1 | Outputs time, float increases by 1 per second | |
OneMinus | 1-input | ||
Saturate | Clamps number between 0-1 | ||
Clamp | Clamps number between min/max Inputs | ||
Power | Maths power, used for contrast | ||
Dot Product | Dot Product result of 2 vectors | ||
Lerp | Interpolating 2 values based on alpha | ||
Frac | Returns just decimal part of a number | ||
SceneTexture node returns basically what’s drawn on the whole screen. There are different passes when rendering a frame, like base color then roughness then metallic. These are called Buffers or G-Bufferes. Each Scene Texture Id/Buffers return different passes that can be altered to make post process effects and others.
A fun thing is that if you apply a metallic scene texture to the base color of a material and apply it on a mesh, everything you see through the mesh, it’s metallic values are shown on the mesh
📐 Vector Maths
A = 2x + 3y / 2i + 3j (where i & j are X&Y’s unit vectors)
B = 7i + 2j
A+B = 9i +5j
A = 2x + 3y / 2i + 3j (where i & j are X&Y’s unit vectors)
B = 7i + 2j
A-B = -5i +j
A = 2x + 3y
-1.5A = 3x + 4.5y
A = (2,3)
B = (3,-2)
A.B = 2x3 + 3x-2 = 0
A.B = |A|.|B|.cosΘ
A.B = B.A
If A.B = 0 -> A,B are perpendicular
If A.B = -1 -> A,B are at 180 degree
If A.B = 1 -> A,B are at zero degree
If A.B > 0 -> A,B are in same direction
If A.B < 0 -> A,B are in opposite directions
A X B = -B X A
Direction is right hand thumb rule
A X B = |A|.|B|.sinΘ .n̂
n̂ is a unit normal vector (a vector of length 1 pointing perpendicular to both A and B using the right-hand rule).
🎆 Niagara
Niagara emitters as the name suggests are single emitters that can emit particles of one kind. Multiple Niagara emitters can be combined to create a good VFX effect.
-GPU sim particles can still receive information from blueprints, it just can’t output information.
It allows non vfx artists to tweak variables to get desired effects. Any variable can be set as emitter summary by right clicking on parameter and “show in summary”
Multiple event handlers can be added from the properties panel, it's not there by default.
Example: Suppose a firework rocket goes up in the sky, when it dies we need to tell another emitter to spawn a burst of fireworks in the sky.
So we add the Generate Death event in the rocket’s update particle stage. Click + stage at the end of properties tab and add an event handler stage in the burst emitter, here we select rocket -> Death event. This stage now works like an execution stage when the death of a particle will happen in the rocket emitter. In this stage we add a module for the same event (death in this example) “receive death event”.
(particle namespace) color == (user namespace) MyColor
But now we do
Color (sprite renderer) == (user namespace) MyColor
Attaches a light with each particle, intensity and other properties can be edited.
Render other particle systems, skeletal meshes and much more.
Sprite UV mode: this setting changes the way sprite looks on screen, we can flip sprite in x or y direction with it. For example a sprite written ‘p’ can be flipped on x to look like q on y to look like b and on both to look like d.
The Niagara system contains multiple emitters, it can be placed in the world, its variables can be edited in blueprints.
In the details panel for every module there are some properties. After every property there’s a down arrow that allows us to -
There are 2 ways a parameter can be setted. The first one is by dragging the parameter from the parameters tab and dropping it to the suitable execution stages (where it can be set).
Another way is to add a “Set new or existing parameter directly” module in any stage. The details panel of the module will give all possible parameters that can be setted from the execution stage the module is in. In the details panel there’s an option to make new ones as well.
There are 2 ways a parameter can be created. One is by clicking the plus sign in front of the namespace (system, emitter, particle, user) in the Parameters tab. Another one is to click the drop down in front of any property (for example lifetime in initialize particle module) and click “Read from new emitter/particle/system/user parameter”
Blueprint readable.
User parameters can be made from the user parameters tab. These parameters can be edited in the details panel when dragged into the world, or through blueprints.
User parameters can be bound to properties of modules like the lifetime property of initialise particles module.
These parameters can be accessed from any emitter in the system. For example if we want 2 emitters to have the same spawn rate it can be made a system parameter. Click on the down arrow and ‘read from a new system parameter’
Used anywhere in the same emitter, created the same way as the system parameter.
Used in between while the math is done, none of our business. Gets destroyed after the math completes.
When we edit the lifetime for the initialize particles module in the details panel, the engine stores the values as particle parameters. It’s different for each and every particle in the emitter.
Most of the time particle parameters are not created, but whenever created they are different for each particle.
Timeline Duration is just for visualization. Duration can be changed by dragging the timeline bars.
Particle lifetime tells how much a particle, a dot, lives after spawning.
System time tells how long a niagara system runs. For example a 5 seconds and looping infinite particle system will loop indefinitely and will reset all emitters within every 5 seconds.
Different for each emitters (emitters can choose to use system time as well), emitter time tells how long an emitter stays.
Modules
NIAGARA MODULES
Almost all spawn modules belong to the Emitter Update stage in Niagara. Spawn burst can be put into the Emitter spawn stage if in need.
Spawns a specific number of particles at once.
Spawns specified number of particles once per second
Spawns particles based upon distance. Per unit (cm).
Self explanatory…
Add Velocity: Sets particle speed and direction.
Even if the emitter is not set to Local Space, rotating the Niagara Component in the level will still rotate the velocity direction by default.
To prevent this and lock velocity direction to world space, set Rotation Coordinate Space to World/Global in the Add Velocity module details.
Gravity, drag, vortex force and curl noise modules.
Enables collision. Particles.HasCollided boolean returns true on the frame collision occurs.
Spawns particles directly on the surfaces, vertices, or faces of a Static Mesh.
⁉️ How To's
What i made | Thought Process |
Vignette postprocess material | Lerp between scene texture (post process input 0 pass) and black color, based on the centered UV’s (TextCoord - 0.5) length. Add -1 to 1 for radius and CheapContrast node for hardness of the effect. |
morphing particles into different shapes | -Use shape location to generate particles on one shape, use another shape location to generate on another shape. -add lerp particle attributes module in the particle update and tick particle location from the properties tab of this module, use shapelocation1 as a and shapelocation2 as b for learping. Now lerp the float over time. |
GameBP
Suppose you are playing GTA5 or minecraft, we will learn everything with their example.
When you open gta5/minecraft and if you have selected frame rate to maximum 60 last time when you exited the game, it will still be locked at 60FPS.
Saves .ini file for your game, this .ini files executes at the very first to set windowed mode, vsync and framerate cape like settings. In your options menu you can allow the player to set them directly through this class and UE handles it automatically.
It can be done through game save manually but that does not make sense.
Last time you completed a mission of gta or found diamonds in minecraft, when you come back next time, they are still there.
Gamesave allows you to save variables that you can use while loading the game level next time. For replication of minecraft worlds or GTA5 save slots there are inputs called slot-name while saving the game.
You selected online mode in gta and wow rockstar opened story mode, this does not happen because gameinstance is there to pass variables between levels. If you have a variable that you don’t want to save but keep it until the game is on you put it here. Gameinstance only persists through a game cycle, after its variables go to default.
In gta 5 there are 2 major levels, one is the main menu another one is the city where we f around. For different slots or different worlds of minecraft there are not different levels, there’s just one WORLD level notch made and he brings variables from save game to make it look like the game you left last time.
Levels are hard to explain but as you progress you know what it is.
These are created through sequencer and the timeline window. These are cut scenes of a gta game.
This is what tells a level that when a player clicks play, which character to use, which controller to use, which hud class (UI) to use. It's setted through the world settings tab.
You have a superhero game where you can become iron man and spider man. The player controller defines what’s in common, usually we put the logic of looking around in the level with mouse input, as both spidy and tony can look around. Apart from that we put pause menus, inventory (if both share the same inventory) and showing mouse cursor or hiding it when we’re navigating through UI or playing the game.
For a multiplayer game every player playing only has one controller, for a co-op game every physical player playing has exactly one controller. For a real human being playing a level there’s exactly one Player Controller.
A level can be controlled through a pawn or a character, character is a child blueprint of pawn with more modules such as Movements.
We design 2 different characters for iron-man and spider man as they both have different sorts of gameplay. Gta’s michel franklin and travor are children of the same character blueprint, this line you might not be able to digest yet if you’re new in ue5. But let me clear, gta5’s all three character walk drive shoot the same way, making 3 different character classes would be a waste of time and memory. Instead you created one master character that can walk, shoot, talk, drive and made children of this blueprint so that you can give them a different body (skeletal mesh), different voice, and different superpowers (like slowing the time or so).
I don’t use it, it basically allows you to build that UI of map, gun switching and the main hud we see while playing the game. We usually do it with character and controller class.
In an online game you see some variables are common for everyone, like players alive of PUBG/FORTNITE. It’s here, we put all the logic of global rules like in PUBG new state you can make an enemy your teammate after knocking him out, that logic relies here, all the teams logic and so on.
The simplest explanation is if you have kept inventory turned off in minecraft when you die, inventory items drop in the world, which you do with player state. If keep inventory is on then you save inventory in game save. Although in real minecraft in both cases inventory is saved in gamesave. In the player state you put variables that you want to set default when the player dies.
In fornite and pubg when waiting for revival you can roam around freely in the world, no collision nothing whatsoever, just a flying camera and controls. You put logic like the spectator class should not be able to see/hear other than his teammates as in case they can tell the location of enemies through flying to their teammates.