The animation arc you have climbed since South Shores ends here, at the bottom of the sea. Every rung taught you to move something: MoveTo and TeleportTo slid whole props (south-shores), ease curves made that motion feel alive (north-jungle), the prop_mover device did it with zero code (east-volcano), the animate-to-targets component swam your banked relics along splines (lesson 12), and the sequencer lesson (lesson 15) handed Verse the transport controls for a whole authored shot. But all of those move objects as rigid pieces. The kraken guardian of the Sunken Athenaeum does not slide — it performs. Its tentacles flex bone by bone, and the tool for a bone-level performance is Control Rig: a rig you build on the guardian's skeleton, keyframe in Sequencer, and fire from Verse with the exact cinematic_sequence_device pattern you already own.
What you will build
Two Control-Rig-driven performances for the Athenaeum Depths capstone:
- The idle sway — a slow, looping tentacle undulation the guardian plays in-world, so it reads as a living creature while it patrols the drowned library.
- The tentacle sweep — the big keyframed flourish that stars in the victory cutscene when the final relic is banked.
One Verse device runs both: it loops the idle sway from OnBegin, and when the capstone's victory trigger fires it stops the idle, rolls the sweep, and hands the guardian back to its sway when the show ends. This is the exact piece athenaeum-depths (the zone capstone) imports for its finale.
Why Control Rig, and not the tools you already know
Quick honesty check before we rig anything — the whole arc, one line each:
| Tool | Moves | Best for |
|---|---|---|
TeleportTo / MoveTo (Verse) |
a whole prop, as one rigid piece | runtime-computed destinations |
| prop_mover device | a whole prop, editor-configured | no-code sliding doors, platforms |
| animate-to-targets component | a scene-graph entity along authored targets | splines, swims, patrols |
| Control Rig + Sequencer | individual bones of a skeletal mesh | keyframed performances |
If the thing that needs to move is a bone inside a skeletal mesh — a tentacle, a jaw, a tail — none of the first three can touch it. That is Control Rig's job, and only Control Rig's job.
Walkthrough
Step 1 — Start from the guardian's skeletal mesh
You imported the kraken guardian's skeletal mesh back in the scene-graph-skeletal-animation lesson (lesson 16), where it played baked swim/idle clips. Baked clips are fixed — you cannot re-pose them. Today you take control of the skeleton itself. In the Content Browser, find the guardian's Skeletal Mesh asset.
Step 2 — Create the Control Rig asset
Right-click the Skeletal Mesh → Create → Control Rig. This opens the Control Rig editor with the guardian's bone hierarchy in the Rig Hierarchy panel.
For each tentacle you want to animate, add a control:
- In the Rig Hierarchy, right-click the tentacle's root bone → New → Add Control. Name it clearly:
tentacle_L1_ctrl,tentacle_R1_ctrl, and so on. A control is the handle an animator grabs — the bone is the thing it drives. - In the Rig Graph (Forward Solve), wire each control to its bone: drag in a Set Transform - Bone node, set its target to the tentacle bone, and feed it the control's transform via a Get Transform - Control node. Now moving the control moves the bone.
- For a tentacle chain (several bones), repeat down the chain, or use a Basic FABRIK node targeting the chain's tip control so one handle bends the whole tentacle — one control, whole-tentacle flex.
Compile the rig (the Compile button in the Control Rig editor toolbar), grab a control in the viewport, and pull. The tentacle should follow. That is the whole trick: Control Rig turns a skeleton into handles.
Step 3 — Keyframe the two performances in Sequencer
You know Sequencer from lesson 15 — same timeline, new track type.
Create two Level Sequences in the Content Browser:
KrakenIdleSway(~8 seconds): drag the guardian into the sequence, right-click its track → Add Control Rig → pick your rig. Keyframe a gentle S-curve on the tentacle controls at 0s, 4s, and 8s, with the 8s pose matching the 0s pose so the loop is seamless.KrakenTentacleSweep(~4 seconds): same setup, but keyframe the big flourish — tentacles coil back over the first second, then sweep across the frame and settle.
Scrub the timeline. The rig interpolates between your keys exactly the way ease curves interpolated your prop positions in north-jungle — same idea, now applied to bones.
Step 4 — Wrap each sequence in a Cinematic Sequence device
Place two Cinematic Sequence devices near the guardian. On each, set Sequence to the matching Level Sequence, and set Plays For to Everyone — that is what makes the no-argument Play() calls below legal (lesson 15's rule, unchanged).
Step 5 — The Verse conductor
One device runs the guardian's whole performing life. This is the complete, compilable file:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# Conducts the kraken guardian's Control-Rig performances:
# loops the idle sway in-world, fires the tentacle sweep on victory.
kraken_guardian_animator := class(creative_device):
# Cinematic Sequence device wrapping the KrakenIdleSway Level Sequence.
@editable
IdleSway : cinematic_sequence_device = cinematic_sequence_device{}
# Cinematic Sequence device wrapping the KrakenTentacleSweep Level Sequence.
@editable
TentacleSweep : cinematic_sequence_device = cinematic_sequence_device{}
# Fired by the capstone when the final relic is banked.
@editable
VictoryTrigger : trigger_device = trigger_device{}
# true while the sweep owns the guardian, so the idle loop stays quiet.
var SweepPlaying : logic = false
OnBegin<override>()<suspends> : void =
VictoryTrigger.TriggeredEvent.Subscribe(OnVictory)
# StoppedEvent is a listenable(tuple()) -- handlers take NO parameters.
IdleSway.StoppedEvent.Subscribe(OnIdleStopped)
TentacleSweep.StoppedEvent.Subscribe(OnSweepFinished)
# The guardian starts alive: roll the idle sway immediately.
IdleSway.Play()
# Relaunch the idle sway every time it reaches its natural end --
# that is what makes an 8-second sequence loop forever.
OnIdleStopped() : void =
# StoppedEvent fires on EVERY stop, including our own Stop() call
# in OnVictory. The flag keeps the idle from restarting mid-sweep.
if (not SweepPlaying?):
IdleSway.Play()
OnVictory(Agent : ?agent) : void =
set SweepPlaying = true
IdleSway.Stop()
Print("The guardian rises -- tentacle sweep!")
TentacleSweep.Play()
# When the sweep's sequence stops, hand the guardian back to its sway.
OnSweepFinished() : void =
set SweepPlaying = false
IdleSway.Play()
What each piece is doing:
- Two
cinematic_sequence_deviceslots — one per Level Sequence. The Verse type has no idea Control Rig is inside; it just drives the transport. That is the samePlay()/Stop()/StoppedEventtrio you learned in lesson 15, reused verbatim — the summit of the arc is mostly skills you already have, pointed at a rig. - The loop is
StoppedEvent+Play()— a Cinematic Sequence device does not loop by itself from Verse, so we subscribe toStoppedEventand re-roll the idle each time it ends. Seamless because the first and last keyframes match (Step 3). - The
SweepPlayingflag — the one genuinely new trick.StoppedEventfires on every stop: natural end, ourStop(), anything. Without the flag, callingIdleSway.Stop()inOnVictorywould instantly re-triggerOnIdleStopped, which would restart the idle on top of the sweep. The flag makes the stop intentional and the handoff clean. OnVictory(Agent : ?agent)—trigger_device.TriggeredEventis alistenable(?agent), so the handler takes an optional agent (a trigger can fire with no instigator). We don't need the agent; we just need the cue.
Step 6 — Wire it in the editor
- Place the
kraken_guardian_animatordevice in the Athenaeum. - IdleSway → the Cinematic Sequence device holding
KrakenIdleSway. - TentacleSweep → the Cinematic Sequence device holding
KrakenTentacleSweep. - VictoryTrigger → the trigger your relic-banking logic fires when the last pedestal fills (the capstone wires this from its ledger — for testing, just step on it).
Launch a session: the guardian sways on loop. Fire the trigger: the sway halts, the sweep performs, and the sway resumes. That is a living guardian.
Common patterns
Slow-motion finale
The victory cutscene hits harder at half speed. SetPlayRate scales the sequence's playback — set it before Play():
# Inside OnVictory, before TentacleSweep.Play():
OnVictorySlowMo(Agent : ?agent) : void =
set SweepPlaying = true
IdleSway.Stop()
TentacleSweep.SetPlayRate(0.5) # half-speed drama
TentacleSweep.Play()
SetPlaybackFrame(0) is the companion tool: it rewinds a sequence to a specific frame, useful if a sweep can be re-triggered and you want it to always start from the top.
Baked clips for the background cast
Not every creature earns a rig. For background fish that just need a swim cycle, the Animated Mesh device plays a baked animation asset with three calls and zero rigging:
# Background creatures: baked clips, no rig, no Sequencer.
@editable
BackgroundFish : animated_mesh_device = animated_mesh_device{}
StartAmbience() : void =
BackgroundFish.Play() # Pause() and PlayReverse() also available
Rig the star, bake the extras — that is how real productions budget animation, and it is how the Athenaeum should too.
Where this goes next
This device is the guardian's soul, and athenaeum-depths (the zone capstone, next lesson) imports it whole: the capstone's relic ledger fires VictoryTrigger when the final pedestal fills, the tentacle sweep stars in the vault-reveal cutscene alongside the cinematic-sequence-device shot from lesson 17, and the idle sway runs whenever the npc-behavior patrol brain (lesson 19) has the guardian standing watch. You have now climbed the island's entire animation ladder — props, curves, splines, sequences, and finally bones. Every moving thing on this island, you know how to move.