Runtime Module Overview

The runtime module (Texturge) is the plugin’s core subsystem, responsible for compile-time baking, runtime evaluation, and UMG rendering. It compiles animations defined by designers in Blueprints (UTextAnimationBlueprint) into FBakedAnimation baked data, which UTextAnimationStageController evaluates per frame into FGlyphAnimationState, finally drawn to the screen by widgets.

Core Concepts

ConceptDescription
UTextAnimationBlueprintanimation Blueprint asset (UBlueprint subclass), holding the GlyphAnimations list, StageTransitionConfig, and Blueprint variables
UGlyphAnimationglyph animation sequence asset (UMovieSceneSequence subclass) storing 21 channels of keyframe curves
UTextAnimInstanceBlueprint-generated instance holding the bake cache, exposing the BuildDefaultAnimation Blueprint event
FAnimationCompilerpure-function compiler compiling Blueprint + text into FBakedAnimation
FBakedAnimationcomplete bake result containing Intro / Default / Outro FBakedStage stages and dual fingerprints
FBakedStage / FBakedGlyphsingle-stage / single-glyph baked data; FBakedGlyph contains multi-layer FPerLayerCurves
UTextAnimationStageControllerruntime stage controller driving playback, pause, stage transitions, and evaluation of baked data
UTextAnimatortypewriter pipeline engine driving UAnimatedRichTextBlock (rich text multi-entry path)
FGlyphAnimationStatesingle-glyph render state (position/scale/rotation/tint/shadow — 10 fields)
UAnimatedTextBlock / UAnimatedRichTextBlocktwo UMG widgets, going through the controller and animator paths respectively

NOTE

Two runtime paths: the plain text path (UAnimatedTextBlockUTextAnimationStageControllerFBakedAnimation) and the rich text path (UAnimatedRichTextBlockUTextAnimator → render tree + multi-entry baking). The plain text path uses the bake pipeline; the rich text path orchestrates multi-entry playback through the animator at runtime.

Initialization Flow

Manual C++ Driving

// 1. Compile: Blueprint + text → baked animation
FBakedAnimation Baked = FAnimationCompiler::BakeAllStages(AnimationBlueprint, MyDisplayText);

// 2. Create a stage controller and inject the baked data
UTextAnimationStageController* Controller = NewObject<UTextAnimationStageController>(this);
Controller->Initialize(&Baked, AnimationBlueprint);

// 3. Advance per frame (usually driven by widget OnPaint)
Controller->TickAnimation(DeltaTime);

Automatic Widget Flow

UAnimatedTextBlock encapsulates the full flow internally: after setting the TextAnimationBlueprint and ParameterOverrides properties, the widget automatically triggers compilation, creates the controller, and binds delegates in SynchronizeProperties(). Call Play() at runtime to play.

UAnimatedTextBlock propertyTypeDescription
TextAnimationBlueprintUTextAnimationBlueprint*the Blueprint asset driving the animation (single animation only; no RichText tag parsing)
ParameterOverridesUAnimParameterOverrides*instance-level parameter override container (Instanced)
bAutoPlayboolauto-play after initialization
bLoopPlaybackboolloop playback

Playback Control

Both the controller and the widgets provide a unified playback lifecycle:

MethodDescription
Play()starts playing the animation
Pause()pauses time advancement, keeping the current state
Resume()resumes playback from the paused point
Stop()stops and resets
SkipToEnd()immediately displays all glyphs (widget level)
RevealAll()immediately reveals all glyphs (controller level)

UTextAnimationStageController::TickAnimation(float DeltaTime) is driven by the host widget each frame, advancing the stage clock and calling EvaluateAllGlyphs.

Stage System

Animation stages are defined by the EAnimationStage enum (Intro / Default / Outro). The controller maintains CurrentStage and StageTime, advances the clock, and broadcasts OnAnimationComplete when playback finishes.

Cross Fade

UTextAnimationBlueprint::StageTransitionConfig (FStageTransitionConfig) defines stage transition parameters: IntroToDefaultCrossFade, DefaultToOutroCrossFade (default 0.1s), and EasingFunc, participating in the Blueprint fingerprint hash.

Widget Binding

WidgetBase classInternal driverText type
UAnimatedTextBlockUTextBlockUTextAnimationStageControllerplain text
UAnimatedRichTextBlockURichTextBlockUTextAnimatorrich text (tag → animation entry mapping)

Both widgets drive the animation Tick per frame through Slate OnPaint.

TIP

Animation ticking is driven by OnPaint, not an independent Tick function. If the widget is not visible (not painted), the animation does not advance. For background animations, drive TickAnimation manually.

Parameter Overrides

UAnimParameterOverrides provides 6 override maps (FloatOverrides / IntOverrides / BoolOverrides / VectorOverrides / ColorOverrides / Vector2DOverrides) keyed by Blueprint variable name. The widget’s ParameterOverrides property is an Instanced object held independently by each widget instance; at bake time FAnimInstanceCustomizer writes them into the bake temporary instance, and the Blueprint CDO is never modified.

images/runtime-overview.png — Runtime module architecture overview: bake pipeline (blueprint + text → FAnimationCompiler → FBakedAnimation) on the left, runtime evaluation chain (UTextAnimationStageController → FBakedGlyph::Evaluate → FGlyphAnimationState → UAnimatedTextBlock OnPaint rendering) on the right